From 81555bef5b44b18cea808595813e17460c9d149a Mon Sep 17 00:00:00 2001 From: jeffser Date: Sat, 18 May 2024 15:54:14 -0600 Subject: [PATCH] Deleted flatpak-builder folder --- .flatpak-builder/cache/.lock | 0 .flatpak-builder/cache/config | 4 - ...fbda092f79ee9557577238b2a32c74ee7373a.file | Bin 12715 -> 0 bytes ...fc7436aea60fc8823751fe7efbefddee7b2ff.file | Bin 8877 -> 0 bytes ...522f8b8ed52391f37de9e43f1236ecf628c22.file | Bin 45792 -> 0 bytes ...1b827464ac723a43fc799b3037e30fd903ff6.file | 30 - ...85ac79b6744530552207261222b4e34b62e5e.file | Bin 12048 -> 0 bytes ...1a33fc4ee8ab04d8e9808f93cf9da6c891588.file | 626 -- ...605c46ed8fa30ac16a05bf3e102409066911a.file | 78 - ...cb736772af4539e7df752815122383b7a635d.file | Bin 3125 -> 0 bytes ...6ea55ea8d76d314c07a23f818850bd18f406c.file | 101 - ...aee7b1aff2e0ad93b2cb72c269268cfd94.dirtree | Bin 58 -> 0 bytes ...45a49007d4b454f2852d039203a4165f869.commit | Bin 316 -> 0 bytes ...17f1c46f03555c1fb7f72892d7761a03a6a46.file | 135 - ...dc640fee0ac23614f93acc1f6bd94442a3eaa.file | 110 - ...135193017a694875a132ca3f96e96ca883e7d.file | 43 - ...ab1630bc0903d3f6448494b0e9c4e340857c8.file | Bin 24581 -> 0 bytes ...54bd217f17ceecbaff6ffa2bbb27359078f5c.file | 124 - ...6e3192db314b0d731aa060807be9419377372.file | Bin 8733 -> 0 bytes ...eeb6faac86f50c121927dae26c7705aa1efbd.file | Bin 10101 -> 0 bytes ...eebc9adc689229f090b4827ed844c616cf718.file | 112 - ...ead351424e220c057a84941bcc9fe2230b.dirtree | Bin 45 -> 0 bytes ...b97a465a1aa593418c99729dcc8d098e1baa5.file | 2 - ...d2bd86b97bd33caf961a0f9d23c4c819812e5.file | Bin 9759 -> 0 bytes ...282db2c2babde570a997c24a2afacd1da429a.file | Bin 2114 -> 0 bytes ...263367b202ee3b7ab0c53461d6c79c25d669b.file | Bin 10508 -> 0 bytes ...40d7caa70fde0f03bd6756a3bd860256a5704.file | 61 - ...58cfbd2625222b4dbdaeba6a7f1da39721.dirtree | Bin 228 -> 0 bytes ...d550916255571fa1877359d18c55fda93f48d.file | Bin 172626 -> 0 bytes ...51c95f6f57b3b1cfe2fbb165bf043a289c7a4.file | 5 - ...fef5874053876f0bf449bf4480ab856e9766d.file | 6 - ...2b0497f60b72c3a2f6f426eadc7ca82a97c02.file | 272 - ...e6bbc3d0b88023581ce364a6dc95c2c24c.dirtree | Bin 118 -> 0 bytes ...64f36683565cf73cec3aa5990d4880eb9b0c3.file | 104 - ...99066b45e3b584eeea10172caff2dff4655ea.file | Bin 321 -> 0 bytes ...e7e5f9e371d00e5ebb80dbfa39b44a1da2282.file | 159 - ...161ef72b5f73418e154ba277d4d55d343b.dirtree | Bin 117 -> 0 bytes ...275528c1277d63a5a4cb02e75593cd8ae39c3.file | 148 - ...39d84f30b910db45affff8ea2e33e55d351b7.file | Bin 41393 -> 0 bytes ...e9b2ba72526681d0ad1166c176c76c1baad0b.file | 1252 --- ...230e70e3e7d9ed3a93df75e2d6a3549855f3e.file | Bin 342 -> 0 bytes ...c357e37259e0004094be53e9a575ca3198e2a.file | Bin 2069 -> 0 bytes ...67c7c9fee87c6c961ae71113dd00545211de3.file | Bin 207 -> 0 bytes ...b66c7fdb3b68e8f6cf8b153072607e82247e6.file | Bin 2780 -> 0 bytes ...99d7258e415ba16828c88b789225e573fc.dirtree | Bin 67 -> 0 bytes ...5e34c1745d4063cb94d9d73402b33fea67.dirtree | Bin 577 -> 0 bytes ...1549f93f75ef28772202747037e27789de.dirtree | Bin 641 -> 0 bytes ...98d6843e94980e8402856a023fc591dbf77f3.file | 483 - ...353ea3c8a3ffe3e78f915c6eb3c5002fa3f9d.file | Bin 17822 -> 0 bytes ...9d3930028b423c7b0a8ec30cf455575573c34.file | Bin 30995 -> 0 bytes ...5d4bb7c4854b8b6cd103d713369cb0af791e6.file | 107 - ...8b8256d96ffec83836f2345b7faf9bae0535a.file | Bin 40832 -> 0 bytes ...e4f168b790b104d7983ffd4fc96b7cf3f7.dirtree | Bin 76 -> 0 bytes ...40c8ca9cde958c5810ee626c2d337eb69ce20.file | 339 - ...01294481a7001bca1439221e7d6f3efaf29da.file | Bin 22840 -> 0 bytes ...c03c97ae89f66a6eaddb3740b546e81a9f.dirtree | Bin 911 -> 0 bytes ...9b9b342f3f2dc9f179812e37fb61ceef58891.file | 211 - ...a9b1d77b6979256079e95cd2bc65f7b03aca2.file | Bin 41424 -> 0 bytes ...a2ef58f49a6909d1da9315009f07cfccd9004.file | Bin 6186 -> 0 bytes ...a8ebaa53d5c1cb146c499c03146c41aa509a5.file | 580 -- ...1ec0a1256c169c1e5140f6f9eb7549d921107.file | Bin 17720 -> 0 bytes ...761f2f2ec28aa11d79a512dd41f5f0d90a7ff.file | 381 - ...775d18798ac9fe43915f1aaf98693452ef.dirtree | Bin 58 -> 0 bytes ...f923d2158b17375c96120779c8955b728a69e.file | Bin 43749 -> 0 bytes ...f3a67fe5aee0e0875e23edd1317618f44868d.file | Bin 246 -> 0 bytes ...09ce913ca7fcded3f65fa2e4d22eee1891.dirtree | Bin 589 -> 0 bytes ...33c029c9b5ea899b10c84671e10939b27b.dirtree | Bin 911 -> 0 bytes ...db78c1567a6ed14b13ce78adcfefc1ba0c.dirtree | Bin 233 -> 0 bytes ...7c10335a0878fb8bcdc782b887e710b9bac98.file | Bin 2960 -> 0 bytes ...f5d99fdfe96fe4f351f42f5e8b445b9319e7c.file | 565 -- ...c4500de87a4533b0a2090cb1c535560586.dirtree | Bin 110 -> 0 bytes ...f1d0f1108b20554e92f5973dc888fefe104f0.file | 418 - ...6299e4b7bd497badecb763a962cb05e365a4c.file | Bin 11900 -> 0 bytes ...cb67e2a52b8282ebc2a95a66186f4261b84d9.file | 200 - ...bef51490af6a3dab5199aed21b7c6800cd62e.file | Bin 18773 -> 0 bytes ...71f19f54945b0108bcca9e1a1d57eb84bdfd7.file | Bin 40208 -> 0 bytes ...73892d7501ad46a19616614154f7beb579b23.file | Bin 41848 -> 0 bytes ...9f6fac5220908bc227fd61bbc8d12e6aeced2.file | Bin 7908 -> 0 bytes ...6108119f908e3dd7076ef2129a24bfc9bb7a4.file | Bin 1261 -> 0 bytes ...f0a7b7f0b0dbc9e8e7b74b010978cffc49ef8.file | Bin 12215 -> 0 bytes ...49d16a41e04a3d79e434a91a33c0dac59d256.file | Bin 1203 -> 0 bytes ...3110e5b42b9f7766df01cc039d3c30e6ae2c2.file | Bin 3801 -> 0 bytes ...afa4f22c5871f78e0153f40ce2ed06964baca.file | Bin 12508 -> 0 bytes ...6547d07d0573a1b4ce38990a0d26cca98c.dirtree | Bin 74 -> 0 bytes ...79da1ea58efaefbdbe97ffcee8b10d61010b2.file | Bin 1450 -> 0 bytes ...baedac39819d424d7ff96290b390d4cfdd3d5.file | 284 - ...7963de0f558e4fa845db6e738137019baf341.file | Bin 5116 -> 0 bytes ...a76572c7139902e60d1d0d0770050a418b08f.file | Bin 7271 -> 0 bytes ...8163487b655c777d4064c294f2359a9a0fefc.file | 74 - ...f144a7c85c425b8fdccf13e635ff68c2f92b1.file | 5 - ...ed94ee43f25d68d1e49e3e4a7d65189702.dirtree | Bin 73 -> 0 bytes ...650a1cec90fd8b125f56a095811af9ba9a86c.file | Bin 6250 -> 0 bytes ...952e6beef10985ccd689f6b664ef6b626fd.commit | Bin 724 -> 0 bytes ...f8595b032a7f9f525ad88cd36512344ca0830.file | 5 - ...84d9f991119c84e58d828bf9f9742d2137987.file | 74 - ...0243f7d17ab73e287b27dbfbc309f8a1ead93.file | 303 - ...27b5a326ccae883a9d990c4749b682a605351.file | 5 - ...f3aa43104f1fd9036095e9b8bfad151d77.dirtree | Bin 376 -> 0 bytes ...7abef0ea822778f581cdaa6a42b5de0d8688e.file | Bin 10587 -> 0 bytes ...7a3f1527f006db8669283e24fb38205c0be4f.file | 1 - ...5148c6ccfc0d3429a0996ae3e2a7b5e8fd.dirtree | Bin 683 -> 0 bytes ...cfc1e6f7415a3da1fde410a7f98e38f36e5c9.file | 153 - ...2c9b294ff789e85ecdaf8c83cc4960daeacfe.file | Bin 2317 -> 0 bytes ...68cd8d8568e950b9e13d1fe48d367e6b93344.file | 1186 --- ...ca0c55204d0fecd3d3dc1c509404df7867.dirtree | Bin 233 -> 0 bytes ...6128d7b40c1c1899e68f096c0987cb3a0d496.file | 134 - ...dfcb2e4489586de98a54fba30392faabee297.file | 1 - ...d2f95dfff72cbf2a25789af1aa5f5975d9.dirtree | Bin 295 -> 0 bytes ...2b33b526c21e3995b09fb4c8e28fb32fd4592.file | 134 - ...e553cf2b965ab8f5ef6ddb41b524a8a5cd182.file | Bin 32304 -> 0 bytes ...a6f0e50f23f371451d5fc77b886dc64bf5aa6.file | 129 - ...1786ed98aacd686c785107996945b33f25214.file | 615 -- ...7018bf513743e41b48b5e9c9721ab056bc02b.file | 46 - ...17b64d5c645ae4a9a299453063a1b88b5c19d.file | Bin 14656 -> 0 bytes ...06b845f707aff457bf771e8665916c2db63dc.file | 21 - ...9405bdbf97fa356ce8a5c18a1023b7bf3e181.file | 16 - ...a42d0c6e91f2a6b51f27056b6019afb899043.file | Bin 2068 -> 0 bytes ...ccf3494680b21dde8712b702887f0f1f7b.dirtree | Bin 810 -> 0 bytes ...f69e34c1ca4ca3d7f6ffa49634e94b1fcefdf.file | 797 -- ...21a5c4909b41b6a40c3e8e84df60a80c58.dirtree | Bin 73 -> 0 bytes ...660acad16156f7b3226571c75ac8ce432bcb6.file | Bin 693 -> 0 bytes ...8a5afbe049275d1348ae1a8926eb8b23ea5d2.file | 1243 --- ...6c7167e5c233afc42cccd155336d5ab07974b.file | Bin 550 -> 0 bytes ...19e9396f1bb7e3fd240dfce075d822f10c11c.file | 180 - ...affbf690cf1c030ca627fe8147b319a6e6.dirtree | Bin 152 -> 0 bytes ...76edd53884529d19a88f423fa117b15ea0fe7.file | 186 - ...510fd42eaf7637821afd050863d5d2400eae4.file | Bin 972 -> 0 bytes ...38edab5d8b9c90b8df70f7e236c51787dda9d.file | 75 - ...36556062db1fb549ff2da1d98446a78b1c.dirtree | Bin 146 -> 0 bytes ...b6b4aa08e29817304678f2471107674683797.file | 102 - ...d28b623b0221f1d65d723e0aff056c3383777.file | Bin 1298 -> 0 bytes ...40bfc02c1e7b251b135ee160168bec36d29a2.file | Bin 6226 -> 0 bytes ...ed03e04b7f5331cdf7e4da5e9352f924a00c4.file | 122 - ...a0e59e587caae6c5ff4a75b03ca6d16a0571f.file | 43 - ...09271302f1292f20a9e346cf66899db8bb275.file | 395 - ...860959f5abbc958ab6a4d1580b03e5d0cd350.file | Bin 12750 -> 0 bytes ...ac4c72c223403fe157b2f825686a31f2f573e.file | 1 - ...eeb675faa412d5ec73f62988eb0b6c5488.dirmeta | Bin 12 -> 0 bytes ...24ce8674f724c193c5409b44c27ad30bd3ef9.file | Bin 8112 -> 0 bytes ...961e6cef36473ccbd18d6cd463e90d6993b0c.file | 230 - ...ca521ec0bad68286150de6f947397413beed5.file | 33 - ...81e1187d36bcd6248ef7022860d2c3d9ec04b.file | 4 - ...b26f65cf44abd91b99964a7d0c92e387d9604.file | 255 - ...8d40f38f6c80f4907f8ec7356756ad3d0640e.file | Bin 5109 -> 0 bytes ...58b61f2ba7e0396ac9be43033faf455961896.file | Bin 1061 -> 0 bytes ...89ad4d192ed15967377eac3659eca28831.dirtree | Bin 76 -> 0 bytes ...75630cbdb4c442e5a1d55660ec49adbea64ec.file | 75 - ...13b696e70a23364a391933f2221ce45d480c5.file | Bin 6634 -> 0 bytes ...366f3dc748edd1592490c6e326c363623ce99.file | Bin 18863 -> 0 bytes ...45cf93b0dfe078d454c9da9197aa9f4df37fa.file | 137 - ...4b8d5026e2e5316296f6578d8f04805b4ed60.file | 4 - ...53fab2bcf1e944c2c8f6cfaeab18a96dd5e13.file | Bin 228 -> 0 bytes ...983b893624e2873236dc58a188ed9e615bd20.file | Bin 281 -> 0 bytes ...df31ca4a6e50475c37628feeb040a9eb39560.file | 89 - ...69afad2ddedf51c69ae0cb2f2f630669a1f56.file | 175 - ...2f6b7492734664471011677188e49de621134.file | 1008 -- ...b252d03baa8cacf5c930d54d2a19584fe9282.file | 50 - ...98eeb26fe5dc09b8c9bb3516d3438e2450ebe.file | Bin 15364 -> 0 bytes ...51ccc7f8ccc7eca4916b433e5090b6dc0e4d4.file | 214 - ...3380e5b005b9c29d0ef5f488a2af1e778bbde.file | Bin 3860 -> 0 bytes ...dfb3226823d44d90b7827bece5332d5878.dirtree | Bin 306 -> 0 bytes ...3c256990911506ec356eaca43e7b2133e1.dirtree | Bin 126 -> 0 bytes ...8e6ea221edb509ea88fa8af0b5ac94a993348.file | Bin 99761 -> 0 bytes ...76641d6bb6c5d31deb026aa121bb19ec27a3d.file | Bin 5314 -> 0 bytes ...be74761fa71b5af2ca951188021bf7689d093.file | Bin 606312 -> 0 bytes ...2c8e16c18e449d0d6e3e27460fa92318b7.dirtree | Bin 918 -> 0 bytes ...0a0d67a453ee06d6e378272f5d3a6ecfb17f9.file | Bin 7467 -> 0 bytes ...4e0b46c656ff31cc17087ec5481ee3d292.dirtree | Bin 38 -> 0 bytes ...eb2e3f5a9227402a2014f6d361e6e5194622c.file | 44 - ...5b01e1d6272c82273c1016c6893b0c86a9e82.file | 5 - ...fbaebe286c91a33be5584f660747b87e969dc.file | 371 - ...25353fba977f6db595dc1fe938c2149743e24.file | Bin 2684 -> 0 bytes ...899ee7bd4eb144da7988931c3e92befc1c620.file | 256 - ...19f9a4ee911e95e586e3b6897687530139e5f.file | 1 - ...ccb9e775445cd0fc010553738b074268911b4.file | 1 - ...0b5444b3d5378bda02435849c7e684e1032c2.file | 1 - ...745148c9fe5bb1e0b6cf56973d5700202a612.file | 80 - ...c77706a8733e897522b79fa64cb488406d9d0.file | Bin 978 -> 0 bytes ...b9d0e73499cf47887fdee5b49a19bee0a80c1.file | Bin 11963 -> 0 bytes ...4c9533e1308e9768cbf3b735dd24723a9b.dirtree | Bin 76 -> 0 bytes ...21f65f43b607ba1e73f893d67e8d6fcd812a9.file | 141 - ...c1904260cf522fed3e552832ee87368af3939.file | Bin 2407 -> 0 bytes ...ecd853ac5be1ee2a0dae6d8a95df6f2fc14d8.file | 145 - ...8c7084bcf3fc15e5f4a6776d18424ae0d69a4.file | Bin 7125 -> 0 bytes ...ea0133342bddcecf5ded42b5d51885b4b114e.file | Bin 3608 -> 0 bytes ...d15e90ddd640d47aa9203f61efa640572c1a6.file | 133 - ...ab3461093734a1fa5312da431fbe9f96ad537.file | 81 - ...91542024bac351156e0d5dcd58d999c6b3abd.file | 22 - ...68465577fb5f04194166ac5319f2adb7a7.dirtree | Bin 79 -> 0 bytes ...5e497f0479f22e8ac1567fd8ba68c0399aa7c.file | Bin 8748 -> 0 bytes ...c264df2e0d4a2fd8fc1634c77367e8d4a75b4.file | 28 - ...d8e2afbe4a1ab82c11b70d4b0732ac54d8.dirtree | Bin 243 -> 0 bytes ...bbdb308234b41fb5d89a70a120c55cbac0.dirtree | Bin 303 -> 0 bytes ...bcd6816cf0c79b3305176e89634ece822f590.file | 141 - ...5f11ee8de0024af76a873e9689c7253774b2c.file | Bin 11459 -> 0 bytes ...ce7cbd7828a9dda22b0c0327e16748077fa58.file | 4245 -------- ...a3961c6394371afd9620fa78b468d0adb7a0c.file | Bin 17345 -> 0 bytes ...c93421274370b9ed47965c5142ddaaa89d3b5.file | 340 - ...4ba8b61cbad9f8b903101671a0144c58217d7.file | Bin 21045 -> 0 bytes ...410b1ec3c4402b62553d6b695605aef119076.file | Bin 31121 -> 0 bytes ...4045c815cdc2c05a1f52caa2b133cf20a7d87.file | 341 - ...4e68b44f83beaa11d877e46c81bd9f7687.dirtree | Bin 82 -> 0 bytes ...06ec67dcc07990710608c854a4d0a11ea1ef1.file | 2 - ...8776638829e0886432d665c1f724d452c9fa0.file | 321 - ...22641df95d439ab495f789f09574827a3fb6c.file | 7 - ...a7dbe5ec994bac18cecd7869c08849c94e4db.file | Bin 13447 -> 0 bytes ...1df8215107c335223d8a8602af370e9c5044b.file | Bin 5608 -> 0 bytes ...0047c110862ebde62f10243d99aac77d70.dirtree | Bin 214 -> 0 bytes ...c1a95697ed5f92ab90a4410f8be143325c.dirtree | Bin 71 -> 0 bytes ...ad9a44b75ca3554f0e5ae0b333f1895bd1212.file | 3983 -------- ...0238f99543d5c848af56253c535dc9a75f66c.file | 172 - ...0fdcd4098971458c051dcae4e1f57d19492b8.file | 99 - ...7976594d15e7a599308136a8580bae81c3492.file | Bin 170 -> 0 bytes ...824f90c96b7a01aeff868305aa2630226ca83.file | 1 - ...2f666ea603a54d91d5f1cf20727e0d7b90abf.file | 6 - ...170e6fddccaba65204c84c3f8065bd778e39e.file | Bin 27360 -> 0 bytes ...d58738cd77cce6574ee580b3ba87e1620d.dirtree | Bin 300 -> 0 bytes ...f549cb09c0603e063636520b484cdbbacd85a.file | 317 - ...279fe5a45967dbb82ee5c44a86a84a05ad9a1.file | Bin 25062 -> 0 bytes ...ce756be403dc60eeb05b6efb4148fda92d77e.file | 57 - ...e8fab33e50fe8c9ffbabbc7465ff45594e26b.file | 124 - ...e5b0e380149386d286d936a631b3eeaa3be50.file | 230 - ...257b0cbcd66639f657548af0cea70019a2945.file | 263 - ...d34d25915adff1b138714bb770c23722e1f.commit | Bin 2108 -> 0 bytes ...1eb4456fbd05fb25daad5bb97adf596c15d9d.file | 71 - ...ad96f46ac71332ae5343c2ea01f3b92f14572.file | Bin 3734 -> 0 bytes ...f4f9c76f695c0ea39b8d5c3e8ffe4c19679fe.file | Bin 7203 -> 0 bytes ...d43c01e3b295a36b80a4cb431efa314b0bf53.file | 229 - ...996c7284ae8af8b533bf5e8ef07fb62ae95ea.file | 98 - ...21b1816abe431507451dcc2ab02d41c6b8cac.file | Bin 23422 -> 0 bytes ...55655f38f1aceba39f69fe0d399f189b6f225.file | Bin 8119 -> 0 bytes ...205f135c4a5c8035a4aee93ce88c3ba487fc1.file | 1 - ...9ffa60523f105dc58fe4a9261ec8746eaa840.file | Bin 38664 -> 0 bytes ...feda3b37d951e51c09f08cfb1c21ecce70597.file | 22 - ...dca11b6a1da8ef41d7df267bf163795a64.dirtree | Bin 172 -> 0 bytes ...6538e8ba889efb8ccba4f0a8acdacb698f836.file | Bin 26029 -> 0 bytes ...2c78901d3fb33738768511a30617afa01d.dirtree | Bin 1 -> 0 bytes ...a9395ee7cb3c71dea0d5642416d47839b36f6.file | 66 - ...d38260d94d8ffacb6f72686eaaf2ec98db.dirtree | Bin 311 -> 0 bytes ...d8d600a90f92595bc60bffa2826e46342fb3c.file | 4814 --------- ...a32154278da8a5dcdeb95cbae3e7466481f5b.file | 509 - ...373e1dbb9767d7b10f9d2396a5e2c1765970f.file | Bin 3686 -> 0 bytes ...06945574f54f15d7edd035341bf74111098d4.file | 33 - ...229aecb37de00579714894dfa8e57cd316805.file | 553 -- ...767a30cc9116194663618fec5fb2ce046d.dirtree | Bin 119 -> 0 bytes ...b286cae69fd6f49531a97258870ae71b3b.dirtree | Bin 479 -> 0 bytes ...988b9fe1132fc8123d85d58e9221754a63ad1.file | 3 - ...20eb5abc46eae7456a4a5de351564b7c6f2d1.file | Bin 769 -> 0 bytes ...b100554b51c282c2288930275aec9f998f.dirtree | Bin 111 -> 0 bytes ...ff4c6c283d8c2dcf47b895ffc3da74b4ed.dirtree | Bin 537 -> 0 bytes ...dddd8a13fea2b471cc05efabeb2b9efe482e8.file | 4 - ...56df83db3bb9df9d9749e1efe8fc455822.dirtree | Bin 71 -> 0 bytes ...9a93af506d77b20cd0c2bbbbba7399a34eea9.file | 395 - ...39f2b98bb7bceb5befe8a0d9a0d1e0cb34c2b.file | 20 - ...5edd4e9d73655fe5e49ada73e16a1555c64f9.file | Bin 23512 -> 0 bytes ...d9e9588f454fdc8a2adfcc78cd183bd65d.dirtree | Bin 58 -> 0 bytes ...e44c00e4e66bbc16021ad471805ee80bd0449.file | 31 - ...0d5bf71fcefb46ad53a3227e9d50fe7c73.dirtree | Bin 174 -> 0 bytes ...91eca3e34bc58c24530988dfd7ca9df457199.file | Bin 14594 -> 0 bytes ...6573d06affb09d5a727b44b03b77812036aa5.file | Bin 11847 -> 0 bytes ...a9227eff4e50160d7d8539966cbfdd5384d14.file | 683 -- ...0dd6a739c8a6dee2b0fff239c14fc025a6f70.file | 279 - ...12b76918b5b4a148c89da148ae9ff87129bc9.file | Bin 2683 -> 0 bytes ...bef36c600617bee1dff8e46876bb3ad2d9991.file | 307 - ...b6bd8d4971051c20cde0cc70c54b77941d78d.file | Bin 8476 -> 0 bytes ...9746b535b8a437d1dbd7842a7df672c27e533.file | 17 - ...a7408dddf513a0db4244cf3f22e1d787a0f9e.file | Bin 309 -> 0 bytes ...ee7c94b4c830a9ab0e6e7b5b835dd96a57c7c.file | 868 -- ...7512fb371501124ae189f6d7bf21fe334a.dirtree | Bin 58 -> 0 bytes ...6c44d183bf25fc8c2b62a365b0ac0dd417b47.file | Bin 1903 -> 0 bytes ...4ed0d38fd4a3b416ec42866272735422bbb0f.file | 4 - ...63aebcdf8b45a4f4c1ac0e9088c30da7b6c74.file | 1094 --- ...c10344d4854bbf8a9da1731ded0979e6170d9.file | 358 - ...d1faf4437564ef781f5948d59dd5d5a97530c.file | 69 - ...f87062e15f679b8db95194288f8172dd9f022.file | 529 - ...dd2d985848dbaea9fb1a63b73a6e99317e994.file | Bin 1214 -> 0 bytes ...9b688cd9f7cb280675f5be84cfc81d3b9db39.file | Bin 29657 -> 0 bytes ...d692714c70683637763c7b19b868965d728c1.file | Bin 6230 -> 0 bytes ...361d02e8083456e0c6b7ec70d07533d503aee.file | Bin 16169 -> 0 bytes ...f3a1c817f3b507cd3c768611fcc23dfb60.dirtree | Bin 181 -> 0 bytes ...cb2e878509e917c47bf980864aa7577d646.commit | Bin 2180 -> 0 bytes ...be17ea45140265458e6b82c317d5b756bb640.file | 176 - ...c6a84325c46421d607f8c9f2ffa9ed6839017.file | 276 - ...939a7bd015aad96b360f55b7acda944b521d0.file | 930 -- ...b78e89323f6d337185d89cb8ac8965a443a46.file | 128 - ...b9a452bd1fc51d3a76fed5634ab90ce253bd2.file | Bin 14838 -> 0 bytes ...98212925caa9adc9089c47abe97cd3b4c6e9c.file | Bin 3932 -> 0 bytes ...7dff39e85c78f91bae9e2c2a3574ac60a0d01.file | 184 - ...4aaaa9aa696018269184d8dc5ee7537d4c06f.file | 315 - ...b7419dfd424b04778a982453fc4165785a0b6.file | 538 -- ...45e29cfa8b339f8177eec0e65029c8c8ad050.file | Bin 2742 -> 0 bytes ...36d7615266833ea4e8ba5bb387f801915b345.file | Bin 14607 -> 0 bytes ...2d757806a98bb7a8a81153c0838589badd077.file | 1102 --- ...83ebbeca417aedd7ef412ae0ee3fb9d7f5.dirtree | Bin 143 -> 0 bytes ...3f8e97c0f361ccc4598c9975c209d806a52a9.file | Bin 12996 -> 0 bytes ...75d31d8d5388ca6621f3511be81ef27a9d3dc.file | Bin 1823 -> 0 bytes ...1e1ee2cf3b85a4a99e1b881904b562d1d9f48.file | Bin 17363 -> 0 bytes ...67580a25b37e4e71b09634c1b7c5a48b2b319.file | Bin 3896 -> 0 bytes ...225deece6acb852d3f7284f5292b6849a8743.file | 52 - ...38f9427e206bfcd4855c475483ffea30e014b.file | Bin 3067 -> 0 bytes ...5749742117f963a3f334ada6f7fd1db26b591.file | 4 - ...f501c748a8b6b12c425cf77abb21a7cf5d875.file | Bin 5324 -> 0 bytes ...a53bf8ee8cdc0bfaeb74c5b5d867dd127c0d8.file | 5 - ...a2f4223f784c755d7e42c8a189741e8919.dirtree | Bin 233 -> 0 bytes ...495357a4d6c36feec5e730b2b6ea7638b7.dirtree | Bin 862 -> 0 bytes ...0d0f7700968557234c7c2c6f6162c0d959c70.file | 114 - ...94d5c774c96259e62b27f814b390106dd247d.file | Bin 2841 -> 0 bytes ...793b819a3f555060389006f2c14484cb6beaa.file | 311 - ...2728fdd9a9b48b51181935db3219abbbaee26.file | 8 - ...7b8cb5020c8a406a08e0b39787d388c91a7.commit | Bin 524 -> 0 bytes ...9ab47422230447e328cd1924030f7c7f23297.file | Bin 28143 -> 0 bytes ...6dc6b1f45ba98271e547d261d186d5f066888.file | 2 - ...f0543c72f676dfe11f8ee1c136ebf287d3cab.file | Bin 6138 -> 0 bytes ...bd45c81033fe43ece6b805a32c045c9d4e9ad.file | 8598 ----------------- ...2bb3f0ba9e1ae89571cd4561bf8a1b01e5fe1.file | 4 - ...c649877ff204b75b4ccf00f750fa39f697160.file | Bin 33488 -> 0 bytes ...34bb0f0cd8008e0db056510fb9f46fda05cbc.file | 548 -- ...a26cc5405a82527219ad7ee5ba81d3ccf902b.file | Bin 684 -> 0 bytes ...adbf719d21c63badeb5c005a94b3e2f4f3b6c.file | Bin 101507 -> 0 bytes ...ff0e104c82896412349001e77e7957cddedf9.file | Bin 34745 -> 0 bytes ...3814a041b5879b563dd06635c726f0da357be.file | 46 - ...17c05a0aede813712859bc5cc45f9fd8a8.dirtree | Bin 280 -> 0 bytes ...5a0e02dd3a8bb55f73f26eb6a15b3440c50aa.file | Bin 2151 -> 0 bytes ...7c8cce4e7886e82c3b3f31f93ad8128178921.file | Bin 4478 -> 0 bytes ...a25569e5bb5e7a91bb74021dbae462c96f.dirtree | Bin 233 -> 0 bytes ...ec9554d936475767cedc038339bb8c20f4149.file | Bin 42204 -> 0 bytes ...614bee3bd6c526e1ad2d9c2508c35f9f72d06.file | Bin 7110 -> 0 bytes ...58d40f4af0ef4181ce51b35c36ac7c7e53012.file | Bin 10750 -> 0 bytes ...7e1c7daad67df8ac9e147e59b31577c0b08a6.file | 5 - ...859b61f3e5694428f3de770622a8d378cec2d.file | Bin 14749 -> 0 bytes ...c3f12bc3e1caee8e05e3f6fd02dc82c9d3.dirtree | Bin 245 -> 0 bytes ...aa0c458aab36d8e98a043ca4fddc9ed72b12f.file | 23 - ...25c35c12a23c3b5cbb0c87326d03c261de19e.file | Bin 53561 -> 0 bytes ...0b3287a0102f47b8f857735290a347109c7ac.file | Bin 2079 -> 0 bytes ...4806182c99e095b8fb13f0d4d76db1cc3f.dirtree | Bin 72 -> 0 bytes ...c7efca1deab8befba1ded2840f2c7c698b.dirtree | Bin 76 -> 0 bytes ...445946511b4f2ce54ec2a857e593b2b712ec6.file | 280 - ...e0c30ea7eefb56e9363490e563be60b7d3a48.file | Bin 315 -> 0 bytes ...20f83452683e15ef5a0c535a473011e39e.dirtree | Bin 87 -> 0 bytes ...450162953f323def0a4daa9ae0165eaeb8ced.file | Bin 43685 -> 0 bytes ...79d761b48884c5a8c2f3f3249c938f4a52bc8.file | 205 - ...ed5471b360ac6bac536a6cd950a1f47ed3999.file | 296 - ...76aa06fea7bd60feba29b0cf53376920273a7.file | 8 - ...37dcfedc68a895425cb39c145fa68d2d51ea0.file | 74 - ...c9868e788e19667e7b9cd45d8ade1dc7b11f6.file | 263 - ...c8ac0a6aa0743968626906d3b9a04f54161fb.file | 403 - ...76b31ee50c1bc6e98010cd71acd3bc8ef97a0.file | Bin 402 -> 0 bytes ...ba820e08a26ca103b86a642c4915b93575977.file | 42 - ...005a67821ec30e213c4d3e63b6ea260a13.dirtree | Bin 216 -> 0 bytes ...8b71abd2aed8e149c72cae1855c54133d4a83.file | 275 - ...96aa48c25c7a309bb106306406c38fe414.dirtree | Bin 79 -> 0 bytes ...439972ca2434265a78bd0b2810ea566a83e32.file | 86 - ...a0e5120817e8f8fb22da97ed9d07f44e6bd6a.file | 724 -- ...f87df1f191db000881a77a8447710b5fb4f7d.file | 103 - ...ea4c50ef51b207849e25594fdb62df28d4a33.file | 115 - ...cb5fdebeb5269dc4d19dc5ae603cd6c121458.file | Bin 5753 -> 0 bytes ...7f404a9c05a20a54a5b8c1d34e1440ef3268c.file | 471 - ...86932a5943285b4a96cb0007e00a8cbc4b866.file | Bin 6201 -> 0 bytes ...a50fec7926eff8523de4608663767f56e057d.file | 365 - ...fa15502bfcf8c6df54302e6874cda3dd71e71.file | 174 - ...f4714cfb59d8f96c596aa3f2635c28e1844f1.file | 237 - ...d40221e1bcc561c3c802cc93d1c593b01ccfa.file | Bin 2085 -> 0 bytes ...e30b202ee6ec8b1a0e8ea48a2782276325eb5.file | 31 - ...9a8da2ff7b229ffaab9d8ca7c7ea78dcb9440.file | Bin 14616 -> 0 bytes ...24991365dbec54294ff89558b3e7e9ea0a0f5.file | Bin 8424 -> 0 bytes ...147984b565aa95a5285ee8ebf74c85f6af.dirtree | Bin 355 -> 0 bytes ...cc3ba0b557a4b1a73a15a9739ebc2c99ef93a.file | Bin 16967 -> 0 bytes ...8dc2c85e76e3dafead71e67f5d0ce67837235.file | 21 - ...08bffc0a1333ef6cf6cb9dc29f60bb8e918dc.file | Bin 2503 -> 0 bytes ...6c6efa0b09621503bd525d384196085753803.file | Bin 23106 -> 0 bytes ...a77b649ec538dddcb2772711c02a041f68.dirtree | Bin 47 -> 0 bytes ...dad2c00af2915cfb58bfe9b05362a9493485c.file | Bin 15453 -> 0 bytes ...df6d3a8e8cde4430af62d4c2da9328c484def.file | Bin 12719 -> 0 bytes ...c2b88d3141c6180875a3ab4fcd0a504267991.file | 86 - ...401a72933eafc6a3f62f8236adcf6cddb1ca2.file | 33 - ...16c1b034c4e21b10b033c8ce2011a054e7f4f.file | Bin 61601 -> 0 bytes ...88978ca02aab584cd97b23e9ee96a965aedc8.file | 474 - ...6e4da6fd3b91d11cd88b0dc78362f43e554b3.file | 42 - ...69ac410974f0025d47b7b3b5dca10b8c05c51.file | Bin 304 -> 0 bytes ...87bae9f6ab0fc498af3cb9c3a9f9a6f66fe39.file | Bin 54815 -> 0 bytes ...3158b339bc1d3fd62d5dc189a1a7227871a1c.file | 357 - ...197b9aa9fef4f295d1a8ec28f7a77c37da788.file | Bin 6264 -> 0 bytes ...98169ad1fd7f84b8c6cc4ec1c466d654917.commit | Bin 420 -> 0 bytes ...b3047f0f3beac013bb9638fcb95820fbbbe1b.file | 243 - ...d7f558fafbaedc0713633f402729139d6abf1.file | Bin 7645 -> 0 bytes ...d9b8b2f46542f706d7d443b5dae002c69922a.file | 4 - ...f1a79e83ba21d762976bb76bedd14bac46b6a.file | 318 - ...87a35b1b015c3fe70260a5c2d6f4dd1a091f3.file | 347 - ...2bfbf1b0da2ecc89ee862dacb6677087c1b44.file | Bin 17853 -> 0 bytes ...4ce7bece98d9a4946cd09791b858aaa4f1510.file | 14 - ...35f68032105f280e0b77da3e85f3d0dfed31e.file | Bin 2654 -> 0 bytes ...b9cde48ddcea9f7e021163cfce2951b4d7931.file | Bin 13218 -> 0 bytes ...8c6cb2e9a3e4c65609c90c206165acdca4abc.file | Bin 3335 -> 0 bytes ...84bb521de605d836a3662b2d4efe560052741.file | Bin 5748 -> 0 bytes ...f141dcb7079f7d57f6b136c8849a2f247a.dirtree | Bin 411 -> 0 bytes ...6feeed36898d600e500317fd5f61b667774dd.file | Bin 20316 -> 0 bytes ...20b032bf2789cc669feeaa65dad490a6f7163.file | 1 - ...8dc0d0e5ff5047d722b50bd5c7e81ab704d84.file | Bin 181 -> 0 bytes ...ccc42b665a6a32610397ff3d060dee14327a1.file | Bin 3722 -> 0 bytes ...c2c52a34f11e9deb9a0d5fb5b00b03afa2.dirtree | Bin 216 -> 0 bytes ...86adf45962d51a9e91f565c2929f4920257d8.file | 572 -- ...a7478af597a74c359e5462ee15be302ae3.dirtree | Bin 5864 -> 0 bytes ...e92c33f4c73f38438be47a6fe3ca20bb672e4.file | 1 - ...ecdb717c22309501ff6ab0a05ef7be6e0427e.file | Bin 2889 -> 0 bytes ...b1a4a69bb5f24846d3f99789e337a3209c4a3.file | Bin 4386 -> 0 bytes ...8e4b3276811ee77a14544059e07c6f127bd63.file | Bin 20393 -> 0 bytes ...b0a65cc9bd4d3399bff0d0a28be4f0cf1235b.file | 96 - ...22b86d134e066f3952424e21f75d80e1b5.dirtree | Bin 58 -> 0 bytes ...95ac07fc516cca04766b930d60cf853604a3f.file | 72 - ...a1734ce56e8896c7cf5b06875530bde4f78d9.file | 476 - ...24ab878c24ca437d0c2b71261b0d5a8ceb58f.file | 561 -- ...81fd77db03599daba616e4eaa7c800c35d.dirtree | Bin 614 -> 0 bytes ...e0a2326b9617b0ac500029ed06e17207ce177.file | Bin 1628 -> 0 bytes ...542dd1d8714a9bb87d0d65cfcf209c49ceff4.file | Bin 2946 -> 0 bytes ...e12e138a1450cee8edd47fc7ae93405bcb1c0.file | Bin 38064 -> 0 bytes ...e5ce83be7eca96685cc489ff5660ae07f4779.file | Bin 2691 -> 0 bytes ...6b28e59c323a378a107c90a4a5e7f9309f9b1.file | Bin 6074 -> 0 bytes ...41ed50b7fd8bc261bae1493785a825f5c7001.file | 1470 --- ...85075428826d5f1c80c01b305647688b97530.file | Bin 4155 -> 0 bytes ...549257c689e60286537ec37cfa329405ad5f5.file | 231 - ...ec64c11bf924bf52347e8e7222414b149bfe3.file | 92 - ...d808c1f34e51e4d39e7927f64e241a8d2e5f8.file | Bin 19291 -> 0 bytes ...980dca7de5033beddf54850202957b0f41814.file | 54 - ...1ccb06278e0517606520168ced99cf8c21410.file | 227 - ...366a928b7398277e61162e7f8ec06f469f07e.file | 0 ...8489ea7511260e238951e1efa363df774adaa.file | Bin 14680 -> 0 bytes ...e333eaf07a77f6b100039875196b8d5107bd4.file | 154 - ...041f1e0781e03025877403326a9b586721af9.file | 193 - ...0b7a3dcd9ff7398f2e8219d916180fee97250.file | 472 - ...e94c4cac8bf70201106c651a06dfd10079.dirtree | Bin 62 -> 0 bytes ...391d0ad143d957e953765ee514c85b066874f.file | 66 - ...90b1978687ef78e913b737ee8c7a6aa5d7e1e.file | 54 - ...63b747a3bd8fe36ade8275f4ce2cb6f17503b.file | Bin 18013 -> 0 bytes ...2d9bf3bb6ff7cc80430b504342db9530fc138.file | Bin 17756 -> 0 bytes ...0abccb864cf4bf068f625522eb2c06d2e9598.file | 84 - ...fc8e305253341534a10f437363c471c43a439.file | Bin 9296 -> 0 bytes ...b78b109a36d9198912ad0d668d47da812df2a.file | 1034 -- ...698686c57ef6433e6db5369a6c1dbbdbbc449.file | Bin 66309 -> 0 bytes ...f781757387fa554705937e47702aa58d26ce7.file | Bin 11678 -> 0 bytes ...2fd2be15cececf125c7082442e2cdcee81.dirtree | Bin 46 -> 0 bytes ...632b29425385c5a6cb94b8baa79e590c95166.file | Bin 7834 -> 0 bytes ...079e1be4b2f5cd56383addbabf3ed901efcd8.file | 118 - ...049889edb206fbb43750c6fdd946b8c391917.file | 12 - ...baa73f93e01e4fd56a81882507775cbd81.dirtree | Bin 295 -> 0 bytes ...e146b6e5193a8c75885157052c2c37902ac9f.file | Bin 8440 -> 0 bytes ...7791b9b27ddd042b3896308e923f841558.dirtree | Bin 498 -> 0 bytes ...dea895d0ae6ce8b5502215a79a37c316b1ab1.file | Bin 25556 -> 0 bytes ...c5dc129e80344138f126fd560c55dcfcec.dirtree | Bin 1026 -> 0 bytes ...aebe5a5e18c0265cd378b1ef0c6ea98caf57f.file | Bin 17901 -> 0 bytes ...488e0d5dbcd01ec37c8069c71ae8784578ca1.file | Bin 14997 -> 0 bytes ...6a5a52b5625003a8c7fe8084ec21073d4f1b4.file | Bin 18418 -> 0 bytes ...0c1c9b3dfa7164af13f69def272b0e9b7b38e.file | 370 - ...3361d0d04a0d8f9047c3e154890954d8dd460.file | Bin 12417 -> 0 bytes ...08d63699afe36c1a90a92edaec07d60988762.file | 73 - ...597b4b855ed49be67418fb733017653707542.file | Bin 33912 -> 0 bytes ...06737a30c47b0638ceea4266b5273d973e.dirtree | Bin 233 -> 0 bytes ...95801f892dbba0867604a6606ec7cc9ee2.dirtree | Bin 73 -> 0 bytes ...e00ee68dcdcd631e36044db500eed095a0.dirtree | Bin 176 -> 0 bytes ...6c7a4819fea3ee41c2b2222de50baa8c90.dirtree | Bin 6145 -> 0 bytes ...b7ebc2436cf5f171f652b985f01f5b1a3986e.file | 79 - ...6259e8c4fc71e040920bc9ac4b4f021eec.dirtree | Bin 82 -> 0 bytes ...4ddfee209c9b1f6035dfb6a7f5f5aab3c1d6f.file | Bin 5055 -> 0 bytes ...9713a2113cf89cae55b6ed8c7ca3e2a458.dirtree | Bin 74 -> 0 bytes ...0f6a9696ba8858c5f61c7510cc59d8625fdd3.file | 254 - ...5588b3bb3caa1961b535ba8b925ea1a19e96c.file | Bin 2759 -> 0 bytes ...1fa7cd4edd8542fd820f6bbd302ce6290c05f.file | Bin 4501 -> 0 bytes ...9186f006ad3620778a4ed0c28183f17c707ea.file | Bin 249 -> 0 bytes ...a8d14df6d1f0bd5430c1739fac3abd7a99abd.file | Bin 8537 -> 0 bytes ...7359b5b70291235600441de6ca7b2ad8b2.dirtree | Bin 61 -> 0 bytes ...c2281bcd3de170026fb855f6fada4df5da5be.file | 103 - ...cb3b0b302880e078c770398b788b9f190d.dirtree | Bin 82 -> 0 bytes ...2645845ecc320d6f6cf327064e015419d7.dirtree | Bin 67 -> 0 bytes ...82e8555e4e9ad2b19e02d51d23a4499c2eff6.file | 400 - ...5ecf1cc59a95b0b4e1810666e35dc83ae7e19.file | 265 - ...1f18583f85efae05fcdf1b5f26cfc53e37d31.file | Bin 6268 -> 0 bytes ...ef85fa9141f0ef81f7b811a091a2ab90faa22.file | Bin 4064 -> 0 bytes ...e20f37d3b2d8f5e602d976bf4804beda951bb.file | 1995 ---- ...d0a05fec4b76ef76da8911e2d5c042f519373.file | Bin 475992 -> 0 bytes ...2063de5c06f6b794639a96345f92e86dfb.dirtree | Bin 230 -> 0 bytes ...40583765a8c2cac5e9d1ac22ef4224e2ee.dirtree | Bin 58 -> 0 bytes ...283320693349e11c2260b38079896ee6f7ffe.file | Bin 27074 -> 0 bytes ...0b1dbe913eadd3758e1cde36061283413f9ae.file | 638 -- ...750696ac71d2812e8785d37801267ced5b0e2.file | Bin 16373 -> 0 bytes ...54942f48ddfba00fd8c06c8d2448a61ed28b0.file | 111 - ...41693ec51a7bf0dbede3443b9a557cefead1e.file | 371 - ...2b07a363770fea7d006fb61e5ce279b249342.file | 1107 --- ...d58bea9de06af20aa1b09164309f6fa634f6d.file | 254 - ...459acb02053b6809347ad2c3a3009abaf0ff1.file | Bin 163139 -> 0 bytes ...201ec50d1c84223e3ad0e625c202da64152b0.file | 137 - ...3b74146a9748ce4c47cede726a7938dab172c.file | 833 -- ...db0ee16d1c32b8a9064f80ae15d5803634bfa.file | Bin 2095 -> 0 bytes ...faba04927ed449c05d397129d735f40eb5.dirtree | Bin 318 -> 0 bytes ...57948b7f554de43672926da95f0f7b17a8b06.file | 421 - ...c869d9ff5a1a0974eeed0d595adefd2b4010b.file | Bin 3698 -> 0 bytes ...a3077650dd7f03388e16aed1d19c5d908d627.file | Bin 4628 -> 0 bytes ...c204ec4300b49a85281df9c52fddfbcf9e.dirtree | Bin 773 -> 0 bytes ...25f6e7746daec7e3bb7dd2e8f2679e4ff36fb.file | 121 - ...f6f10986534232887de0d47f2a4a023dcfc35.file | Bin 54 -> 0 bytes ...055ddcba11aff25dd1f0d892a0dccba766ebd.file | 21 - ...53304dc9497fd11c408a02d71b822f95d5713.file | 1087 --- ...6a302f46e5d9e19b9c8236d4b353ebde9a239.file | Bin 2427 -> 0 bytes ...34cb35a6004886a915e745042766979a1e612.file | Bin 10989 -> 0 bytes ...0b9b1dd7e203f756ab64eb2c2efa0a5acbe52.file | 13 - ...db02079e95d9364d04bed2cc9f261bf9f6.dirtree | Bin 266 -> 0 bytes ...519fce6386b2a5fecaa655461e4d26ee5c728.file | 235 - ...ecfd9912ba2cd8aa2a2f10b3021089a7caf18.file | 2184 ----- ...b0dcccca6a3e10af2db1c11b5f0a4587b3.dirtree | Bin 143 -> 0 bytes ...8c4de66677394eb814468dcdb1cadd3a17.dirtree | Bin 146 -> 0 bytes ...b42ec6a8cf8a83b80f937fa9da1c9522ccb57.file | 128 - ...adff45aa30f0377593558e003eb3dc563d192.file | 90 - ...5408e1cd2a3dc199380583f49f8bd4f7a8.dirtree | Bin 75 -> 0 bytes ...d0c78220ed9a41ee914253f67716282030c86.file | 20 - ...35d3488e433fe661a513a11db13ab106dcdc7.file | Bin 11816 -> 0 bytes ...3610e512a46a653007d81183b45e7b521d.dirtree | Bin 1073 -> 0 bytes ...9fa604f034d19653a8125ad02b58b5788cda3.file | 226 - ...072436bf61c13141bd5e959e98ea17badf1d5.file | 179 - ...92fde79acec80c56afa9cf31035c81dcbe4c1.file | 5 - ...bcbb9726726618bc8a8bd9077b9fc9253bb56.file | 157 - ...2e8d787b45cc626b5af65306f0288e2fa0.dirtree | Bin 265 -> 0 bytes ...69df288223015edca2f3f01fef609d4cb4a0b.file | Bin 22332 -> 0 bytes ...e20d9437d2475d5f3ff58811c171f9a3a2df5.file | 14 - ...eff0479a2159d19cbbc09a9274066458bcc85.file | 242 - ...8d9d943dd293607346d829cb0d6f38a6cf.dirtree | Bin 80 -> 0 bytes ...d86c8d58a05096a2d159bf70922c224a189b9.file | Bin 8799 -> 0 bytes .../build-alpaca | 1 - .../build-python3-pillow | 1 - .../build-python3-requests | 1 - .../x86_64-com.jeffser.Alpaca.json/cleanup | 1 - .../x86_64-com.jeffser.Alpaca.json/finish | 1 - .../heads/x86_64-com.jeffser.Alpaca.json/init | 1 - .flatpak-builder/ccache/bin/c++ | 1 - .flatpak-builder/ccache/bin/cc | 1 - .flatpak-builder/ccache/bin/g++ | 1 - .flatpak-builder/ccache/bin/gcc | 1 - .../checksums/x86_64-com.jeffser.Alpaca.json | 1 - .../urllib3-2.2.1-py3-none-any.whl | Bin 121067 -> 0 bytes .../requests-2.31.0-py3-none-any.whl | Bin 62574 -> 0 bytes .../idna-3.7-py3-none-any.whl | Bin 66836 -> 0 bytes .../pillow-10.3.0.tar.gz | Bin 46572854 -> 0 bytes .../certifi-2024.2.2-py3-none-any.whl | Bin 163774 -> 0 bytes .../charset-normalizer-3.3.2.tar.gz | Bin 104809 -> 0 bytes .../FETCH_HEAD | 1 - .../file_home_tentri_Documents_Alpaca/HEAD | 1 - .../file_home_tentri_Documents_Alpaca/config | 11 - .../description | 1 - .../hooks/applypatch-msg.sample | 15 - .../hooks/commit-msg.sample | 24 - .../hooks/fsmonitor-watchman.sample | 174 - .../hooks/post-update.sample | 8 - .../hooks/pre-applypatch.sample | 14 - .../hooks/pre-commit.sample | 49 - .../hooks/pre-merge-commit.sample | 13 - .../hooks/pre-push.sample | 53 - .../hooks/pre-rebase.sample | 169 - .../hooks/pre-receive.sample | 24 - .../hooks/prepare-commit-msg.sample | 42 - .../hooks/push-to-checkout.sample | 78 - .../hooks/sendemail-validate.sample | 77 - .../hooks/update.sample | 128 - .../info/exclude | 6 - ...b98d16360af4d913470d283fcd08ac3c8d04f8.idx | Bin 2248 -> 0 bytes ...98d16360af4d913470d283fcd08ac3c8d04f8.pack | Bin 64161 -> 0 bytes ...b98d16360af4d913470d283fcd08ac3c8d04f8.rev | Bin 220 -> 0 bytes .../refs/heads/main | 1 - .../file_home_tentri_Documents_Alpaca/shallow | 1 - .flatpak-builder/rofiles/rofiles-dJuXhv-lock | 0 566 files changed, 76809 deletions(-) delete mode 100644 .flatpak-builder/cache/.lock delete mode 100644 .flatpak-builder/cache/config delete mode 100644 .flatpak-builder/cache/objects/00/8ca6dc3d036ab5ac7826d21b1fbda092f79ee9557577238b2a32c74ee7373a.file delete mode 100644 .flatpak-builder/cache/objects/00/995efede7bcaa15c8f8b820a9fc7436aea60fc8823751fe7efbefddee7b2ff.file delete mode 100644 .flatpak-builder/cache/objects/00/edfaf10b763825b43196f68ef522f8b8ed52391f37de9e43f1236ecf628c22.file delete mode 100644 .flatpak-builder/cache/objects/01/8eb14ab04783910f52d398c5f1b827464ac723a43fc799b3037e30fd903ff6.file delete mode 100644 .flatpak-builder/cache/objects/03/5071e58e56d3422ac6950970d85ac79b6744530552207261222b4e34b62e5e.file delete mode 100644 .flatpak-builder/cache/objects/03/b6817a08fcdc580506d19ee2b1a33fc4ee8ab04d8e9808f93cf9da6c891588.file delete mode 100644 .flatpak-builder/cache/objects/03/cc61e70bfa30c0b269ffc3265605c46ed8fa30ac16a05bf3e102409066911a.file delete mode 100644 .flatpak-builder/cache/objects/04/1f3397a3b20b1b4eabeccf8becb736772af4539e7df752815122383b7a635d.file delete mode 100644 .flatpak-builder/cache/objects/05/6269014facbf1828dd50466926ea55ea8d76d314c07a23f818850bd18f406c.file delete mode 100644 .flatpak-builder/cache/objects/06/2da881c802a4dca069a03ab55798aee7b1aff2e0ad93b2cb72c269268cfd94.dirtree delete mode 100644 .flatpak-builder/cache/objects/06/5553db9b5f3cc27a1c11cb66f5e45a49007d4b454f2852d039203a4165f869.commit delete mode 100644 .flatpak-builder/cache/objects/07/1f61e40a6ecdf63a5a2d91cc017f1c46f03555c1fb7f72892d7761a03a6a46.file delete mode 100644 .flatpak-builder/cache/objects/07/dd4cf7b83f4203e34b85ceb53dc640fee0ac23614f93acc1f6bd94442a3eaa.file delete mode 100644 .flatpak-builder/cache/objects/08/35ff6ac22d648601c24b9aed4135193017a694875a132ca3f96e96ca883e7d.file delete mode 100644 .flatpak-builder/cache/objects/0a/56053c355a40c46b16c39010bab1630bc0903d3f6448494b0e9c4e340857c8.file delete mode 100644 .flatpak-builder/cache/objects/0a/caa95a37add317bcd98ea1a8954bd217f17ceecbaff6ffa2bbb27359078f5c.file delete mode 100644 .flatpak-builder/cache/objects/0c/032d7e00de039fbb2d5319b226e3192db314b0d731aa060807be9419377372.file delete mode 100644 .flatpak-builder/cache/objects/0c/28d8aba122d8ab0edf56141d0eeb6faac86f50c121927dae26c7705aa1efbd.file delete mode 100644 .flatpak-builder/cache/objects/0d/bcd2ee63cbf10674f3d4ed4f8eebc9adc689229f090b4827ed844c616cf718.file delete mode 100644 .flatpak-builder/cache/objects/0d/cc68daab8d4361b59664976429aaead351424e220c057a84941bcc9fe2230b.dirtree delete mode 100644 .flatpak-builder/cache/objects/0e/e32168a2767235adafa385f75b97a465a1aa593418c99729dcc8d098e1baa5.file delete mode 100644 .flatpak-builder/cache/objects/0f/554d095b16b5c2b6d0745edc8d2bd86b97bd33caf961a0f9d23c4c819812e5.file delete mode 100644 .flatpak-builder/cache/objects/0f/f8285a6d76b7122d151c9bffb282db2c2babde570a997c24a2afacd1da429a.file delete mode 100644 .flatpak-builder/cache/objects/10/3a463f00cfc3cc9225c9362e4263367b202ee3b7ab0c53461d6c79c25d669b.file delete mode 100644 .flatpak-builder/cache/objects/10/401d9ad20a396ff8153f20d6a40d7caa70fde0f03bd6756a3bd860256a5704.file delete mode 100644 .flatpak-builder/cache/objects/10/9ab9de2fc2d2f81a4ccdf90db7d358cfbd2625222b4dbdaeba6a7f1da39721.dirtree delete mode 100644 .flatpak-builder/cache/objects/10/c9aee23fa0fdb887dc88ac74bd550916255571fa1877359d18c55fda93f48d.file delete mode 100644 .flatpak-builder/cache/objects/10/edfa2791416895f9730ba52d351c95f6f57b3b1cfe2fbb165bf043a289c7a4.file delete mode 100644 .flatpak-builder/cache/objects/11/b8af89e321d38b665fda2465bfef5874053876f0bf449bf4480ab856e9766d.file delete mode 100644 .flatpak-builder/cache/objects/11/d81d378558f7115ce041369e42b0497f60b72c3a2f6f426eadc7ca82a97c02.file delete mode 100644 .flatpak-builder/cache/objects/12/12cce5ea0b18d679e3baa460b1f2e6bbc3d0b88023581ce364a6dc95c2c24c.dirtree delete mode 100644 .flatpak-builder/cache/objects/12/ad731e6f1d18fd96638b00d5c64f36683565cf73cec3aa5990d4880eb9b0c3.file delete mode 100644 .flatpak-builder/cache/objects/13/3102b635a79279aa181d2f79c99066b45e3b584eeea10172caff2dff4655ea.file delete mode 100644 .flatpak-builder/cache/objects/13/3fbca07002dde1ab644fcc9fae7e5f9e371d00e5ebb80dbfa39b44a1da2282.file delete mode 100644 .flatpak-builder/cache/objects/14/110d46347c604b35d8803f881d63161ef72b5f73418e154ba277d4d55d343b.dirtree delete mode 100644 .flatpak-builder/cache/objects/15/701391afa1c53c4f3ba2eba01275528c1277d63a5a4cb02e75593cd8ae39c3.file delete mode 100644 .flatpak-builder/cache/objects/15/892a0a9bfa012cc02fae39b6639d84f30b910db45affff8ea2e33e55d351b7.file delete mode 100644 .flatpak-builder/cache/objects/15/9d227483baff3a5f14d218577e9b2ba72526681d0ad1166c176c76c1baad0b.file delete mode 100644 .flatpak-builder/cache/objects/17/bc22e6ed55df6c0be52d856eb230e70e3e7d9ed3a93df75e2d6a3549855f3e.file delete mode 100644 .flatpak-builder/cache/objects/17/da87e0832cc83a23ac1939679c357e37259e0004094be53e9a575ca3198e2a.file delete mode 100644 .flatpak-builder/cache/objects/18/563de2108b0e952b979fe79ee67c7c9fee87c6c961ae71113dd00545211de3.file delete mode 100644 .flatpak-builder/cache/objects/18/b223967b97280f51294cc56e4b66c7fdb3b68e8f6cf8b153072607e82247e6.file delete mode 100644 .flatpak-builder/cache/objects/19/7523ddd926c26bcda364c1f7250099d7258e415ba16828c88b789225e573fc.dirtree delete mode 100644 .flatpak-builder/cache/objects/1a/139355d24ec4215e369e415085f85e34c1745d4063cb94d9d73402b33fea67.dirtree delete mode 100644 .flatpak-builder/cache/objects/1a/45f8b3e2783a52d596d886e763241549f93f75ef28772202747037e27789de.dirtree delete mode 100644 .flatpak-builder/cache/objects/1a/8701143f942fd3c77ba80dd5c98d6843e94980e8402856a023fc591dbf77f3.file delete mode 100644 .flatpak-builder/cache/objects/1b/8706c6ef9a50fa88c92942fc6353ea3c8a3ffe3e78f915c6eb3c5002fa3f9d.file delete mode 100644 .flatpak-builder/cache/objects/1b/8cde0dbf0c57ca89d8972d7c89d3930028b423c7b0a8ec30cf455575573c34.file delete mode 100644 .flatpak-builder/cache/objects/1c/01778aed450a2fc58b4eaf4af5d4bb7c4854b8b6cd103d713369cb0af791e6.file delete mode 100755 .flatpak-builder/cache/objects/1c/0d191d2c4e3e6f0157890711e8b8256d96ffec83836f2345b7faf9bae0535a.file delete mode 100644 .flatpak-builder/cache/objects/1c/702c5ca32d24017290c53e595e33e4f168b790b104d7983ffd4fc96b7cf3f7.dirtree delete mode 100644 .flatpak-builder/cache/objects/1c/986d1b898e7e500d83881958040c8ca9cde958c5810ee626c2d337eb69ce20.file delete mode 100755 .flatpak-builder/cache/objects/1c/aa2161ef7edd2157f779f77e401294481a7001bca1439221e7d6f3efaf29da.file delete mode 100644 .flatpak-builder/cache/objects/1d/7ef47339dcb8c4b4212c03ba3bf7c03c97ae89f66a6eaddb3740b546e81a9f.dirtree delete mode 100644 .flatpak-builder/cache/objects/1e/6e467308de61eaace9413cded9b9b342f3f2dc9f179812e37fb61ceef58891.file delete mode 100755 .flatpak-builder/cache/objects/1e/78621e90fbf44cdd33ea5de30a9b1d77b6979256079e95cd2bc65f7b03aca2.file delete mode 100644 .flatpak-builder/cache/objects/1f/a3a43dfe8ff647cc5252f6cd6a2ef58f49a6909d1da9315009f07cfccd9004.file delete mode 100644 .flatpak-builder/cache/objects/20/6988bf7ae9ecb5d1672d90f79a8ebaa53d5c1cb146c499c03146c41aa509a5.file delete mode 100755 .flatpak-builder/cache/objects/20/fa2fecec2bc624f74fe3855291ec0a1256c169c1e5140f6f9eb7549d921107.file delete mode 100644 .flatpak-builder/cache/objects/21/a31500c5f0f53818186a1ceaa761f2f2ec28aa11d79a512dd41f5f0d90a7ff.file delete mode 100644 .flatpak-builder/cache/objects/22/2468b6d24cf1faa93b8438db4450775d18798ac9fe43915f1aaf98693452ef.dirtree delete mode 100644 .flatpak-builder/cache/objects/22/4ec00b2b1dff51a62818b8071f923d2158b17375c96120779c8955b728a69e.file delete mode 100644 .flatpak-builder/cache/objects/22/924a6c416ea38cd81333bd42bf3a67fe5aee0e0875e23edd1317618f44868d.file delete mode 100644 .flatpak-builder/cache/objects/23/15a8b8a1d1ad6660b2eae98ca4a709ce913ca7fcded3f65fa2e4d22eee1891.dirtree delete mode 100644 .flatpak-builder/cache/objects/23/7ade21152cefba1be4735b97948533c029c9b5ea899b10c84671e10939b27b.dirtree delete mode 100644 .flatpak-builder/cache/objects/23/dea2223ca99264aee25dcea0bc95db78c1567a6ed14b13ce78adcfefc1ba0c.dirtree delete mode 100644 .flatpak-builder/cache/objects/23/fc6533bcf398912375e6d7ca87c10335a0878fb8bcdc782b887e710b9bac98.file delete mode 100644 .flatpak-builder/cache/objects/24/97bfeee909adfb417ad06bb6bf5d99fdfe96fe4f351f42f5e8b445b9319e7c.file delete mode 100644 .flatpak-builder/cache/objects/24/acbb915c6ac43f3ece67dedf1ad4c4500de87a4533b0a2090cb1c535560586.dirtree delete mode 100644 .flatpak-builder/cache/objects/25/3f960c0851bc62c644df32eadf1d0f1108b20554e92f5973dc888fefe104f0.file delete mode 100644 .flatpak-builder/cache/objects/25/9ec7fa86388bcaee9a8f3045b6299e4b7bd497badecb763a962cb05e365a4c.file delete mode 100644 .flatpak-builder/cache/objects/25/dc8086607be10177bf37659a1cb67e2a52b8282ebc2a95a66186f4261b84d9.file delete mode 100644 .flatpak-builder/cache/objects/25/f8093265cdb7ec53719960f96bef51490af6a3dab5199aed21b7c6800cd62e.file delete mode 100644 .flatpak-builder/cache/objects/26/b385f32c30de351dc0a6349bf71f19f54945b0108bcca9e1a1d57eb84bdfd7.file delete mode 100755 .flatpak-builder/cache/objects/26/d73535fb8b586cba46f241ccc73892d7501ad46a19616614154f7beb579b23.file delete mode 100644 .flatpak-builder/cache/objects/27/05bb36beba9b76e295b58cde69f6fac5220908bc227fd61bbc8d12e6aeced2.file delete mode 100644 .flatpak-builder/cache/objects/27/c5a567b8bfa9b7721c5668a616108119f908e3dd7076ef2129a24bfc9bb7a4.file delete mode 100644 .flatpak-builder/cache/objects/27/e35e90609c5180386a480f57df0a7b7f0b0dbc9e8e7b74b010978cffc49ef8.file delete mode 100644 .flatpak-builder/cache/objects/28/4df20a8ed855ea6132c4b167149d16a41e04a3d79e434a91a33c0dac59d256.file delete mode 100644 .flatpak-builder/cache/objects/2a/d93bb0218c5a25e06527011113110e5b42b9f7766df01cc039d3c30e6ae2c2.file delete mode 100644 .flatpak-builder/cache/objects/2a/e9286f5fa157f6af95495a605afa4f22c5871f78e0153f40ce2ed06964baca.file delete mode 100644 .flatpak-builder/cache/objects/2b/4efc9a738a849538f560c5d2fea06547d07d0573a1b4ce38990a0d26cca98c.dirtree delete mode 100644 .flatpak-builder/cache/objects/2b/79297f72252bdd3638b51c47079da1ea58efaefbdbe97ffcee8b10d61010b2.file delete mode 100644 .flatpak-builder/cache/objects/2c/a541b041a8bec25da3696d61abaedac39819d424d7ff96290b390d4cfdd3d5.file delete mode 100644 .flatpak-builder/cache/objects/2c/c64fea07bcf2a59c1555463787963de0f558e4fa845db6e738137019baf341.file delete mode 100644 .flatpak-builder/cache/objects/2d/14e519813cff8bb6c178261d0a76572c7139902e60d1d0d0770050a418b08f.file delete mode 100644 .flatpak-builder/cache/objects/2d/82e09a8fc6d09fbea8d1779d98163487b655c777d4064c294f2359a9a0fefc.file delete mode 100644 .flatpak-builder/cache/objects/2d/aa2e47452be85c8b58e190aa7f144a7c85c425b8fdccf13e635ff68c2f92b1.file delete mode 100644 .flatpak-builder/cache/objects/2e/7f08fe9d8d1fc9b1925226721a0fed94ee43f25d68d1e49e3e4a7d65189702.dirtree delete mode 100644 .flatpak-builder/cache/objects/2e/8156e91555b4d389e70f25f56650a1cec90fd8b125f56a095811af9ba9a86c.file delete mode 100644 .flatpak-builder/cache/objects/2f/6e640d0cd66ee891fb811e48651952e6beef10985ccd689f6b664ef6b626fd.commit delete mode 100644 .flatpak-builder/cache/objects/31/dc0e1a59c92c2ce56ecd220e8f8595b032a7f9f525ad88cd36512344ca0830.file delete mode 100644 .flatpak-builder/cache/objects/32/f107a7dc3c76579902dff8e6e84d9f991119c84e58d828bf9f9742d2137987.file delete mode 100644 .flatpak-builder/cache/objects/34/1ea6141f16419f5eb0ab4e0210243f7d17ab73e287b27dbfbc309f8a1ead93.file delete mode 100644 .flatpak-builder/cache/objects/34/59c72d977e79d02bf1415d7da27b5a326ccae883a9d990c4749b682a605351.file delete mode 100644 .flatpak-builder/cache/objects/34/b5ddd7c1f3596352ea3c3ebbe176f3aa43104f1fd9036095e9b8bfad151d77.dirtree delete mode 100644 .flatpak-builder/cache/objects/34/cf2848d2c473468cb0b4eb9267abef0ea822778f581cdaa6a42b5de0d8688e.file delete mode 100644 .flatpak-builder/cache/objects/35/53ba8f07c0ff0dc51e0cff9287a3f1527f006db8669283e24fb38205c0be4f.file delete mode 100644 .flatpak-builder/cache/objects/35/e97d77b7a3cfd1ed980830d402905148c6ccfc0d3429a0996ae3e2a7b5e8fd.dirtree delete mode 100644 .flatpak-builder/cache/objects/35/eeb7a3cc6b86bdd0e0ea12ec7cfc1e6f7415a3da1fde410a7f98e38f36e5c9.file delete mode 100644 .flatpak-builder/cache/objects/36/226c35e3f1d789bfc67b5d39d2c9b294ff789e85ecdaf8c83cc4960daeacfe.file delete mode 100644 .flatpak-builder/cache/objects/36/85548dad317da9da95337135068cd8d8568e950b9e13d1fe48d367e6b93344.file delete mode 100644 .flatpak-builder/cache/objects/36/e7e6271b66b146f07362ed3af160ca0c55204d0fecd3d3dc1c509404df7867.dirtree delete mode 100644 .flatpak-builder/cache/objects/37/0f941c5d91300dc7b8b951b5b6128d7b40c1c1899e68f096c0987cb3a0d496.file delete mode 100644 .flatpak-builder/cache/objects/37/50704667777c1e4d1067254c3dfcb2e4489586de98a54fba30392faabee297.file delete mode 100644 .flatpak-builder/cache/objects/37/788562e56c75583a248baea2e0c4d2f95dfff72cbf2a25789af1aa5f5975d9.dirtree delete mode 100644 .flatpak-builder/cache/objects/37/d29f4a795e7ef0171e39371162b33b526c21e3995b09fb4c8e28fb32fd4592.file delete mode 100755 .flatpak-builder/cache/objects/37/d6ce2c640d84f8d85f4de6624e553cf2b965ab8f5ef6ddb41b524a8a5cd182.file delete mode 100644 .flatpak-builder/cache/objects/38/1305ae7dc5c2eb384329c1fb7a6f0e50f23f371451d5fc77b886dc64bf5aa6.file delete mode 100644 .flatpak-builder/cache/objects/38/88bd6ac611d157cb27b4e05901786ed98aacd686c785107996945b33f25214.file delete mode 100644 .flatpak-builder/cache/objects/39/6e550f269e17f903d51dd5afb7018bf513743e41b48b5e9c9721ab056bc02b.file delete mode 100755 .flatpak-builder/cache/objects/39/c531459bee1a50b11dc64c70717b64d5c645ae4a9a299453063a1b88b5c19d.file delete mode 100644 .flatpak-builder/cache/objects/39/c640d8ce15f7971b9e9e2848106b845f707aff457bf771e8665916c2db63dc.file delete mode 100644 .flatpak-builder/cache/objects/39/e13797bd8a817a7659c99c67b9405bdbf97fa356ce8a5c18a1023b7bf3e181.file delete mode 100644 .flatpak-builder/cache/objects/3a/80a5cbd726adf062a1b835546a42d0c6e91f2a6b51f27056b6019afb899043.file delete mode 100644 .flatpak-builder/cache/objects/3a/e66fb8de2ad724ddca9f97f5cc3cccf3494680b21dde8712b702887f0f1f7b.dirtree delete mode 100644 .flatpak-builder/cache/objects/3b/bd3c4f1c9059beeb8036f09f7f69e34c1ca4ca3d7f6ffa49634e94b1fcefdf.file delete mode 100644 .flatpak-builder/cache/objects/3b/dd94d772462fd398dc91cdc3570921a5c4909b41b6a40c3e8e84df60a80c58.dirtree delete mode 100644 .flatpak-builder/cache/objects/3b/ec27ec47deeddb4a38951e8de660acad16156f7b3226571c75ac8ce432bcb6.file delete mode 100644 .flatpak-builder/cache/objects/3c/9e15a9ac51420bdd5ce4512488a5afbe049275d1348ae1a8926eb8b23ea5d2.file delete mode 100644 .flatpak-builder/cache/objects/3d/f418550a210db034bf531a67f6c7167e5c233afc42cccd155336d5ab07974b.file delete mode 100644 .flatpak-builder/cache/objects/3e/5a365a2b02dfa7281d6f6442f19e9396f1bb7e3fd240dfce075d822f10c11c.file delete mode 100644 .flatpak-builder/cache/objects/3e/73d7be8cf586f48918718b614e2baffbf690cf1c030ca627fe8147b319a6e6.dirtree delete mode 100644 .flatpak-builder/cache/objects/3e/ab1940c14997d593ebb504f3d76edd53884529d19a88f423fa117b15ea0fe7.file delete mode 100644 .flatpak-builder/cache/objects/3f/16b106f2dbf509344dcae863e510fd42eaf7637821afd050863d5d2400eae4.file delete mode 100644 .flatpak-builder/cache/objects/3f/33d52dd7caf1c2b1d18dec90238edab5d8b9c90b8df70f7e236c51787dda9d.file delete mode 100644 .flatpak-builder/cache/objects/3f/ebb0332ac45f2428084d8f780ade36556062db1fb549ff2da1d98446a78b1c.dirtree delete mode 100644 .flatpak-builder/cache/objects/40/bbd2a95c3c077d05e7e21e0ebb6b4aa08e29817304678f2471107674683797.file delete mode 100644 .flatpak-builder/cache/objects/40/f1b515e0a7cb8af0e71355723d28b623b0221f1d65d723e0aff056c3383777.file delete mode 100644 .flatpak-builder/cache/objects/41/9c9b00700f9db045da67fe2e340bfc02c1e7b251b135ee160168bec36d29a2.file delete mode 100644 .flatpak-builder/cache/objects/43/5ace3b37539d48f8811969ca4ed03e04b7f5331cdf7e4da5e9352f924a00c4.file delete mode 100644 .flatpak-builder/cache/objects/43/5d429de64946fa8c7bd78126aa0e59e587caae6c5ff4a75b03ca6d16a0571f.file delete mode 100644 .flatpak-builder/cache/objects/43/af829f849a8e721df02231d2309271302f1292f20a9e346cf66899db8bb275.file delete mode 100644 .flatpak-builder/cache/objects/44/0fe274d3fe682682b6f1fbbbd860959f5abbc958ab6a4d1580b03e5d0cd350.file delete mode 100644 .flatpak-builder/cache/objects/44/57d73a19e1cc1af365c0e7b0dac4c72c223403fe157b2f825686a31f2f573e.file delete mode 100644 .flatpak-builder/cache/objects/44/6a0ef11b7cc167f3b603e585c7eeeeb675faa412d5ec73f62988eb0b6c5488.dirmeta delete mode 100644 .flatpak-builder/cache/objects/44/9082b58b865e948877fc74e9a24ce8674f724c193c5409b44c27ad30bd3ef9.file delete mode 100644 .flatpak-builder/cache/objects/44/99d4a699306c1af5c0d956935961e6cef36473ccbd18d6cd463e90d6993b0c.file delete mode 100644 .flatpak-builder/cache/objects/44/aa45297fc373024a45d7d712fca521ec0bad68286150de6f947397413beed5.file delete mode 100644 .flatpak-builder/cache/objects/44/d1d4f191641e3d500e77559f481e1187d36bcd6248ef7022860d2c3d9ec04b.file delete mode 100644 .flatpak-builder/cache/objects/45/ba7752686b8143341190da165b26f65cf44abd91b99964a7d0c92e387d9604.file delete mode 100644 .flatpak-builder/cache/objects/47/33b2a2cfcaa3c6f3dad5f08f78d40f38f6c80f4907f8ec7356756ad3d0640e.file delete mode 100644 .flatpak-builder/cache/objects/48/64004ea946d77698d71f6eb6958b61f2ba7e0396ac9be43033faf455961896.file delete mode 100644 .flatpak-builder/cache/objects/49/83f0ef47c617d0cb20d34d5028f789ad4d192ed15967377eac3659eca28831.dirtree delete mode 100644 .flatpak-builder/cache/objects/49/9cf6fea2e2f53f8b0434fb80b75630cbdb4c442e5a1d55660ec49adbea64ec.file delete mode 100644 .flatpak-builder/cache/objects/4b/20aa8fa92802badae65fbe92313b696e70a23364a391933f2221ce45d480c5.file delete mode 100644 .flatpak-builder/cache/objects/4c/1e7752a33ad1ef4632f267b2d366f3dc748edd1592490c6e326c363623ce99.file delete mode 100644 .flatpak-builder/cache/objects/4c/1f93408f1d4df28c88c099cef45cf93b0dfe078d454c9da9197aa9f4df37fa.file delete mode 100644 .flatpak-builder/cache/objects/4c/29edd6c22a5e6a9fbefde946a4b8d5026e2e5316296f6578d8f04805b4ed60.file delete mode 100644 .flatpak-builder/cache/objects/4c/7020165d8a9de55a8e03e82a853fab2bcf1e944c2c8f6cfaeab18a96dd5e13.file delete mode 100644 .flatpak-builder/cache/objects/4c/9ebeb8dca427d2e64c7f0c83e983b893624e2873236dc58a188ed9e615bd20.file delete mode 100644 .flatpak-builder/cache/objects/4d/0f3ebe1ba7ed971e2b634022cdf31ca4a6e50475c37628feeb040a9eb39560.file delete mode 100644 .flatpak-builder/cache/objects/4d/450ddb5485c14c3bf06a3373769afad2ddedf51c69ae0cb2f2f630669a1f56.file delete mode 100644 .flatpak-builder/cache/objects/4d/6f617c5ac14efc51c6b89bf9c2f6b7492734664471011677188e49de621134.file delete mode 100644 .flatpak-builder/cache/objects/4d/e9418f1f2a24e95b21f535706b252d03baa8cacf5c930d54d2a19584fe9282.file delete mode 100644 .flatpak-builder/cache/objects/4e/303c49c60d15801002820651e98eeb26fe5dc09b8c9bb3516d3438e2450ebe.file delete mode 100644 .flatpak-builder/cache/objects/4e/aabb3c0cdf232058bbccbc58e51ccc7f8ccc7eca4916b433e5090b6dc0e4d4.file delete mode 100644 .flatpak-builder/cache/objects/4e/d2d971da6274c3326a06da5ee3380e5b005b9c29d0ef5f488a2af1e778bbde.file delete mode 100644 .flatpak-builder/cache/objects/4f/4d4aff1b114119ae5470a4fbed94dfb3226823d44d90b7827bece5332d5878.dirtree delete mode 100644 .flatpak-builder/cache/objects/4f/59dd80c1d1ee01cfce80277f2b153c256990911506ec356eaca43e7b2133e1.dirtree delete mode 100644 .flatpak-builder/cache/objects/50/6e3f3dab643f6638c0ebd1d908e6ea221edb509ea88fa8af0b5ac94a993348.file delete mode 100644 .flatpak-builder/cache/objects/50/8ae84f8132b379a2087b12dc876641d6bb6c5d31deb026aa121bb19ec27a3d.file delete mode 100755 .flatpak-builder/cache/objects/50/92219e26a60aecba306b2fc17be74761fa71b5af2ca951188021bf7689d093.file delete mode 100644 .flatpak-builder/cache/objects/50/bcf1b97ec9345d111539b31761012c8e16c18e449d0d6e3e27460fa92318b7.dirtree delete mode 100644 .flatpak-builder/cache/objects/51/c07458e0eea21340550242fe40a0d67a453ee06d6e378272f5d3a6ecfb17f9.file delete mode 100644 .flatpak-builder/cache/objects/52/298e0d8038e3bc1c8934485b1bac4e0b46c656ff31cc17087ec5481ee3d292.dirtree delete mode 100644 .flatpak-builder/cache/objects/52/8dae0634c8c429d2d1f0876d1eb2e3f5a9227402a2014f6d361e6e5194622c.file delete mode 100644 .flatpak-builder/cache/objects/52/bce5b79217d91dbc4489ec6725b01e1d6272c82273c1016c6893b0c86a9e82.file delete mode 100644 .flatpak-builder/cache/objects/52/fe2c435502384dea87dec1f4bfbaebe286c91a33be5584f660747b87e969dc.file delete mode 100644 .flatpak-builder/cache/objects/53/ac9175206854ede398b79a2be25353fba977f6db595dc1fe938c2149743e24.file delete mode 100644 .flatpak-builder/cache/objects/54/24357ad5bc66fe61990ad5b56899ee7bd4eb144da7988931c3e92befc1c620.file delete mode 120000 .flatpak-builder/cache/objects/54/2b14975bb28ba3a0b02b1145c19f9a4ee911e95e586e3b6897687530139e5f.file delete mode 100644 .flatpak-builder/cache/objects/55/0dee87a0ff2a24eda70c8ab51ccb9e775445cd0fc010553738b074268911b4.file delete mode 100644 .flatpak-builder/cache/objects/55/ef3dce50e6ed1de64fefbac150b5444b3d5378bda02435849c7e684e1032c2.file delete mode 100644 .flatpak-builder/cache/objects/56/3168ef95cd68c851c1214228c745148c9fe5bb1e0b6cf56973d5700202a612.file delete mode 100644 .flatpak-builder/cache/objects/56/97732b4e9358249b1445d1679c77706a8733e897522b79fa64cb488406d9d0.file delete mode 100644 .flatpak-builder/cache/objects/57/05df0f030b0dfd293def024f8b9d0e73499cf47887fdee5b49a19bee0a80c1.file delete mode 100644 .flatpak-builder/cache/objects/57/195f0d74d33c9f8d102de3a4288f4c9533e1308e9768cbf3b735dd24723a9b.dirtree delete mode 100644 .flatpak-builder/cache/objects/58/931b197b579db7c35eedbab5f21f65f43b607ba1e73f893d67e8d6fcd812a9.file delete mode 100644 .flatpak-builder/cache/objects/59/cd073ba8ecdfc58fde281af1cc1904260cf522fed3e552832ee87368af3939.file delete mode 100644 .flatpak-builder/cache/objects/59/d8cd0c2796700c2bc1c0251edecd853ac5be1ee2a0dae6d8a95df6f2fc14d8.file delete mode 100644 .flatpak-builder/cache/objects/59/e22deb09db7f00b9d456de6b58c7084bcf3fc15e5f4a6776d18424ae0d69a4.file delete mode 100644 .flatpak-builder/cache/objects/5a/83a528e6d04061ab7c7dca6e8ea0133342bddcecf5ded42b5d51885b4b114e.file delete mode 100644 .flatpak-builder/cache/objects/5a/d5f44270d57d4281e7e4fb31cd15e90ddd640d47aa9203f61efa640572c1a6.file delete mode 100644 .flatpak-builder/cache/objects/5b/75211ac0565bc53bd07ea4fceab3461093734a1fa5312da431fbe9f96ad537.file delete mode 100644 .flatpak-builder/cache/objects/5c/9e3a4c685dda1575c5a8a62d091542024bac351156e0d5dcd58d999c6b3abd.file delete mode 100644 .flatpak-builder/cache/objects/5c/c1cb0c455e0f8cc88774d0d328a868465577fb5f04194166ac5319f2adb7a7.dirtree delete mode 100644 .flatpak-builder/cache/objects/5c/f304a4889a2379cccfe7ce3bb5e497f0479f22e8ac1567fd8ba68c0399aa7c.file delete mode 100644 .flatpak-builder/cache/objects/5d/b40d45ce01e078919a6ec0ea5c264df2e0d4a2fd8fc1634c77367e8d4a75b4.file delete mode 100644 .flatpak-builder/cache/objects/5e/1f6471772c474bd4cc7e308ed2e9d8e2afbe4a1ab82c11b70d4b0732ac54d8.dirtree delete mode 100644 .flatpak-builder/cache/objects/5e/3879c82f02417e2aa122c549267dbbdb308234b41fb5d89a70a120c55cbac0.dirtree delete mode 100644 .flatpak-builder/cache/objects/5e/75f8325a3d5e74b9e9bc01dfabcd6816cf0c79b3305176e89634ece822f590.file delete mode 100644 .flatpak-builder/cache/objects/5e/ec496ed8af378c80a42b908cc5f11ee8de0024af76a873e9689c7253774b2c.file delete mode 100644 .flatpak-builder/cache/objects/5f/3c5a041b155970d110194221fce7cbd7828a9dda22b0c0327e16748077fa58.file delete mode 100644 .flatpak-builder/cache/objects/5f/4f11228031ec0bca43e5e5240a3961c6394371afd9620fa78b468d0adb7a0c.file delete mode 100644 .flatpak-builder/cache/objects/5f/541a7baef8537d78456bede60c93421274370b9ed47965c5142ddaaa89d3b5.file delete mode 100644 .flatpak-builder/cache/objects/5f/5e1d9e4f51d2b75ccdbb8baab4ba8b61cbad9f8b903101671a0144c58217d7.file delete mode 100644 .flatpak-builder/cache/objects/5f/9bd5759434df09a620f52d541410b1ec3c4402b62553d6b695605aef119076.file delete mode 100644 .flatpak-builder/cache/objects/5f/a545d3e058c6a3594a2a27f9f4045c815cdc2c05a1f52caa2b133cf20a7d87.file delete mode 100644 .flatpak-builder/cache/objects/5f/b5b6ec95d4896585e8b2c482eee14e68b44f83beaa11d877e46c81bd9f7687.dirtree delete mode 100644 .flatpak-builder/cache/objects/5f/ef7fd9a6bbcc4f4a6ef49b2f906ec67dcc07990710608c854a4d0a11ea1ef1.file delete mode 100644 .flatpak-builder/cache/objects/60/09ea4de391851ec1921bc81a58776638829e0886432d665c1f724d452c9fa0.file delete mode 100644 .flatpak-builder/cache/objects/60/2dfb7298673aedbbd711cb5d022641df95d439ab495f789f09574827a3fb6c.file delete mode 100644 .flatpak-builder/cache/objects/60/63ed8c3382375c91978f8a8a4a7dbe5ec994bac18cecd7869c08849c94e4db.file delete mode 100644 .flatpak-builder/cache/objects/60/6b6e08e1cf6b48cc5c1948c781df8215107c335223d8a8602af370e9c5044b.file delete mode 100644 .flatpak-builder/cache/objects/61/aa8cf0854abac049eaea32fdc55d0047c110862ebde62f10243d99aac77d70.dirtree delete mode 100644 .flatpak-builder/cache/objects/61/c06cdc269583a178a925832b5fa6c1a95697ed5f92ab90a4410f8be143325c.dirtree delete mode 100644 .flatpak-builder/cache/objects/61/f4a8178281816a6a11aada803ad9a44b75ca3554f0e5ae0b333f1895bd1212.file delete mode 100644 .flatpak-builder/cache/objects/62/5c114bb64c838d29c9634b6420238f99543d5c848af56253c535dc9a75f66c.file delete mode 100644 .flatpak-builder/cache/objects/63/17e4a2e7da43c192445702bfb0fdcd4098971458c051dcae4e1f57d19492b8.file delete mode 100644 .flatpak-builder/cache/objects/64/58a9431ac38139d1ecb03854e7976594d15e7a599308136a8580bae81c3492.file delete mode 100644 .flatpak-builder/cache/objects/64/5ac1e787302bebbd823d4acb4824f90c96b7a01aeff868305aa2630226ca83.file delete mode 100644 .flatpak-builder/cache/objects/64/79869a2ad9ff7ebbd0baa90c72f666ea603a54d91d5f1cf20727e0d7b90abf.file delete mode 100644 .flatpak-builder/cache/objects/65/298c30d0d3545bb9242fffeec170e6fddccaba65204c84c3f8065bd778e39e.file delete mode 100644 .flatpak-builder/cache/objects/65/90a9794bf990c538e09ed6390b01d58738cd77cce6574ee580b3ba87e1620d.dirtree delete mode 100644 .flatpak-builder/cache/objects/65/f616d58b71bfe7b8f61e45809f549cb09c0603e063636520b484cdbbacd85a.file delete mode 100644 .flatpak-builder/cache/objects/66/6359be32870d8827270337d51279fe5a45967dbb82ee5c44a86a84a05ad9a1.file delete mode 100644 .flatpak-builder/cache/objects/66/9937258a75b410d2e3e42e437ce756be403dc60eeb05b6efb4148fda92d77e.file delete mode 100644 .flatpak-builder/cache/objects/66/d06baa08f6542179cc704a93ee8fab33e50fe8c9ffbabbc7465ff45594e26b.file delete mode 100644 .flatpak-builder/cache/objects/67/5ead147f3843b2b357bb186c2e5b0e380149386d286d936a631b3eeaa3be50.file delete mode 100644 .flatpak-builder/cache/objects/67/dff40667d4d9307b1fdb1f850257b0cbcd66639f657548af0cea70019a2945.file delete mode 100644 .flatpak-builder/cache/objects/68/cf45a15f6fd9ede625536a1f672d34d25915adff1b138714bb770c23722e1f.commit delete mode 100644 .flatpak-builder/cache/objects/68/d9bf8c5a22e752c1c4b7fc40e1eb4456fbd05fb25daad5bb97adf596c15d9d.file delete mode 100644 .flatpak-builder/cache/objects/69/78ff71222efc73554b67b719fad96f46ac71332ae5343c2ea01f3b92f14572.file delete mode 100644 .flatpak-builder/cache/objects/69/b6806702a73fc60b2bd4f0444f4f9c76f695c0ea39b8d5c3e8ffe4c19679fe.file delete mode 100644 .flatpak-builder/cache/objects/69/b75ab5443d6ef39ce5980712bd43c01e3b295a36b80a4cb431efa314b0bf53.file delete mode 100644 .flatpak-builder/cache/objects/6a/431d48fc2a1ad7e92b7196fd9996c7284ae8af8b533bf5e8ef07fb62ae95ea.file delete mode 100644 .flatpak-builder/cache/objects/6b/2a99acb8cdd0dce16c879840121b1816abe431507451dcc2ab02d41c6b8cac.file delete mode 100644 .flatpak-builder/cache/objects/6b/e1dfc1b49dae1204d305a4c5655655f38f1aceba39f69fe0d399f189b6f225.file delete mode 100644 .flatpak-builder/cache/objects/6c/74d5ed88249ebc6ff1a653189205f135c4a5c8035a4aee93ce88c3ba487fc1.file delete mode 100644 .flatpak-builder/cache/objects/6d/3f479e64e80f44f46e110239a9ffa60523f105dc58fe4a9261ec8746eaa840.file delete mode 100644 .flatpak-builder/cache/objects/6d/489324a5c37814a2ef005883afeda3b37d951e51c09f08cfb1c21ecce70597.file delete mode 100644 .flatpak-builder/cache/objects/6d/6e62a5173f08ee93fad499121f48dca11b6a1da8ef41d7df267bf163795a64.dirtree delete mode 100644 .flatpak-builder/cache/objects/6d/c7f17d21ba3e43ebfdc308a5f6538e8ba889efb8ccba4f0a8acdacb698f836.file delete mode 100644 .flatpak-builder/cache/objects/6e/340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d.dirtree delete mode 100644 .flatpak-builder/cache/objects/6f/b7320828e1ec041e21779506ba9395ee7cb3c71dea0d5642416d47839b36f6.file delete mode 100644 .flatpak-builder/cache/objects/6f/e118d85bb06f97f94dd5ee783b43d38260d94d8ffacb6f72686eaaf2ec98db.dirtree delete mode 100644 .flatpak-builder/cache/objects/70/10d7821f04d1d9ad0dc2eabc9d8d600a90f92595bc60bffa2826e46342fb3c.file delete mode 100644 .flatpak-builder/cache/objects/70/2232dc749621623760ecf84baa32154278da8a5dcdeb95cbae3e7466481f5b.file delete mode 100644 .flatpak-builder/cache/objects/70/4e8a34f24e7d5ba5c6ef92dab373e1dbb9767d7b10f9d2396a5e2c1765970f.file delete mode 100644 .flatpak-builder/cache/objects/70/a31f060ae5fed0dce9955ae6b06945574f54f15d7edd035341bf74111098d4.file delete mode 100644 .flatpak-builder/cache/objects/72/831851ce1521179f49e32247a229aecb37de00579714894dfa8e57cd316805.file delete mode 100644 .flatpak-builder/cache/objects/73/48bfd1847f6c09d53173c3d79ee8767a30cc9116194663618fec5fb2ce046d.dirtree delete mode 100644 .flatpak-builder/cache/objects/73/ffd986ed061cc3184918b600f7ddb286cae69fd6f49531a97258870ae71b3b.dirtree delete mode 100644 .flatpak-builder/cache/objects/75/5b14b3ae8b26775c284d76db6988b9fe1132fc8123d85d58e9221754a63ad1.file delete mode 100644 .flatpak-builder/cache/objects/76/948e327fcd5e9886898084db020eb5abc46eae7456a4a5de351564b7c6f2d1.file delete mode 100644 .flatpak-builder/cache/objects/76/ee0ffa98d96144451b8ed2645715b100554b51c282c2288930275aec9f998f.dirtree delete mode 100644 .flatpak-builder/cache/objects/77/77550efa8868eb4fe99c26a52a77ff4c6c283d8c2dcf47b895ffc3da74b4ed.dirtree delete mode 100644 .flatpak-builder/cache/objects/77/8f497a42a359efd3aef8f528cdddd8a13fea2b471cc05efabeb2b9efe482e8.file delete mode 100644 .flatpak-builder/cache/objects/78/896fc999548d215e47e5a5af9cdd56df83db3bb9df9d9749e1efe8fc455822.dirtree delete mode 100644 .flatpak-builder/cache/objects/79/b2f9e7ba79b8518c9c50910ad9a93af506d77b20cd0c2bbbbba7399a34eea9.file delete mode 100644 .flatpak-builder/cache/objects/79/eba164cd220493808e762e17b39f2b98bb7bceb5befe8a0d9a0d1e0cb34c2b.file delete mode 100755 .flatpak-builder/cache/objects/7a/7d6b87a85359529da5b620ce75edd4e9d73655fe5e49ada73e16a1555c64f9.file delete mode 100644 .flatpak-builder/cache/objects/7b/587ba644056f7e84576e24095abdd9e9588f454fdc8a2adfcc78cd183bd65d.dirtree delete mode 100644 .flatpak-builder/cache/objects/7b/68547fe4a83a2a8ef41d7adace44c00e4e66bbc16021ad471805ee80bd0449.file delete mode 100644 .flatpak-builder/cache/objects/7b/e493abcb29b5b86d17e2975126af0d5bf71fcefb46ad53a3227e9d50fe7c73.dirtree delete mode 100644 .flatpak-builder/cache/objects/7b/e688eb5326f83ce7c3b079fc191eca3e34bc58c24530988dfd7ca9df457199.file delete mode 100644 .flatpak-builder/cache/objects/7c/e4fe81f35857aca1d59e3173a6573d06affb09d5a727b44b03b77812036aa5.file delete mode 100644 .flatpak-builder/cache/objects/7d/37b3677c0c8080d4b9974d55fa9227eff4e50160d7d8539966cbfdd5384d14.file delete mode 100644 .flatpak-builder/cache/objects/7d/50fc9e692b7ff8185cceb29360dd6a739c8a6dee2b0fff239c14fc025a6f70.file delete mode 100644 .flatpak-builder/cache/objects/7d/63bbb53fe29598183ed8b5f7012b76918b5b4a148c89da148ae9ff87129bc9.file delete mode 100644 .flatpak-builder/cache/objects/7f/ecc3ae858d1f86c06961af5a4bef36c600617bee1dff8e46876bb3ad2d9991.file delete mode 100644 .flatpak-builder/cache/objects/80/6cd12ce643da178f30b68ae97b6bd8d4971051c20cde0cc70c54b77941d78d.file delete mode 100644 .flatpak-builder/cache/objects/81/403b7e3eba66ff7664b73a11c9746b535b8a437d1dbd7842a7df672c27e533.file delete mode 100644 .flatpak-builder/cache/objects/81/8ad38c06da3963cb0035f858ea7408dddf513a0db4244cf3f22e1d787a0f9e.file delete mode 100644 .flatpak-builder/cache/objects/82/3e819ce4d71e9e070a17c40cbee7c94b4c830a9ab0e6e7b5b835dd96a57c7c.file delete mode 100644 .flatpak-builder/cache/objects/82/76639a9ef84e274a81c2d86dff5a7512fb371501124ae189f6d7bf21fe334a.dirtree delete mode 100644 .flatpak-builder/cache/objects/83/bec69f59dbdf6837ca980995e6c44d183bf25fc8c2b62a365b0ac0dd417b47.file delete mode 100644 .flatpak-builder/cache/objects/84/28af64e195390feb3309272b34ed0d38fd4a3b416ec42866272735422bbb0f.file delete mode 100644 .flatpak-builder/cache/objects/84/3df803e34b6765840c48c895063aebcdf8b45a4f4c1ac0e9088c30da7b6c74.file delete mode 100644 .flatpak-builder/cache/objects/84/7330d3c79a3260564d825460ec10344d4854bbf8a9da1731ded0979e6170d9.file delete mode 100644 .flatpak-builder/cache/objects/84/ec9c62ede3093d9a93d7317b6d1faf4437564ef781f5948d59dd5d5a97530c.file delete mode 100644 .flatpak-builder/cache/objects/85/aa6c39a7f49553e9423feac13f87062e15f679b8db95194288f8172dd9f022.file delete mode 100644 .flatpak-builder/cache/objects/85/b2f885336829dd8f2ac2bc1b9dd2d985848dbaea9fb1a63b73a6e99317e994.file delete mode 100644 .flatpak-builder/cache/objects/86/36899390b825d1987bc2f2f3d9b688cd9f7cb280675f5be84cfc81d3b9db39.file delete mode 100644 .flatpak-builder/cache/objects/86/529a439a093dc3fa2c9e622d3d692714c70683637763c7b19b868965d728c1.file delete mode 100644 .flatpak-builder/cache/objects/86/bded9fddedc4ad138c48df7dd361d02e8083456e0c6b7ec70d07533d503aee.file delete mode 100644 .flatpak-builder/cache/objects/86/f6dfa279c125a269c71b93c589c1f3a1c817f3b507cd3c768611fcc23dfb60.dirtree delete mode 100644 .flatpak-builder/cache/objects/87/9b98bc4a6a4bee5b5ba6cc99f9acb2e878509e917c47bf980864aa7577d646.commit delete mode 100644 .flatpak-builder/cache/objects/87/a302bdd88b3152c89882a7b51be17ea45140265458e6b82c317d5b756bb640.file delete mode 100644 .flatpak-builder/cache/objects/87/adc4d2eb414d438bf0c5cdabec6a84325c46421d607f8c9f2ffa9ed6839017.file delete mode 100644 .flatpak-builder/cache/objects/87/fe1dbc05735fe46e13202bb9d939a7bd015aad96b360f55b7acda944b521d0.file delete mode 100644 .flatpak-builder/cache/objects/88/7aff0cab3d4f078b901f1e72db78e89323f6d337185d89cb8ac8965a443a46.file delete mode 100644 .flatpak-builder/cache/objects/88/e4de5a23b6462d64a0513e1adb9a452bd1fc51d3a76fed5634ab90ce253bd2.file delete mode 100644 .flatpak-builder/cache/objects/89/c6f508485e5dde514e95c702d98212925caa9adc9089c47abe97cd3b4c6e9c.file delete mode 100644 .flatpak-builder/cache/objects/89/caa4a7ebd180b2a8e2be0b5197dff39e85c78f91bae9e2c2a3574ac60a0d01.file delete mode 100644 .flatpak-builder/cache/objects/8a/91ac7d4647fbb3749bf8df63b4aaaa9aa696018269184d8dc5ee7537d4c06f.file delete mode 100644 .flatpak-builder/cache/objects/8b/92f34bb279b3acc1f0df8945fb7419dfd424b04778a982453fc4165785a0b6.file delete mode 100644 .flatpak-builder/cache/objects/8b/ccb0956fee624d1de1be95d3145e29cfa8b339f8177eec0e65029c8c8ad050.file delete mode 100644 .flatpak-builder/cache/objects/8d/ca8d4e884a43d530a275f59b236d7615266833ea4e8ba5bb387f801915b345.file delete mode 100644 .flatpak-builder/cache/objects/8f/0be0c3e97a15efd3d249ebdb12d757806a98bb7a8a81153c0838589badd077.file delete mode 100644 .flatpak-builder/cache/objects/90/6d304624399676c4e54d6067ca0483ebbeca417aedd7ef412ae0ee3fb9d7f5.dirtree delete mode 100644 .flatpak-builder/cache/objects/90/c0cf069c249a34cc1f2227e2a3f8e97c0f361ccc4598c9975c209d806a52a9.file delete mode 100644 .flatpak-builder/cache/objects/91/548b466719e4e32f88f93765375d31d8d5388ca6621f3511be81ef27a9d3dc.file delete mode 100644 .flatpak-builder/cache/objects/91/85b3c144690d758656a5f89161e1ee2cf3b85a4a99e1b881904b562d1d9f48.file delete mode 100644 .flatpak-builder/cache/objects/91/9f3baf822cce36e02aa0f27aa67580a25b37e4e71b09634c1b7c5a48b2b319.file delete mode 100644 .flatpak-builder/cache/objects/92/15c98584be827211e71ae25ef225deece6acb852d3f7284f5292b6849a8743.file delete mode 100644 .flatpak-builder/cache/objects/92/3c0c63b78d986acec6f26984938f9427e206bfcd4855c475483ffea30e014b.file delete mode 100644 .flatpak-builder/cache/objects/92/5a1442524ea428cc10dec131e5749742117f963a3f334ada6f7fd1db26b591.file delete mode 100644 .flatpak-builder/cache/objects/92/5b037a9bcebdec8a52e6d3889f501c748a8b6b12c425cf77abb21a7cf5d875.file delete mode 100644 .flatpak-builder/cache/objects/92/7f129ce373d81cc6e226c187ba53bf8ee8cdc0bfaeb74c5b5d867dd127c0d8.file delete mode 100644 .flatpak-builder/cache/objects/92/b1d71536ae534614509cc699eebda2f4223f784c755d7e42c8a189741e8919.dirtree delete mode 100644 .flatpak-builder/cache/objects/93/b9ae70b1f3ddafc3bb0f392f3ed6495357a4d6c36feec5e730b2b6ea7638b7.dirtree delete mode 100644 .flatpak-builder/cache/objects/94/248d1e70f60699fffa6c293830d0f7700968557234c7c2c6f6162c0d959c70.file delete mode 100644 .flatpak-builder/cache/objects/96/06628a91ebcdf8ba307f197a594d5c774c96259e62b27f814b390106dd247d.file delete mode 100644 .flatpak-builder/cache/objects/96/26985ba4bb0934c77233f9c5e793b819a3f555060389006f2c14484cb6beaa.file delete mode 100755 .flatpak-builder/cache/objects/96/4eae8e2e143a2aede48fef8f22728fdd9a9b48b51181935db3219abbbaee26.file delete mode 100644 .flatpak-builder/cache/objects/96/fbb5df5b106e257c7e38ca977237b8cb5020c8a406a08e0b39787d388c91a7.commit delete mode 100644 .flatpak-builder/cache/objects/97/439a332b31c9ea4ea27646f619ab47422230447e328cd1924030f7c7f23297.file delete mode 100644 .flatpak-builder/cache/objects/99/7434ebf4caa567864ef676f626dc6b1f45ba98271e547d261d186d5f066888.file delete mode 100644 .flatpak-builder/cache/objects/9a/4756cb4d6d40384a0d126fa13f0543c72f676dfe11f8ee1c136ebf287d3cab.file delete mode 100644 .flatpak-builder/cache/objects/9b/2785d45754c90bfb8a7806a91bd45c81033fe43ece6b805a32c045c9d4e9ad.file delete mode 100644 .flatpak-builder/cache/objects/9b/3b5e426c23cd04d330f61b08b2bb3f0ba9e1ae89571cd4561bf8a1b01e5fe1.file delete mode 100755 .flatpak-builder/cache/objects/9b/414ca8481b15c3267a90215d2c649877ff204b75b4ccf00f750fa39f697160.file delete mode 100644 .flatpak-builder/cache/objects/9b/c1b3561572c59203dd638917634bb0f0cd8008e0db056510fb9f46fda05cbc.file delete mode 100644 .flatpak-builder/cache/objects/9b/d3923da5fda855a006a5a2dd3a26cc5405a82527219ad7ee5ba81d3ccf902b.file delete mode 100644 .flatpak-builder/cache/objects/9c/317d6ce157ddd7e5a6cbdf8fcadbf719d21c63badeb5c005a94b3e2f4f3b6c.file delete mode 100644 .flatpak-builder/cache/objects/9e/45a0ac263a712d7fa9398dda6ff0e104c82896412349001e77e7957cddedf9.file delete mode 100755 .flatpak-builder/cache/objects/9f/3c4e4185526008157ed93ac983814a041b5879b563dd06635c726f0da357be.file delete mode 100644 .flatpak-builder/cache/objects/9f/6256fd41ffd57371b6febb6fbdf717c05a0aede813712859bc5cc45f9fd8a8.dirtree delete mode 100644 .flatpak-builder/cache/objects/9f/b25e6e14e089cddb47fecfcc15a0e02dd3a8bb55f73f26eb6a15b3440c50aa.file delete mode 100644 .flatpak-builder/cache/objects/a0/5ce66a86a4e4f62178a7442877c8cce4e7886e82c3b3f31f93ad8128178921.file delete mode 100644 .flatpak-builder/cache/objects/a0/6777143c01b67b748f0c1685f661a25569e5bb5e7a91bb74021dbae462c96f.dirtree delete mode 100644 .flatpak-builder/cache/objects/a0/aac3800a55b071b711cb92dceec9554d936475767cedc038339bb8c20f4149.file delete mode 100644 .flatpak-builder/cache/objects/a1/627eb90640296ad20064f2726614bee3bd6c526e1ad2d9c2508c35f9f72d06.file delete mode 100644 .flatpak-builder/cache/objects/a2/b451a262c4b56b3f590c42b8058d40f4af0ef4181ce51b35c36ac7c7e53012.file delete mode 100644 .flatpak-builder/cache/objects/a4/5e987304538bed876261409137e1c7daad67df8ac9e147e59b31577c0b08a6.file delete mode 100644 .flatpak-builder/cache/objects/a4/6b656e74e448af5083862e7cb859b61f3e5694428f3de770622a8d378cec2d.file delete mode 100644 .flatpak-builder/cache/objects/a4/d56f53b8d2abb2affc1ed8410348c3f12bc3e1caee8e05e3f6fd02dc82c9d3.dirtree delete mode 100644 .flatpak-builder/cache/objects/a5/82585b49b87c76e44f09b2a51aa0c458aab36d8e98a043ca4fddc9ed72b12f.file delete mode 100644 .flatpak-builder/cache/objects/a7/0e40e7b83fde4c39516017cc925c35c12a23c3b5cbb0c87326d03c261de19e.file delete mode 100644 .flatpak-builder/cache/objects/a7/7e126494bc86db147611f11430b3287a0102f47b8f857735290a347109c7ac.file delete mode 100644 .flatpak-builder/cache/objects/a8/19748c70201b6cfde066215a52324806182c99e095b8fb13f0d4d76db1cc3f.dirtree delete mode 100644 .flatpak-builder/cache/objects/a8/4b43506b1941a2f27c7c63f2610dc7efca1deab8befba1ded2840f2c7c698b.dirtree delete mode 100644 .flatpak-builder/cache/objects/a9/1c4babf6cb266ffc56f1f52cd445946511b4f2ce54ec2a857e593b2b712ec6.file delete mode 100644 .flatpak-builder/cache/objects/a9/2eeb5468084a7d6bb9b011ce3e0c30ea7eefb56e9363490e563be60b7d3a48.file delete mode 100644 .flatpak-builder/cache/objects/a9/f04710c77f0f44f64fc0d456058f20f83452683e15ef5a0c535a473011e39e.dirtree delete mode 100644 .flatpak-builder/cache/objects/a9/f4c0d4808bd21d39db033d468450162953f323def0a4daa9ae0165eaeb8ced.file delete mode 100644 .flatpak-builder/cache/objects/aa/99f2f6da3b9d8a6d935c1945979d761b48884c5a8c2f3f3249c938f4a52bc8.file delete mode 100644 .flatpak-builder/cache/objects/aa/d5610af85eb47894eb82d252ced5471b360ac6bac536a6cd950a1f47ed3999.file delete mode 100644 .flatpak-builder/cache/objects/ab/276664e67110ca50abb082ae076aa06fea7bd60feba29b0cf53376920273a7.file delete mode 100644 .flatpak-builder/cache/objects/ab/464fa5d34cd6ca1b93c4cbdbd37dcfedc68a895425cb39c145fa68d2d51ea0.file delete mode 100644 .flatpak-builder/cache/objects/ab/8dd3bd141de591fdd12785a52c9868e788e19667e7b9cd45d8ade1dc7b11f6.file delete mode 100644 .flatpak-builder/cache/objects/ab/ed75e49eb5e290914bd400235c8ac0a6aa0743968626906d3b9a04f54161fb.file delete mode 100644 .flatpak-builder/cache/objects/ab/f7862668fc603befed88624e176b31ee50c1bc6e98010cd71acd3bc8ef97a0.file delete mode 100644 .flatpak-builder/cache/objects/ac/6223562efa9f1983fcfe81cddba820e08a26ca103b86a642c4915b93575977.file delete mode 100644 .flatpak-builder/cache/objects/ac/99fab8bbe5c459afe1934f879ef0005a67821ec30e213c4d3e63b6ea260a13.dirtree delete mode 100644 .flatpak-builder/cache/objects/ac/d138de111fde5cce8239de4558b71abd2aed8e149c72cae1855c54133d4a83.file delete mode 100644 .flatpak-builder/cache/objects/ac/fe083af11ed93315b4ed20ae59c496aa48c25c7a309bb106306406c38fe414.dirtree delete mode 100644 .flatpak-builder/cache/objects/ad/4824b7554c910b65b78154056439972ca2434265a78bd0b2810ea566a83e32.file delete mode 100644 .flatpak-builder/cache/objects/ad/79de6985cfe65ae76b2be3e2fa0e5120817e8f8fb22da97ed9d07f44e6bd6a.file delete mode 100644 .flatpak-builder/cache/objects/ad/d930e71ffc6638a7232b039d4f87df1f191db000881a77a8447710b5fb4f7d.file delete mode 100644 .flatpak-builder/cache/objects/ae/44de01fdb474fb1809ca26d05ea4c50ef51b207849e25594fdb62df28d4a33.file delete mode 100644 .flatpak-builder/cache/objects/ae/e9326c46a3c6e01737b7dd514cb5fdebeb5269dc4d19dc5ae603cd6c121458.file delete mode 100644 .flatpak-builder/cache/objects/af/45cb68365134503dd17c6e45b7f404a9c05a20a54a5b8c1d34e1440ef3268c.file delete mode 100644 .flatpak-builder/cache/objects/af/684b7b3ceb2fb94fdf1e9635286932a5943285b4a96cb0007e00a8cbc4b866.file delete mode 100644 .flatpak-builder/cache/objects/af/a72ded747db83a85f6fbf0175a50fec7926eff8523de4608663767f56e057d.file delete mode 100644 .flatpak-builder/cache/objects/b0/5e2bea8f7c239e5ba6d9a6c04fa15502bfcf8c6df54302e6874cda3dd71e71.file delete mode 100644 .flatpak-builder/cache/objects/b0/f0da604b3b2b1ad09a4dc63f6f4714cfb59d8f96c596aa3f2635c28e1844f1.file delete mode 100644 .flatpak-builder/cache/objects/b1/8de6cdfe2a1b769811260060dd40221e1bcc561c3c802cc93d1c593b01ccfa.file delete mode 100644 .flatpak-builder/cache/objects/b2/182427b64cca34929b7c9677de30b202ee6ec8b1a0e8ea48a2782276325eb5.file delete mode 100755 .flatpak-builder/cache/objects/b2/5c29ff8e575699f8ecd53fbcb9a8da2ff7b229ffaab9d8ca7c7ea78dcb9440.file delete mode 100644 .flatpak-builder/cache/objects/b2/72e308a3dc9456d0f4a2e474024991365dbec54294ff89558b3e7e9ea0a0f5.file delete mode 100644 .flatpak-builder/cache/objects/b3/56ee36b20a205c266045e1b85659147984b565aa95a5285ee8ebf74c85f6af.dirtree delete mode 100644 .flatpak-builder/cache/objects/b3/573f53338ad0a6e9e14bd4aeccc3ba0b557a4b1a73a15a9739ebc2c99ef93a.file delete mode 100644 .flatpak-builder/cache/objects/b3/94fbdb9e436c6621fe8712b278dc2c85e76e3dafead71e67f5d0ce67837235.file delete mode 100644 .flatpak-builder/cache/objects/b3/c8b66a4e2a08bfed32cd6a32608bffc0a1333ef6cf6cb9dc29f60bb8e918dc.file delete mode 100644 .flatpak-builder/cache/objects/b3/fd2764a88557a28fdee20c3da6c6efa0b09621503bd525d384196085753803.file delete mode 100644 .flatpak-builder/cache/objects/b4/1ed4d371b826d7bafb83ae4754e6a77b649ec538dddcb2772711c02a041f68.dirtree delete mode 100644 .flatpak-builder/cache/objects/b4/9c4c369be46f9d5086a2fd441dad2c00af2915cfb58bfe9b05362a9493485c.file delete mode 100644 .flatpak-builder/cache/objects/b5/1f18a25214df5e6d49f45d6b1df6d3a8e8cde4430af62d4c2da9328c484def.file delete mode 100644 .flatpak-builder/cache/objects/b5/b00965825bdd7a42af6bf6ce3c2b88d3141c6180875a3ab4fcd0a504267991.file delete mode 100644 .flatpak-builder/cache/objects/b6/c586db283ca6884f50ee56315401a72933eafc6a3f62f8236adcf6cddb1ca2.file delete mode 100644 .flatpak-builder/cache/objects/b6/df97a4cbfc64ada360f19702816c1b034c4e21b10b033c8ce2011a054e7f4f.file delete mode 100644 .flatpak-builder/cache/objects/b8/6df03d14fb9a4551f7e6dda3988978ca02aab584cd97b23e9ee96a965aedc8.file delete mode 100644 .flatpak-builder/cache/objects/b8/e8cc6fb45053be3a4b9ff5fcb6e4da6fd3b91d11cd88b0dc78362f43e554b3.file delete mode 100644 .flatpak-builder/cache/objects/b9/b3c62dc9293df049a6b6c6c5369ac410974f0025d47b7b3b5dca10b8c05c51.file delete mode 100644 .flatpak-builder/cache/objects/ba/4e11441ae52c0377cfd226f0a87bae9f6ab0fc498af3cb9c3a9f9a6f66fe39.file delete mode 100644 .flatpak-builder/cache/objects/ba/91b85fe7983c51e0c05ea1e103158b339bc1d3fd62d5dc189a1a7227871a1c.file delete mode 100644 .flatpak-builder/cache/objects/bb/c7aa8e50951792b0160c03504197b9aa9fef4f295d1a8ec28f7a77c37da788.file delete mode 100644 .flatpak-builder/cache/objects/bb/ccd698720c1c91ff9527ef79bb898169ad1fd7f84b8c6cc4ec1c466d654917.commit delete mode 100644 .flatpak-builder/cache/objects/bb/cfc1ace0cfc9f62b1122e95ecb3047f0f3beac013bb9638fcb95820fbbbe1b.file delete mode 100644 .flatpak-builder/cache/objects/bc/91d420d3e7978bd81dcb15f30d7f558fafbaedc0713633f402729139d6abf1.file delete mode 100644 .flatpak-builder/cache/objects/bc/a7254a3e0d33bc46b3d2521f9d9b8b2f46542f706d7d443b5dae002c69922a.file delete mode 100644 .flatpak-builder/cache/objects/bc/b02f0c5d1848ac2ab4e1081c8f1a79e83ba21d762976bb76bedd14bac46b6a.file delete mode 100644 .flatpak-builder/cache/objects/bc/b9456a5b06f11c8583fa702c087a35b1b015c3fe70260a5c2d6f4dd1a091f3.file delete mode 100644 .flatpak-builder/cache/objects/bc/c6241a5a8b361d97b2013685b2bfbf1b0da2ecc89ee862dacb6677087c1b44.file delete mode 100644 .flatpak-builder/cache/objects/bd/1dfcbd4885b8b4125debe28494ce7bece98d9a4946cd09791b858aaa4f1510.file delete mode 100644 .flatpak-builder/cache/objects/bd/a6ceb7ca8b62ce4a96b8871f035f68032105f280e0b77da3e85f3d0dfed31e.file delete mode 100644 .flatpak-builder/cache/objects/bd/e827fbec09347f1e238175658b9cde48ddcea9f7e021163cfce2951b4d7931.file delete mode 100644 .flatpak-builder/cache/objects/be/b4bc5708f1ab72863f68ccb858c6cb2e9a3e4c65609c90c206165acdca4abc.file delete mode 100644 .flatpak-builder/cache/objects/c0/3d55fd88434c145ab5616c7a584bb521de605d836a3662b2d4efe560052741.file delete mode 100644 .flatpak-builder/cache/objects/c0/3efd32de53393d93fb2be21e6a85f141dcb7079f7d57f6b136c8849a2f247a.dirtree delete mode 100644 .flatpak-builder/cache/objects/c1/a9ab41abc1f3c7c311b1495cc6feeed36898d600e500317fd5f61b667774dd.file delete mode 100644 .flatpak-builder/cache/objects/c1/b3f3e6f952ad792903623d27820b032bf2789cc669feeaa65dad490a6f7163.file delete mode 100644 .flatpak-builder/cache/objects/c2/23bf442b5d35d36e99773da868dc0d0e5ff5047d722b50bd5c7e81ab704d84.file delete mode 100644 .flatpak-builder/cache/objects/c2/874fe9b02939f9dc93d28206fccc42b665a6a32610397ff3d060dee14327a1.file delete mode 100644 .flatpak-builder/cache/objects/c2/9f4427c806011241969d91b5d08ec2c52a34f11e9deb9a0d5fb5b00b03afa2.dirtree delete mode 100644 .flatpak-builder/cache/objects/c2/a63553717cf48b835df8cf9a186adf45962d51a9e91f565c2929f4920257d8.file delete mode 100644 .flatpak-builder/cache/objects/c3/635b4880eedf1d24490e94a7b448a7478af597a74c359e5462ee15be302ae3.dirtree delete mode 120000 .flatpak-builder/cache/objects/c3/90d75fb7f5f8912d2661c6c34e92c33f4c73f38438be47a6fe3ca20bb672e4.file delete mode 100644 .flatpak-builder/cache/objects/c3/af4577c8557bd06181e388b22ecdb717c22309501ff6ab0a05ef7be6e0427e.file delete mode 100644 .flatpak-builder/cache/objects/c4/13c2609a068958b3b31348974b1a4a69bb5f24846d3f99789e337a3209c4a3.file delete mode 100644 .flatpak-builder/cache/objects/c4/23288c8104dcba78e08a50c338e4b3276811ee77a14544059e07c6f127bd63.file delete mode 100644 .flatpak-builder/cache/objects/c4/39852bdc84512611fb6972749b0a65cc9bd4d3399bff0d0a28be4f0cf1235b.file delete mode 100644 .flatpak-builder/cache/objects/c4/e08e6a26238fb81cd4315a9eb44d22b86d134e066f3952424e21f75d80e1b5.dirtree delete mode 100644 .flatpak-builder/cache/objects/c5/190a45bfdd44f82065f26cef395ac07fc516cca04766b930d60cf853604a3f.file delete mode 100644 .flatpak-builder/cache/objects/c5/965c5925db363a86f5c354e18a1734ce56e8896c7cf5b06875530bde4f78d9.file delete mode 100644 .flatpak-builder/cache/objects/c6/90a6ca66646535bfc8756346024ab878c24ca437d0c2b71261b0d5a8ceb58f.file delete mode 100644 .flatpak-builder/cache/objects/c6/96415d0ff7b99074e5351f1c5d8e81fd77db03599daba616e4eaa7c800c35d.dirtree delete mode 100644 .flatpak-builder/cache/objects/c7/36d6f7d3f13ee53c11233f360e0a2326b9617b0ac500029ed06e17207ce177.file delete mode 100644 .flatpak-builder/cache/objects/c7/6a0784442e766d7780632f126542dd1d8714a9bb87d0d65cfcf209c49ceff4.file delete mode 100755 .flatpak-builder/cache/objects/c7/ee5570d5649a41266d66b31b0e12e138a1450cee8edd47fc7ae93405bcb1c0.file delete mode 100644 .flatpak-builder/cache/objects/c8/f2e9a88b9d8de791dd66803b6e5ce83be7eca96685cc489ff5660ae07f4779.file delete mode 100644 .flatpak-builder/cache/objects/c9/d893a3d4528acc4369b3e6d9f6b28e59c323a378a107c90a4a5e7f9309f9b1.file delete mode 100644 .flatpak-builder/cache/objects/c9/eec5934c7ed61f0e156e75f8441ed50b7fd8bc261bae1493785a825f5c7001.file delete mode 100644 .flatpak-builder/cache/objects/ca/5094939afbc20a7ab07f42a2285075428826d5f1c80c01b305647688b97530.file delete mode 100644 .flatpak-builder/cache/objects/cb/4e1c3041a5ac66d7664a1fe01549257c689e60286537ec37cfa329405ad5f5.file delete mode 100644 .flatpak-builder/cache/objects/cb/5ac10e2021d640632a7479940ec64c11bf924bf52347e8e7222414b149bfe3.file delete mode 100644 .flatpak-builder/cache/objects/cb/6cb0dca60c45dd952cdbdad97d808c1f34e51e4d39e7927f64e241a8d2e5f8.file delete mode 100644 .flatpak-builder/cache/objects/cb/814a65507a4228ff4d8d3c286980dca7de5033beddf54850202957b0f41814.file delete mode 100644 .flatpak-builder/cache/objects/cb/d277d10e4b2dca8a9d81b4a5e1ccb06278e0517606520168ced99cf8c21410.file delete mode 100644 .flatpak-builder/cache/objects/cc/700d46f407c6c5ab2d5dde474366a928b7398277e61162e7f8ec06f469f07e.file delete mode 100755 .flatpak-builder/cache/objects/cc/df4fd6dad67e7b17321a979ad8489ea7511260e238951e1efa363df774adaa.file delete mode 100644 .flatpak-builder/cache/objects/cd/3c930bea6b8ec60b9b1ed2638e333eaf07a77f6b100039875196b8d5107bd4.file delete mode 100644 .flatpak-builder/cache/objects/ce/eb55f1e7b2ce4acf98aff7377041f1e0781e03025877403326a9b586721af9.file delete mode 100644 .flatpak-builder/cache/objects/cf/2b9cea3012aa0ccfa55b170b80b7a3dcd9ff7398f2e8219d916180fee97250.file delete mode 100644 .flatpak-builder/cache/objects/cf/5e7c556838a6756cf3c571d0cc77e94c4cac8bf70201106c651a06dfd10079.dirtree delete mode 100644 .flatpak-builder/cache/objects/cf/62f20ecb956b0b629d43fba9b391d0ad143d957e953765ee514c85b066874f.file delete mode 100644 .flatpak-builder/cache/objects/cf/6e16faf936c3d769c30ac04cc90b1978687ef78e913b737ee8c7a6aa5d7e1e.file delete mode 100644 .flatpak-builder/cache/objects/cf/88c5e96232ea712e96e84be4f63b747a3bd8fe36ade8275f4ce2cb6f17503b.file delete mode 100644 .flatpak-builder/cache/objects/d0/180f9d4c0fa1fae69f3f03ed42d9bf3bb6ff7cc80430b504342db9530fc138.file delete mode 100644 .flatpak-builder/cache/objects/d0/5e4e60807ec086edaca8208b10abccb864cf4bf068f625522eb2c06d2e9598.file delete mode 100644 .flatpak-builder/cache/objects/d0/f62e62f4477009721ff8e8836fc8e305253341534a10f437363c471c43a439.file delete mode 100644 .flatpak-builder/cache/objects/d2/dc8774eec3d9802c493603481b78b109a36d9198912ad0d668d47da812df2a.file delete mode 100644 .flatpak-builder/cache/objects/d3/0dc2b544fad93a0219aa7a376698686c57ef6433e6db5369a6c1dbbdbbc449.file delete mode 100644 .flatpak-builder/cache/objects/d3/1836a5697ca9b8d607c797c11f781757387fa554705937e47702aa58d26ce7.file delete mode 100644 .flatpak-builder/cache/objects/d3/c6a7d8c4933c76d1abfc8ab1d3062fd2be15cececf125c7082442e2cdcee81.dirtree delete mode 100644 .flatpak-builder/cache/objects/d3/cb9f26ced66d0243160a22461632b29425385c5a6cb94b8baa79e590c95166.file delete mode 100644 .flatpak-builder/cache/objects/d3/d2483094be9722537718ac371079e1be4b2f5cd56383addbabf3ed901efcd8.file delete mode 100644 .flatpak-builder/cache/objects/d4/2fed1475cbf53c22f12e789f4049889edb206fbb43750c6fdd946b8c391917.file delete mode 100644 .flatpak-builder/cache/objects/d4/7c59d5e67168ddc16aa249569734baa73f93e01e4fd56a81882507775cbd81.dirtree delete mode 100644 .flatpak-builder/cache/objects/d4/b1ab61cda4a6b3dc196e4f327e146b6e5193a8c75885157052c2c37902ac9f.file delete mode 100644 .flatpak-builder/cache/objects/d6/c14bb7343038ee92f1288ca8bded7791b9b27ddd042b3896308e923f841558.dirtree delete mode 100644 .flatpak-builder/cache/objects/d6/d88e69be36335659d1c8a6dafdea895d0ae6ce8b5502215a79a37c316b1ab1.file delete mode 100644 .flatpak-builder/cache/objects/d7/01ab90c04affebb6980c02702a8cc5dc129e80344138f126fd560c55dcfcec.dirtree delete mode 100644 .flatpak-builder/cache/objects/d7/80260720d46f97480e7554699aebe5a5e18c0265cd378b1ef0c6ea98caf57f.file delete mode 100644 .flatpak-builder/cache/objects/d7/8b579cfb3e939b986312f1a54488e0d5dbcd01ec37c8069c71ae8784578ca1.file delete mode 100644 .flatpak-builder/cache/objects/d9/8d04a8e9e72cca595881b621e6a5a52b5625003a8c7fe8084ec21073d4f1b4.file delete mode 100644 .flatpak-builder/cache/objects/d9/9d66584eeefe3e9ac461a10be0c1c9b3dfa7164af13f69def272b0e9b7b38e.file delete mode 100644 .flatpak-builder/cache/objects/da/123cc0d42a5c0ffa0083335193361d0d04a0d8f9047c3e154890954d8dd460.file delete mode 100644 .flatpak-builder/cache/objects/da/d9c100a9eed6f8904282c8d9908d63699afe36c1a90a92edaec07d60988762.file delete mode 100644 .flatpak-builder/cache/objects/da/ded255f82783a5e312d9353e4597b4b855ed49be67418fb733017653707542.file delete mode 100644 .flatpak-builder/cache/objects/da/e1fb738d7395e46d8694dc616f4306737a30c47b0638ceea4266b5273d973e.dirtree delete mode 100644 .flatpak-builder/cache/objects/db/9f2a0f40f20d77b1510f4441993595801f892dbba0867604a6606ec7cc9ee2.dirtree delete mode 100644 .flatpak-builder/cache/objects/dc/1ff86869fd56cbf94cc5c642fa01e00ee68dcdcd631e36044db500eed095a0.dirtree delete mode 100644 .flatpak-builder/cache/objects/dc/529d95da10fabb9e81de373c334d6c7a4819fea3ee41c2b2222de50baa8c90.dirtree delete mode 100644 .flatpak-builder/cache/objects/dc/6f196e15bbe23d627112e356db7ebc2436cf5f171f652b985f01f5b1a3986e.file delete mode 100644 .flatpak-builder/cache/objects/dc/9d3e03dfb8ae15e928f96aca573c6259e8c4fc71e040920bc9ac4b4f021eec.dirtree delete mode 100644 .flatpak-builder/cache/objects/dc/b6a9c50aa0a7069df4910b2474ddfee209c9b1f6035dfb6a7f5f5aab3c1d6f.file delete mode 100644 .flatpak-builder/cache/objects/dd/6bb2c15a9455b7cf69c0848b02e39713a2113cf89cae55b6ed8c7ca3e2a458.dirtree delete mode 100644 .flatpak-builder/cache/objects/dd/c271270b3c3e780296fd637a90f6a9696ba8858c5f61c7510cc59d8625fdd3.file delete mode 100644 .flatpak-builder/cache/objects/dd/cef9b2f2e776ddfa818300ae45588b3bb3caa1961b535ba8b925ea1a19e96c.file delete mode 100644 .flatpak-builder/cache/objects/dd/ebb8639f9bc1e3c8aa9d9e9101fa7cd4edd8542fd820f6bbd302ce6290c05f.file delete mode 100644 .flatpak-builder/cache/objects/de/390678f4ef4f1f99c6f8bc38c9186f006ad3620778a4ed0c28183f17c707ea.file delete mode 100644 .flatpak-builder/cache/objects/de/e344397a2eb463b280c2eb562a8d14df6d1f0bd5430c1739fac3abd7a99abd.file delete mode 100644 .flatpak-builder/cache/objects/e0/44b9b1b7b956ea1a0646954aec3d7359b5b70291235600441de6ca7b2ad8b2.dirtree delete mode 100644 .flatpak-builder/cache/objects/e0/7c49062be8f0b22589f702c3dc2281bcd3de170026fb855f6fada4df5da5be.file delete mode 100644 .flatpak-builder/cache/objects/e0/e7278daec6c7854df9b81f060e02cb3b0b302880e078c770398b788b9f190d.dirtree delete mode 100644 .flatpak-builder/cache/objects/e1/0389c85992aa78d2ac085a565d512645845ecc320d6f6cf327064e015419d7.dirtree delete mode 100644 .flatpak-builder/cache/objects/e3/1bbc78df1e7efad64b0cdcbb982e8555e4e9ad2b19e02d51d23a4499c2eff6.file delete mode 100644 .flatpak-builder/cache/objects/e3/21f5f4d9cbda7c5f2f13cac385ecf1cc59a95b0b4e1810666e35dc83ae7e19.file delete mode 100644 .flatpak-builder/cache/objects/e3/669492b424822854cccc4637f1f18583f85efae05fcdf1b5f26cfc53e37d31.file delete mode 100644 .flatpak-builder/cache/objects/e3/6fb346f0d6ff0dee96a2cbba2ef85fa9141f0ef81f7b811a091a2ab90faa22.file delete mode 100644 .flatpak-builder/cache/objects/e3/ae9cf47d04e8c9e20136d1cb1e20f37d3b2d8f5e602d976bf4804beda951bb.file delete mode 100755 .flatpak-builder/cache/objects/e3/f838019982b396cb8e386a80ad0a05fec4b76ef76da8911e2d5c042f519373.file delete mode 100644 .flatpak-builder/cache/objects/e4/43b1b8d77fcd29191add24031e3d2063de5c06f6b794639a96345f92e86dfb.dirtree delete mode 100644 .flatpak-builder/cache/objects/e5/83cfd8965f5f1114a3939a0f4a9040583765a8c2cac5e9d1ac22ef4224e2ee.dirtree delete mode 100644 .flatpak-builder/cache/objects/e5/b8a2960f9f289cc422f557c44283320693349e11c2260b38079896ee6f7ffe.file delete mode 100644 .flatpak-builder/cache/objects/e6/c6bf56838ec5562bbe76cf0b70b1dbe913eadd3758e1cde36061283413f9ae.file delete mode 100644 .flatpak-builder/cache/objects/e7/51a3ebd676ff8a0ac67d9a8aa750696ac71d2812e8785d37801267ced5b0e2.file delete mode 100644 .flatpak-builder/cache/objects/e8/814978884fb4cb11f824aa0fb54942f48ddfba00fd8c06c8d2448a61ed28b0.file delete mode 100644 .flatpak-builder/cache/objects/e8/fdac5f8f0b69133908391cffd41693ec51a7bf0dbede3443b9a557cefead1e.file delete mode 100644 .flatpak-builder/cache/objects/e9/fe519e7f361e52d3a705a1d6b2b07a363770fea7d006fb61e5ce279b249342.file delete mode 100644 .flatpak-builder/cache/objects/ea/a543eb168cfd33d95f4837c0fd58bea9de06af20aa1b09164309f6fa634f6d.file delete mode 100644 .flatpak-builder/cache/objects/eb/135bc6960c176a438784d7708459acb02053b6809347ad2c3a3009abaf0ff1.file delete mode 100644 .flatpak-builder/cache/objects/ec/295fc47c540db870d3ff79938201ec50d1c84223e3ad0e625c202da64152b0.file delete mode 100644 .flatpak-builder/cache/objects/ef/38d3c319f5d754d199a4c68c73b74146a9748ce4c47cede726a7938dab172c.file delete mode 100644 .flatpak-builder/cache/objects/ef/3d9a8cd03e4a0060b5bcb7ccadb0ee16d1c32b8a9064f80ae15d5803634bfa.file delete mode 100644 .flatpak-builder/cache/objects/ef/c410c4e73309e3c04a7aedfdcb29faba04927ed449c05d397129d735f40eb5.dirtree delete mode 100644 .flatpak-builder/cache/objects/f0/3382fee73ca4b18e5eea2e9b857948b7f554de43672926da95f0f7b17a8b06.file delete mode 100644 .flatpak-builder/cache/objects/f0/ab29bc618acd5c31828292d06c869d9ff5a1a0974eeed0d595adefd2b4010b.file delete mode 100644 .flatpak-builder/cache/objects/f0/d7622b4ece0bb423af0c1d238a3077650dd7f03388e16aed1d19c5d908d627.file delete mode 100644 .flatpak-builder/cache/objects/f1/ae97e1b44ec3abeae7b9ddfc585bc204ec4300b49a85281df9c52fddfbcf9e.dirtree delete mode 100644 .flatpak-builder/cache/objects/f2/0d177926577aa23c608ea074425f6e7746daec7e3bb7dd2e8f2679e4ff36fb.file delete mode 100644 .flatpak-builder/cache/objects/f2/616204246e2daf3ba1968c11ef6f10986534232887de0d47f2a4a023dcfc35.file delete mode 100644 .flatpak-builder/cache/objects/f2/d3d9f58fe267e8919b21608bf055ddcba11aff25dd1f0d892a0dccba766ebd.file delete mode 100644 .flatpak-builder/cache/objects/f4/0730781710499bbb8069e361953304dc9497fd11c408a02d71b822f95d5713.file delete mode 100644 .flatpak-builder/cache/objects/f5/25352269f5dd843db676bb3e76a302f46e5d9e19b9c8236d4b353ebde9a239.file delete mode 100644 .flatpak-builder/cache/objects/f5/c10b539fe42924e49f448c13034cb35a6004886a915e745042766979a1e612.file delete mode 100644 .flatpak-builder/cache/objects/f6/6ee9f46d7d1da6fda7d2159cf0b9b1dd7e203f756ab64eb2c2efa0a5acbe52.file delete mode 100644 .flatpak-builder/cache/objects/f7/8671146cf57cbfe450b2da146e69db02079e95d9364d04bed2cc9f261bf9f6.dirtree delete mode 100644 .flatpak-builder/cache/objects/f8/165ed4203f3f8ba37a300488b519fce6386b2a5fecaa655461e4d26ee5c728.file delete mode 100644 .flatpak-builder/cache/objects/f8/c8e9285defd0f82c18ed8cdd1ecfd9912ba2cd8aa2a2f10b3021089a7caf18.file delete mode 100644 .flatpak-builder/cache/objects/f9/0fe07fa8d216874bd3a98133caacb0dcccca6a3e10af2db1c11b5f0a4587b3.dirtree delete mode 100644 .flatpak-builder/cache/objects/f9/d67fede3273cb186c3ba3a92c04c8c4de66677394eb814468dcdb1cadd3a17.dirtree delete mode 100644 .flatpak-builder/cache/objects/f9/f69012e1d721d4b18c3d6ed29b42ec6a8cf8a83b80f937fa9da1c9522ccb57.file delete mode 100644 .flatpak-builder/cache/objects/fa/7cdf7d5970711b68d36a4c9e3adff45aa30f0377593558e003eb3dc563d192.file delete mode 100644 .flatpak-builder/cache/objects/fa/a1db8faec02c8fd69a62f927d0b55408e1cd2a3dc199380583f49f8bd4f7a8.dirtree delete mode 100644 .flatpak-builder/cache/objects/fb/00afbab3820d4b3aabc535a67d0c78220ed9a41ee914253f67716282030c86.file delete mode 100644 .flatpak-builder/cache/objects/fb/9495d78d646b5c62c10322e8135d3488e433fe661a513a11db13ab106dcdc7.file delete mode 100644 .flatpak-builder/cache/objects/fb/b9a1683cc2d19595780cc03ce3313610e512a46a653007d81183b45e7b521d.dirtree delete mode 100644 .flatpak-builder/cache/objects/fd/5d58980e8e739d6250894b1de9fa604f034d19653a8125ad02b58b5788cda3.file delete mode 100644 .flatpak-builder/cache/objects/fd/dfbc766024609c5eeb7244ef9072436bf61c13141bd5e959e98ea17badf1d5.file delete mode 100644 .flatpak-builder/cache/objects/fe/24a4f810aac89bfd31a15289992fde79acec80c56afa9cf31035c81dcbe4c1.file delete mode 100644 .flatpak-builder/cache/objects/fe/36e81aa26bb29e53d0ffc5b03bcbb9726726618bc8a8bd9077b9fc9253bb56.file delete mode 100644 .flatpak-builder/cache/objects/fe/45e8a17f9f18019514eb4a42dd462e8d787b45cc626b5af65306f0288e2fa0.dirtree delete mode 100644 .flatpak-builder/cache/objects/fe/71b431d63c1ff835f66e3eac369df288223015edca2f3f01fef609d4cb4a0b.file delete mode 100644 .flatpak-builder/cache/objects/fe/a4989beaf4ee67f567a59cff8e20d9437d2475d5f3ff58811c171f9a3a2df5.file delete mode 100644 .flatpak-builder/cache/objects/fe/e96c3500f5239ec76dd088a1eeff0479a2159d19cbbc09a9274066458bcc85.file delete mode 100644 .flatpak-builder/cache/objects/ff/953de08a1e16cd3d1894c01491168d9d943dd293607346d829cb0d6f38a6cf.dirtree delete mode 100644 .flatpak-builder/cache/objects/ff/d30fc42ae17506bdf2e56db58d86c8d58a05096a2d159bf70922c224a189b9.file delete mode 100644 .flatpak-builder/cache/refs/heads/x86_64-com.jeffser.Alpaca.json/build-alpaca delete mode 100644 .flatpak-builder/cache/refs/heads/x86_64-com.jeffser.Alpaca.json/build-python3-pillow delete mode 100644 .flatpak-builder/cache/refs/heads/x86_64-com.jeffser.Alpaca.json/build-python3-requests delete mode 100644 .flatpak-builder/cache/refs/heads/x86_64-com.jeffser.Alpaca.json/cleanup delete mode 100644 .flatpak-builder/cache/refs/heads/x86_64-com.jeffser.Alpaca.json/finish delete mode 100644 .flatpak-builder/cache/refs/heads/x86_64-com.jeffser.Alpaca.json/init delete mode 120000 .flatpak-builder/ccache/bin/c++ delete mode 120000 .flatpak-builder/ccache/bin/cc delete mode 120000 .flatpak-builder/ccache/bin/g++ delete mode 120000 .flatpak-builder/ccache/bin/gcc delete mode 100644 .flatpak-builder/checksums/x86_64-com.jeffser.Alpaca.json delete mode 100644 .flatpak-builder/downloads/450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d/urllib3-2.2.1-py3-none-any.whl delete mode 100644 .flatpak-builder/downloads/58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f/requests-2.31.0-py3-none-any.whl delete mode 100644 .flatpak-builder/downloads/82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0/idna-3.7-py3-none-any.whl delete mode 100644 .flatpak-builder/downloads/9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d/pillow-10.3.0.tar.gz delete mode 100644 .flatpak-builder/downloads/dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1/certifi-2024.2.2-py3-none-any.whl delete mode 100644 .flatpak-builder/downloads/f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5/charset-normalizer-3.3.2.tar.gz delete mode 100644 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/FETCH_HEAD delete mode 100644 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/HEAD delete mode 100644 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/config delete mode 100644 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/description delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/applypatch-msg.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/commit-msg.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/fsmonitor-watchman.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/post-update.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/pre-applypatch.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/pre-commit.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/pre-merge-commit.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/pre-push.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/pre-rebase.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/pre-receive.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/prepare-commit-msg.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/push-to-checkout.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/sendemail-validate.sample delete mode 100755 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/hooks/update.sample delete mode 100644 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/info/exclude delete mode 100644 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/objects/pack/pack-95b98d16360af4d913470d283fcd08ac3c8d04f8.idx delete mode 100644 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/objects/pack/pack-95b98d16360af4d913470d283fcd08ac3c8d04f8.pack delete mode 100644 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/objects/pack/pack-95b98d16360af4d913470d283fcd08ac3c8d04f8.rev delete mode 100644 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/refs/heads/main delete mode 100644 .flatpak-builder/git/file_home_tentri_Documents_Alpaca/shallow delete mode 100644 .flatpak-builder/rofiles/rofiles-dJuXhv-lock diff --git a/.flatpak-builder/cache/.lock b/.flatpak-builder/cache/.lock deleted file mode 100644 index e69de29..0000000 diff --git a/.flatpak-builder/cache/config b/.flatpak-builder/cache/config deleted file mode 100644 index 7dfbc01..0000000 --- a/.flatpak-builder/cache/config +++ /dev/null @@ -1,4 +0,0 @@ -[core] -repo_version=1 -mode=bare-user-only -min-free-space-percent=0 diff --git a/.flatpak-builder/cache/objects/00/8ca6dc3d036ab5ac7826d21b1fbda092f79ee9557577238b2a32c74ee7373a.file b/.flatpak-builder/cache/objects/00/8ca6dc3d036ab5ac7826d21b1fbda092f79ee9557577238b2a32c74ee7373a.file deleted file mode 100644 index 9b2b6f94146fa2b738cae1cb2ec774c13686d091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12715 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 diff --git a/.flatpak-builder/cache/objects/00/edfaf10b763825b43196f68ef522f8b8ed52391f37de9e43f1236ecf628c22.file b/.flatpak-builder/cache/objects/00/edfaf10b763825b43196f68ef522f8b8ed52391f37de9e43f1236ecf628c22.file deleted file mode 100644 index f6abf04860e9a17cb950906cdfd1b89b42957e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45792 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 diff --git a/.flatpak-builder/cache/objects/01/8eb14ab04783910f52d398c5f1b827464ac723a43fc799b3037e30fd903ff6.file b/.flatpak-builder/cache/objects/01/8eb14ab04783910f52d398c5f1b827464ac723a43fc799b3037e30fd903ff6.file deleted file mode 100644 index 7990a6e..0000000 --- a/.flatpak-builder/cache/objects/01/8eb14ab04783910f52d398c5f1b827464ac723a43fc799b3037e30fd903ff6.file +++ /dev/null @@ -1,30 +0,0 @@ -The Python Imaging Library (PIL) is - - Copyright © 1997-2011 by Secret Labs AB - Copyright © 1995-2011 by Fredrik Lundh and contributors - -Pillow is the friendly PIL fork. It is - - Copyright © 2010-2024 by Jeffrey A. Clark and contributors - -Like PIL, Pillow is licensed under the open source HPND License: - -By obtaining, using, and/or copying this software and/or its associated -documentation, you agree that you have read, understood, and will comply -with the following terms and conditions: - -Permission to use, copy, modify and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appears in all copies, and that -both that copyright notice and this permission notice appear in supporting -documentation, and that the name of Secret Labs AB or the author not be -used in advertising or publicity pertaining to distribution of the software -without specific, written prior permission. - -SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, -INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. diff --git a/.flatpak-builder/cache/objects/03/5071e58e56d3422ac6950970d85ac79b6744530552207261222b4e34b62e5e.file b/.flatpak-builder/cache/objects/03/5071e58e56d3422ac6950970d85ac79b6744530552207261222b4e34b62e5e.file deleted file mode 100644 index 216ec29112213d996f631df731edc2fee4cd2a4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12048 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 diff --git a/.flatpak-builder/cache/objects/03/b6817a08fcdc580506d19ee2b1a33fc4ee8ab04d8e9808f93cf9da6c891588.file b/.flatpak-builder/cache/objects/03/b6817a08fcdc580506d19ee2b1a33fc4ee8ab04d8e9808f93cf9da6c891588.file deleted file mode 100644 index 0ba08e3..0000000 --- a/.flatpak-builder/cache/objects/03/b6817a08fcdc580506d19ee2b1a33fc4ee8ab04d8e9808f93cf9da6c891588.file +++ /dev/null @@ -1,626 +0,0 @@ -import logging -from os import PathLike -from typing import BinaryIO, List, Optional, Set, Union - -from .cd import ( - coherence_ratio, - encoding_languages, - mb_encoding_languages, - merge_coherence_ratios, -) -from .constant import IANA_SUPPORTED, TOO_BIG_SEQUENCE, TOO_SMALL_SEQUENCE, TRACE -from .md import mess_ratio -from .models import CharsetMatch, CharsetMatches -from .utils import ( - any_specified_encoding, - cut_sequence_chunks, - iana_name, - identify_sig_or_bom, - is_cp_similar, - is_multi_byte_encoding, - should_strip_sig_or_bom, -) - -# Will most likely be controversial -# logging.addLevelName(TRACE, "TRACE") -logger = logging.getLogger("charset_normalizer") -explain_handler = logging.StreamHandler() -explain_handler.setFormatter( - logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") -) - - -def from_bytes( - sequences: Union[bytes, bytearray], - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.2, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Given a raw bytes sequence, return the best possibles charset usable to render str objects. - If there is no results, it is a strong indicator that the source is binary/not text. - By default, the process will extract 5 blocks of 512o each to assess the mess and coherence of a given sequence. - And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. - - The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page - but never take it for granted. Can improve the performance. - - You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that - purpose. - - This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. - By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' - toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. - Custom logging format and handler can be set manually. - """ - - if not isinstance(sequences, (bytearray, bytes)): - raise TypeError( - "Expected object of type bytes or bytearray, got: {0}".format( - type(sequences) - ) - ) - - if explain: - previous_logger_level: int = logger.level - logger.addHandler(explain_handler) - logger.setLevel(TRACE) - - length: int = len(sequences) - - if length == 0: - logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level or logging.WARNING) - return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) - - if cp_isolation is not None: - logger.log( - TRACE, - "cp_isolation is set. use this flag for debugging purpose. " - "limited list of encoding allowed : %s.", - ", ".join(cp_isolation), - ) - cp_isolation = [iana_name(cp, False) for cp in cp_isolation] - else: - cp_isolation = [] - - if cp_exclusion is not None: - logger.log( - TRACE, - "cp_exclusion is set. use this flag for debugging purpose. " - "limited list of encoding excluded : %s.", - ", ".join(cp_exclusion), - ) - cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] - else: - cp_exclusion = [] - - if length <= (chunk_size * steps): - logger.log( - TRACE, - "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", - steps, - chunk_size, - length, - ) - steps = 1 - chunk_size = length - - if steps > 1 and length / steps < chunk_size: - chunk_size = int(length / steps) - - is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE - is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE - - if is_too_small_sequence: - logger.log( - TRACE, - "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( - length - ), - ) - elif is_too_large_sequence: - logger.log( - TRACE, - "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( - length - ), - ) - - prioritized_encodings: List[str] = [] - - specified_encoding: Optional[str] = ( - any_specified_encoding(sequences) if preemptive_behaviour else None - ) - - if specified_encoding is not None: - prioritized_encodings.append(specified_encoding) - logger.log( - TRACE, - "Detected declarative mark in sequence. Priority +1 given for %s.", - specified_encoding, - ) - - tested: Set[str] = set() - tested_but_hard_failure: List[str] = [] - tested_but_soft_failure: List[str] = [] - - fallback_ascii: Optional[CharsetMatch] = None - fallback_u8: Optional[CharsetMatch] = None - fallback_specified: Optional[CharsetMatch] = None - - results: CharsetMatches = CharsetMatches() - - sig_encoding, sig_payload = identify_sig_or_bom(sequences) - - if sig_encoding is not None: - prioritized_encodings.append(sig_encoding) - logger.log( - TRACE, - "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", - len(sig_payload), - sig_encoding, - ) - - prioritized_encodings.append("ascii") - - if "utf_8" not in prioritized_encodings: - prioritized_encodings.append("utf_8") - - for encoding_iana in prioritized_encodings + IANA_SUPPORTED: - if cp_isolation and encoding_iana not in cp_isolation: - continue - - if cp_exclusion and encoding_iana in cp_exclusion: - continue - - if encoding_iana in tested: - continue - - tested.add(encoding_iana) - - decoded_payload: Optional[str] = None - bom_or_sig_available: bool = sig_encoding == encoding_iana - strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( - encoding_iana - ) - - if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: - logger.log( - TRACE, - "Encoding %s won't be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", - encoding_iana, - ) - continue - if encoding_iana in {"utf_7"} and not bom_or_sig_available: - logger.log( - TRACE, - "Encoding %s won't be tested as-is because detection is unreliable without BOM/SIG.", - encoding_iana, - ) - continue - - try: - is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana) - except (ModuleNotFoundError, ImportError): - logger.log( - TRACE, - "Encoding %s does not provide an IncrementalDecoder", - encoding_iana, - ) - continue - - try: - if is_too_large_sequence and is_multi_byte_decoder is False: - str( - sequences[: int(50e4)] - if strip_sig_or_bom is False - else sequences[len(sig_payload) : int(50e4)], - encoding=encoding_iana, - ) - else: - decoded_payload = str( - sequences - if strip_sig_or_bom is False - else sequences[len(sig_payload) :], - encoding=encoding_iana, - ) - except (UnicodeDecodeError, LookupError) as e: - if not isinstance(e, LookupError): - logger.log( - TRACE, - "Code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - tested_but_hard_failure.append(encoding_iana) - continue - - similar_soft_failure_test: bool = False - - for encoding_soft_failed in tested_but_soft_failure: - if is_cp_similar(encoding_iana, encoding_soft_failed): - similar_soft_failure_test = True - break - - if similar_soft_failure_test: - logger.log( - TRACE, - "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", - encoding_iana, - encoding_soft_failed, - ) - continue - - r_ = range( - 0 if not bom_or_sig_available else len(sig_payload), - length, - int(length / steps), - ) - - multi_byte_bonus: bool = ( - is_multi_byte_decoder - and decoded_payload is not None - and len(decoded_payload) < length - ) - - if multi_byte_bonus: - logger.log( - TRACE, - "Code page %s is a multi byte encoding table and it appear that at least one character " - "was encoded using n-bytes.", - encoding_iana, - ) - - max_chunk_gave_up: int = int(len(r_) / 4) - - max_chunk_gave_up = max(max_chunk_gave_up, 2) - early_stop_count: int = 0 - lazy_str_hard_failure = False - - md_chunks: List[str] = [] - md_ratios = [] - - try: - for chunk in cut_sequence_chunks( - sequences, - encoding_iana, - r_, - chunk_size, - bom_or_sig_available, - strip_sig_or_bom, - sig_payload, - is_multi_byte_decoder, - decoded_payload, - ): - md_chunks.append(chunk) - - md_ratios.append( - mess_ratio( - chunk, - threshold, - explain is True and 1 <= len(cp_isolation) <= 2, - ) - ) - - if md_ratios[-1] >= threshold: - early_stop_count += 1 - - if (early_stop_count >= max_chunk_gave_up) or ( - bom_or_sig_available and strip_sig_or_bom is False - ): - break - except ( - UnicodeDecodeError - ) as e: # Lazy str loading may have missed something there - logger.log( - TRACE, - "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - early_stop_count = max_chunk_gave_up - lazy_str_hard_failure = True - - # We might want to check the sequence again with the whole content - # Only if initial MD tests passes - if ( - not lazy_str_hard_failure - and is_too_large_sequence - and not is_multi_byte_decoder - ): - try: - sequences[int(50e3) :].decode(encoding_iana, errors="strict") - except UnicodeDecodeError as e: - logger.log( - TRACE, - "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - tested_but_hard_failure.append(encoding_iana) - continue - - mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 - if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: - tested_but_soft_failure.append(encoding_iana) - logger.log( - TRACE, - "%s was excluded because of initial chaos probing. Gave up %i time(s). " - "Computed mean chaos is %f %%.", - encoding_iana, - early_stop_count, - round(mean_mess_ratio * 100, ndigits=3), - ) - # Preparing those fallbacks in case we got nothing. - if ( - enable_fallback - and encoding_iana in ["ascii", "utf_8", specified_encoding] - and not lazy_str_hard_failure - ): - fallback_entry = CharsetMatch( - sequences, encoding_iana, threshold, False, [], decoded_payload - ) - if encoding_iana == specified_encoding: - fallback_specified = fallback_entry - elif encoding_iana == "ascii": - fallback_ascii = fallback_entry - else: - fallback_u8 = fallback_entry - continue - - logger.log( - TRACE, - "%s passed initial chaos probing. Mean measured chaos is %f %%", - encoding_iana, - round(mean_mess_ratio * 100, ndigits=3), - ) - - if not is_multi_byte_decoder: - target_languages: List[str] = encoding_languages(encoding_iana) - else: - target_languages = mb_encoding_languages(encoding_iana) - - if target_languages: - logger.log( - TRACE, - "{} should target any language(s) of {}".format( - encoding_iana, str(target_languages) - ), - ) - - cd_ratios = [] - - # We shall skip the CD when its about ASCII - # Most of the time its not relevant to run "language-detection" on it. - if encoding_iana != "ascii": - for chunk in md_chunks: - chunk_languages = coherence_ratio( - chunk, - language_threshold, - ",".join(target_languages) if target_languages else None, - ) - - cd_ratios.append(chunk_languages) - - cd_ratios_merged = merge_coherence_ratios(cd_ratios) - - if cd_ratios_merged: - logger.log( - TRACE, - "We detected language {} using {}".format( - cd_ratios_merged, encoding_iana - ), - ) - - results.append( - CharsetMatch( - sequences, - encoding_iana, - mean_mess_ratio, - bom_or_sig_available, - cd_ratios_merged, - decoded_payload, - ) - ) - - if ( - encoding_iana in [specified_encoding, "ascii", "utf_8"] - and mean_mess_ratio < 0.1 - ): - logger.debug( - "Encoding detection: %s is most likely the one.", encoding_iana - ) - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([results[encoding_iana]]) - - if encoding_iana == sig_encoding: - logger.debug( - "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " - "the beginning of the sequence.", - encoding_iana, - ) - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([results[encoding_iana]]) - - if len(results) == 0: - if fallback_u8 or fallback_ascii or fallback_specified: - logger.log( - TRACE, - "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", - ) - - if fallback_specified: - logger.debug( - "Encoding detection: %s will be used as a fallback match", - fallback_specified.encoding, - ) - results.append(fallback_specified) - elif ( - (fallback_u8 and fallback_ascii is None) - or ( - fallback_u8 - and fallback_ascii - and fallback_u8.fingerprint != fallback_ascii.fingerprint - ) - or (fallback_u8 is not None) - ): - logger.debug("Encoding detection: utf_8 will be used as a fallback match") - results.append(fallback_u8) - elif fallback_ascii: - logger.debug("Encoding detection: ascii will be used as a fallback match") - results.append(fallback_ascii) - - if results: - logger.debug( - "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", - results.best().encoding, # type: ignore - len(results) - 1, - ) - else: - logger.debug("Encoding detection: Unable to determine any suitable charset.") - - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - - return results - - -def from_fp( - fp: BinaryIO, - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Same thing than the function from_bytes but using a file pointer that is already ready. - Will not close the file pointer. - """ - return from_bytes( - fp.read(), - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - explain, - language_threshold, - enable_fallback, - ) - - -def from_path( - path: Union[str, bytes, PathLike], # type: ignore[type-arg] - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. - Can raise IOError. - """ - with open(path, "rb") as fp: - return from_fp( - fp, - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - explain, - language_threshold, - enable_fallback, - ) - - -def is_binary( - fp_or_path_or_payload: Union[PathLike, str, BinaryIO, bytes], # type: ignore[type-arg] - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = False, -) -> bool: - """ - Detect if the given input (file, bytes, or path) points to a binary file. aka. not a string. - Based on the same main heuristic algorithms and default kwargs at the sole exception that fallbacks match - are disabled to be stricter around ASCII-compatible but unlikely to be a string. - """ - if isinstance(fp_or_path_or_payload, (str, PathLike)): - guesses = from_path( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - elif isinstance( - fp_or_path_or_payload, - ( - bytes, - bytearray, - ), - ): - guesses = from_bytes( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - else: - guesses = from_fp( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - - return not guesses diff --git a/.flatpak-builder/cache/objects/03/cc61e70bfa30c0b269ffc3265605c46ed8fa30ac16a05bf3e102409066911a.file b/.flatpak-builder/cache/objects/03/cc61e70bfa30c0b269ffc3265605c46ed8fa30ac16a05bf3e102409066911a.file deleted file mode 100644 index 2797223..0000000 --- a/.flatpak-builder/cache/objects/03/cc61e70bfa30c0b269ffc3265605c46ed8fa30ac16a05bf3e102409066911a.file +++ /dev/null @@ -1,78 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Basic McIdas support for PIL -# -# History: -# 1997-05-05 fl Created (8-bit images only) -# 2009-03-08 fl Added 16/32-bit support. -# -# Thanks to Richard Jones and Craig Swank for specs and samples. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import struct - -from . import Image, ImageFile - - -def _accept(prefix: bytes) -> bool: - return prefix[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04" - - -## -# Image plugin for McIdas area images. - - -class McIdasImageFile(ImageFile.ImageFile): - format = "MCIDAS" - format_description = "McIdas area file" - - def _open(self) -> None: - # parse area file directory - assert self.fp is not None - - s = self.fp.read(256) - if not _accept(s) or len(s) != 256: - msg = "not an McIdas area file" - raise SyntaxError(msg) - - self.area_descriptor_raw = s - self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) - - # get mode - if w[11] == 1: - mode = rawmode = "L" - elif w[11] == 2: - # FIXME: add memory map support - mode = "I" - rawmode = "I;16B" - elif w[11] == 4: - # FIXME: add memory map support - mode = "I" - rawmode = "I;32B" - else: - msg = "unsupported McIdas format" - raise SyntaxError(msg) - - self._mode = mode - self._size = w[10], w[9] - - offset = w[34] + w[15] - stride = w[15] + w[10] * w[11] * w[14] - - self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))] - - -# -------------------------------------------------------------------- -# registry - -Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) - -# no default extension diff --git a/.flatpak-builder/cache/objects/04/1f3397a3b20b1b4eabeccf8becb736772af4539e7df752815122383b7a635d.file b/.flatpak-builder/cache/objects/04/1f3397a3b20b1b4eabeccf8becb736772af4539e7df752815122383b7a635d.file deleted file mode 100644 index 6903b006e80ed7977379115b32dc1b49d6a7297d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3125 zcmai#-)kII6vuD1YK^~JsSj4U3L;{5o7Ps_h(doUfyT!EunJLtdTuxxja@Da|!Q*z29+~gs>!c{%RD|*QzI!H`t zDdbU)@Cvr4dF3J1@&kSK@bZWsd#ZKM_p}$5bdV;xWKNoDR5x*=z1Zk5N_92xMyf`a zqZqF-UGi$)36tnF66e6@Co4%*PDf=&Y?4Mb4Z;(;97i>sR*W{MjNeFuDAZ9|`%%g0 z6DBmVmzt6u86&9PGoWkCSBrY6YP`g4iT!{dzL)P5d@LE=}vpk`tQr3KJcKN$Q2Z(bdTJB$i~VcqdKxYAT?D zasW)BQ8Hx@YPuf9Y0~RL`ow8~a`p1D!v~A{5Hs;81bTJ7!zfHm>>P0rA%GO$3!P7ttK0?q0LPo^xx^|_aqK-w)^D9AUq!0Wk42_>kcX$-6 z7Nurc;-Wfks(w^MuSn;8r-t{8M2&QLw6EfY&_810lN4@vAKJxwUlcM*JZT}7RFI!` z(xX9GibmJJ?^>z4X8yxQkgl0LQi(=29~S}f;^+&&76wX%k4QlHe%&*4sBjo@WmMQt zkM`^BecN{w`gRt!y{WhD?%%ol^}bzweLV-gBrP0`y)dbIX%w^bAlMsJuW;0OwN>MO zv>QHrtY>gw@W4u{o_Z zEA+A2)4dXGOWRpHtFv+2v~%uz!!BhL*;(7N^Rl|gs(iB3*_muY%c7lTIKhPb#o{8f zGQxe%HnnYMla?^{wr0;coX72rUTyDSTP`y3WLtJVcVRC}_;+G9?SdwMTLQ|aC3}-E zv;2|EE@Wo_LJCmXJABW&c&%(w+iBr43zsv%xB#doFBGOpc85)EB1rO9c2UD{$#Z~%&=hUz)ul8K*ep3Pylh%gV^(|60__CjS*K;YTtJ1?M$ z+FoVnllH8y}@Y40S9z0>ypEBOY}k(s0e)0J7&U?@sbEK$B(8XwU9>u%moKM zCklLFAslDzj8tBzNzITM?D^KBvQt2uXLe2?{9n@Hv@3SX%@0j47$q|p-ugzR@5H>9R{h*t!{3q zjVnD$&9OjbiE%-5Nf+2SBXV@=d!LY0>Qbi-q0(~di;%(@(IoY(G`GumZ#Adotk5Mb zr^3An1;|&ODr9Tq;3VbOHU+un&OwuC(m|pJ-Lc$&*+qW0l>J`TvPorsaBefeo8}_Q)v38>X=qAlJ(TS|=)w~y|hETZsC!GmQLk02s}+A0v9L>Q8Ycqm+1>d0I5TD(F->`cg}g4NA+ArTjB+=jwy8iw$5T zn3tB~j_DMxdws1Xkew-tZd_}`2EcMdG1cu@Zny6LR6E5DBA%=6##uFNzg;;qjv&1t zVCBjlXL-t@bCl+{RdsG B$-4jm diff --git a/.flatpak-builder/cache/objects/05/6269014facbf1828dd50466926ea55ea8d76d314c07a23f818850bd18f406c.file b/.flatpak-builder/cache/objects/05/6269014facbf1828dd50466926ea55ea8d76d314c07a23f818850bd18f406c.file deleted file mode 100644 index 0f45786..0000000 --- a/.flatpak-builder/cache/objects/05/6269014facbf1828dd50466926ea55ea8d76d314c07a23f818850bd18f406c.file +++ /dev/null @@ -1,101 +0,0 @@ -from __future__ import annotations - -import http.client as httplib -from email.errors import MultipartInvariantViolationDefect, StartBoundaryNotFoundDefect - -from ..exceptions import HeaderParsingError - - -def is_fp_closed(obj: object) -> bool: - """ - Checks whether a given file-like object is closed. - - :param obj: - The file-like object to check. - """ - - try: - # Check `isclosed()` first, in case Python3 doesn't set `closed`. - # GH Issue #928 - return obj.isclosed() # type: ignore[no-any-return, attr-defined] - except AttributeError: - pass - - try: - # Check via the official file-like-object way. - return obj.closed # type: ignore[no-any-return, attr-defined] - except AttributeError: - pass - - try: - # Check if the object is a container for another file-like object that - # gets released on exhaustion (e.g. HTTPResponse). - return obj.fp is None # type: ignore[attr-defined] - except AttributeError: - pass - - raise ValueError("Unable to determine whether fp is closed.") - - -def assert_header_parsing(headers: httplib.HTTPMessage) -> None: - """ - Asserts whether all headers have been successfully parsed. - Extracts encountered errors from the result of parsing headers. - - Only works on Python 3. - - :param http.client.HTTPMessage headers: Headers to verify. - - :raises urllib3.exceptions.HeaderParsingError: - If parsing errors are found. - """ - - # This will fail silently if we pass in the wrong kind of parameter. - # To make debugging easier add an explicit check. - if not isinstance(headers, httplib.HTTPMessage): - raise TypeError(f"expected httplib.Message, got {type(headers)}.") - - unparsed_data = None - - # get_payload is actually email.message.Message.get_payload; - # we're only interested in the result if it's not a multipart message - if not headers.is_multipart(): - payload = headers.get_payload() - - if isinstance(payload, (bytes, str)): - unparsed_data = payload - - # httplib is assuming a response body is available - # when parsing headers even when httplib only sends - # header data to parse_headers() This results in - # defects on multipart responses in particular. - # See: https://github.com/urllib3/urllib3/issues/800 - - # So we ignore the following defects: - # - StartBoundaryNotFoundDefect: - # The claimed start boundary was never found. - # - MultipartInvariantViolationDefect: - # A message claimed to be a multipart but no subparts were found. - defects = [ - defect - for defect in headers.defects - if not isinstance( - defect, (StartBoundaryNotFoundDefect, MultipartInvariantViolationDefect) - ) - ] - - if defects or unparsed_data: - raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) - - -def is_response_to_head(response: httplib.HTTPResponse) -> bool: - """ - Checks whether the request of a response has been a HEAD-request. - - :param http.client.HTTPResponse response: - Response to check if the originating request - used 'HEAD' as a method. - """ - # FIXME: Can we do this somehow without accessing private httplib _method? - method_str = response._method # type: str # type: ignore[attr-defined] - return method_str.upper() == "HEAD" diff --git a/.flatpak-builder/cache/objects/06/2da881c802a4dca069a03ab55798aee7b1aff2e0ad93b2cb72c269268cfd94.dirtree b/.flatpak-builder/cache/objects/06/2da881c802a4dca069a03ab55798aee7b1aff2e0ad93b2cb72c269268cfd94.dirtree deleted file mode 100644 index 4cb54567e21872effabe6033b3f29df3b3d34601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58 zcmYe!&(+IHO-n0IEz)z$DM(CC)GIDaXArz0Yu+01T`=Z>quD&C4W9K0+jXq;^PTe6 O9zWHzvW7|A!V&4uKI5sIcEVTJ)5lZCGeyH&hbi&z zqDwXgv6G??9MIKJUA~N+;bo_4r3pxHVkIX7Ls4pOepzA;++c*c%ut)aD!IZMj8cs) zlg*6HlT(r`(+o|M5-p6(j7*FYlZ}ni5)+NmQjJVgEsRo(Q_aoIQccZ`Q!P_14U8-d zEKSS}Er6;RJo7S3G81z$t5Q=GlJj%*vQpF1ic^d99CHd1lM}fR)}?te$=`bTySTS_ z>XY2IDR&a{o!N@3431Q@S)6<2l(tpfcDkKQ7T-tdnuF<|w=q9$J^t?9w$fiqgs#3R W{-)XSnmZ??LxAxy!(oOdFa!W*ab!gR diff --git a/.flatpak-builder/cache/objects/07/1f61e40a6ecdf63a5a2d91cc017f1c46f03555c1fb7f72892d7761a03a6a46.file b/.flatpak-builder/cache/objects/07/1f61e40a6ecdf63a5a2d91cc017f1c46f03555c1fb7f72892d7761a03a6a46.file deleted file mode 100644 index 6aa82da..0000000 --- a/.flatpak-builder/cache/objects/07/1f61e40a6ecdf63a5a2d91cc017f1c46f03555c1fb7f72892d7761a03a6a46.file +++ /dev/null @@ -1,135 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# transform wrappers -# -# History: -# 2002-04-08 fl Created -# -# Copyright (c) 2002 by Secret Labs AB -# Copyright (c) 2002 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from typing import Sequence - -from . import Image - - -class Transform(Image.ImageTransformHandler): - """Base class for other transforms defined in :py:mod:`~PIL.ImageTransform`.""" - - method: Image.Transform - - def __init__(self, data: Sequence[int]) -> None: - self.data = data - - def getdata(self) -> tuple[Image.Transform, Sequence[int]]: - return self.method, self.data - - def transform( - self, - size: tuple[int, int], - image: Image.Image, - **options: dict[str, str | int | tuple[int, ...] | list[int]], - ) -> Image.Image: - """Perform the transform. Called from :py:meth:`.Image.transform`.""" - # can be overridden - method, data = self.getdata() - return image.transform(size, method, data, **options) - - -class AffineTransform(Transform): - """ - Define an affine image transform. - - This function takes a 6-tuple (a, b, c, d, e, f) which contain the first - two rows from an affine transform matrix. For each pixel (x, y) in the - output image, the new value is taken from a position (a x + b y + c, - d x + e y + f) in the input image, rounded to nearest pixel. - - This function can be used to scale, translate, rotate, and shear the - original image. - - See :py:meth:`.Image.transform` - - :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows - from an affine transform matrix. - """ - - method = Image.Transform.AFFINE - - -class PerspectiveTransform(Transform): - """ - Define a perspective image transform. - - This function takes an 8-tuple (a, b, c, d, e, f, g, h). For each pixel - (x, y) in the output image, the new value is taken from a position - ((a x + b y + c) / (g x + h y + 1), (d x + e y + f) / (g x + h y + 1)) in - the input image, rounded to nearest pixel. - - This function can be used to scale, translate, rotate, and shear the - original image. - - See :py:meth:`.Image.transform` - - :param matrix: An 8-tuple (a, b, c, d, e, f, g, h). - """ - - method = Image.Transform.PERSPECTIVE - - -class ExtentTransform(Transform): - """ - Define a transform to extract a subregion from an image. - - Maps a rectangle (defined by two corners) from the image to a rectangle of - the given size. The resulting image will contain data sampled from between - the corners, such that (x0, y0) in the input image will end up at (0,0) in - the output image, and (x1, y1) at size. - - This method can be used to crop, stretch, shrink, or mirror an arbitrary - rectangle in the current image. It is slightly slower than crop, but about - as fast as a corresponding resize operation. - - See :py:meth:`.Image.transform` - - :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the - input image's coordinate system. See :ref:`coordinate-system`. - """ - - method = Image.Transform.EXTENT - - -class QuadTransform(Transform): - """ - Define a quad image transform. - - Maps a quadrilateral (a region defined by four corners) from the image to a - rectangle of the given size. - - See :py:meth:`.Image.transform` - - :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the - upper left, lower left, lower right, and upper right corner of the - source quadrilateral. - """ - - method = Image.Transform.QUAD - - -class MeshTransform(Transform): - """ - Define a mesh image transform. A mesh transform consists of one or more - individual quad transforms. - - See :py:meth:`.Image.transform` - - :param data: A list of (bbox, quad) tuples. - """ - - method = Image.Transform.MESH diff --git a/.flatpak-builder/cache/objects/07/dd4cf7b83f4203e34b85ceb53dc640fee0ac23614f93acc1f6bd94442a3eaa.file b/.flatpak-builder/cache/objects/07/dd4cf7b83f4203e34b85ceb53dc640fee0ac23614f93acc1f6bd94442a3eaa.file deleted file mode 100644 index 243b862..0000000 --- a/.flatpak-builder/cache/objects/07/dd4cf7b83f4203e34b85ceb53dc640fee0ac23614f93acc1f6bd94442a3eaa.file +++ /dev/null @@ -1,110 +0,0 @@ -let Status = { - SUCCESS_HEADER: -1, - SUCCESS_EOF: -2, - ERROR_TIMEOUT: -3, - ERROR_EXCEPTION: -4, -}; - -let connections = {}; -let nextConnectionID = 1; -const encoder = new TextEncoder(); - -self.addEventListener("message", async function (event) { - if (event.data.close) { - let connectionID = event.data.close; - delete connections[connectionID]; - return; - } else if (event.data.getMore) { - let connectionID = event.data.getMore; - let { curOffset, value, reader, intBuffer, byteBuffer } = - connections[connectionID]; - // if we still have some in buffer, then just send it back straight away - if (!value || curOffset >= value.length) { - // read another buffer if required - try { - let readResponse = await reader.read(); - - if (readResponse.done) { - // read everything - clear connection and return - delete connections[connectionID]; - Atomics.store(intBuffer, 0, Status.SUCCESS_EOF); - Atomics.notify(intBuffer, 0); - // finished reading successfully - // return from event handler - return; - } - curOffset = 0; - connections[connectionID].value = readResponse.value; - value = readResponse.value; - } catch (error) { - console.log("Request exception:", error); - let errorBytes = encoder.encode(error.message); - let written = errorBytes.length; - byteBuffer.set(errorBytes); - intBuffer[1] = written; - Atomics.store(intBuffer, 0, Status.ERROR_EXCEPTION); - Atomics.notify(intBuffer, 0); - } - } - - // send as much buffer as we can - let curLen = value.length - curOffset; - if (curLen > byteBuffer.length) { - curLen = byteBuffer.length; - } - byteBuffer.set(value.subarray(curOffset, curOffset + curLen), 0); - - Atomics.store(intBuffer, 0, curLen); // store current length in bytes - Atomics.notify(intBuffer, 0); - curOffset += curLen; - connections[connectionID].curOffset = curOffset; - - return; - } else { - // start fetch - let connectionID = nextConnectionID; - nextConnectionID += 1; - const intBuffer = new Int32Array(event.data.buffer); - const byteBuffer = new Uint8Array(event.data.buffer, 8); - try { - const response = await fetch(event.data.url, event.data.fetchParams); - // return the headers first via textencoder - var headers = []; - for (const pair of response.headers.entries()) { - headers.push([pair[0], pair[1]]); - } - let headerObj = { - headers: headers, - status: response.status, - connectionID, - }; - const headerText = JSON.stringify(headerObj); - let headerBytes = encoder.encode(headerText); - let written = headerBytes.length; - byteBuffer.set(headerBytes); - intBuffer[1] = written; - // make a connection - connections[connectionID] = { - reader: response.body.getReader(), - intBuffer: intBuffer, - byteBuffer: byteBuffer, - value: undefined, - curOffset: 0, - }; - // set header ready - Atomics.store(intBuffer, 0, Status.SUCCESS_HEADER); - Atomics.notify(intBuffer, 0); - // all fetching after this goes through a new postmessage call with getMore - // this allows for parallel requests - } catch (error) { - console.log("Request exception:", error); - let errorBytes = encoder.encode(error.message); - let written = errorBytes.length; - byteBuffer.set(errorBytes); - intBuffer[1] = written; - Atomics.store(intBuffer, 0, Status.ERROR_EXCEPTION); - Atomics.notify(intBuffer, 0); - } - } -}); -self.postMessage({ inited: true }); diff --git a/.flatpak-builder/cache/objects/08/35ff6ac22d648601c24b9aed4135193017a694875a132ca3f96e96ca883e7d.file b/.flatpak-builder/cache/objects/08/35ff6ac22d648601c24b9aed4135193017a694875a132ca3f96e96ca883e7d.file deleted file mode 100644 index 1b7a624..0000000 --- a/.flatpak-builder/cache/objects/08/35ff6ac22d648601c24b9aed4135193017a694875a132ca3f96e96ca883e7d.file +++ /dev/null @@ -1,43 +0,0 @@ -requests-2.31.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -requests-2.31.0.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142 -requests-2.31.0.dist-info/METADATA,sha256=eCPokOnbb0FROLrfl0R5EpDvdufsb9CaN4noJH__54I,4634 -requests-2.31.0.dist-info/RECORD,, -requests-2.31.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -requests-2.31.0.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 -requests-2.31.0.dist-info/top_level.txt,sha256=fMSVmHfb5rbGOo6xv-O_tUX6j-WyixssE-SnwcDRxNQ,9 -requests/__init__.py,sha256=LvmKhjIz8mHaKXthC2Mv5ykZ1d92voyf3oJpd-VuAig,4963 -requests/__pycache__/__init__.cpython-311.pyc,, -requests/__pycache__/__version__.cpython-311.pyc,, -requests/__pycache__/_internal_utils.cpython-311.pyc,, -requests/__pycache__/adapters.cpython-311.pyc,, -requests/__pycache__/api.cpython-311.pyc,, -requests/__pycache__/auth.cpython-311.pyc,, -requests/__pycache__/certs.cpython-311.pyc,, -requests/__pycache__/compat.cpython-311.pyc,, -requests/__pycache__/cookies.cpython-311.pyc,, -requests/__pycache__/exceptions.cpython-311.pyc,, -requests/__pycache__/help.cpython-311.pyc,, -requests/__pycache__/hooks.cpython-311.pyc,, -requests/__pycache__/models.cpython-311.pyc,, -requests/__pycache__/packages.cpython-311.pyc,, -requests/__pycache__/sessions.cpython-311.pyc,, -requests/__pycache__/status_codes.cpython-311.pyc,, -requests/__pycache__/structures.cpython-311.pyc,, -requests/__pycache__/utils.cpython-311.pyc,, -requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435 -requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 -requests/adapters.py,sha256=v_FmjU5KZ76k-YttShZYB5RprIzhhL8Y3zgW9p4eBQ8,19553 -requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449 -requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 -requests/certs.py,sha256=Z9Sb410Anv6jUFTyss0jFFhU6xst8ctELqfy8Ev23gw,429 -requests/compat.py,sha256=yxntVOSEHGMrn7FNr_32EEam1ZNAdPRdSE13_yaHzTk,1451 -requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 -requests/exceptions.py,sha256=DhveFBclVjTRxhRduVpO-GbMYMID2gmjdLfNEqNpI_U,3811 -requests/help.py,sha256=gPX5d_H7Xd88aDABejhqGgl9B1VFRTt5BmiYvL3PzIQ,3875 -requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 -requests/models.py,sha256=-DlKi0or8gFAM6VzutobXvvBW_2wrJuOF5NfndTIddA,35223 -requests/packages.py,sha256=DXgv-FJIczZITmv0vEBAhWj4W-5CGCIN_ksvgR17Dvs,957 -requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373 -requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235 -requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 -requests/utils.py,sha256=6sx2X3cIVA8BgWOg8odxFy-_lbWDFETU8HI4fU4Rmqw,33448 diff --git a/.flatpak-builder/cache/objects/0a/56053c355a40c46b16c39010bab1630bc0903d3f6448494b0e9c4e340857c8.file b/.flatpak-builder/cache/objects/0a/56053c355a40c46b16c39010bab1630bc0903d3f6448494b0e9c4e340857c8.file deleted file mode 100644 index 7099c3483e2c6723d2bcd995185fabba4d5b23c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24581 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 j+%$5Ha>{VKd8$*OIvZwrCiqwS4 diff --git a/.flatpak-builder/cache/objects/0a/caa95a37add317bcd98ea1a8954bd217f17ceecbaff6ffa2bbb27359078f5c.file b/.flatpak-builder/cache/objects/0a/caa95a37add317bcd98ea1a8954bd217f17ceecbaff6ffa2bbb27359078f5c.file deleted file mode 100644 index c5bf3e0..0000000 --- a/.flatpak-builder/cache/objects/0a/caa95a37add317bcd98ea1a8954bd217f17ceecbaff6ffa2bbb27359078f5c.file +++ /dev/null @@ -1,124 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# WAL file handling -# -# History: -# 2003-04-23 fl created -# -# Copyright (c) 2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -""" -This reader is based on the specification available from: -https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml -and has been tested with a few sample files found using google. - -.. note:: - This format cannot be automatically recognized, so the reader - is not registered for use with :py:func:`PIL.Image.open()`. - To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead. -""" -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i32le as i32 - - -class WalImageFile(ImageFile.ImageFile): - format = "WAL" - format_description = "Quake2 Texture" - - def _open(self): - self._mode = "P" - - # read header fields - header = self.fp.read(32 + 24 + 32 + 12) - self._size = i32(header, 32), i32(header, 36) - Image._decompression_bomb_check(self.size) - - # load pixel data - offset = i32(header, 40) - self.fp.seek(offset) - - # strings are null-terminated - self.info["name"] = header[:32].split(b"\0", 1)[0] - next_name = header[56 : 56 + 32].split(b"\0", 1)[0] - if next_name: - self.info["next_name"] = next_name - - def load(self): - if not self.im: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self.size[0] * self.size[1])) - self.putpalette(quake2palette) - return Image.Image.load(self) - - -def open(filename): - """ - Load texture from a Quake2 WAL texture file. - - By default, a Quake2 standard palette is attached to the texture. - To override the palette, use the :py:func:`PIL.Image.Image.putpalette()` method. - - :param filename: WAL file name, or an opened file handle. - :returns: An image instance. - """ - return WalImageFile(filename) - - -quake2palette = ( - # default palette taken from piffo 0.93 by Hans Häggström - b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" - b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" - b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" - b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" - b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" - b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" - b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" - b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" - b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" - b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" - b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" - b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" - b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" - b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" - b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" - b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" - b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" - b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" - b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" - b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" - b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" - b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" - b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" - b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" - b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" - b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" - b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" - b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" - b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" - b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" - b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" - b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" - b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" - b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" - b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" - b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" - b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" - b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" - b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" - b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" - b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" - b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" - b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" - b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" - b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" - b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" - b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" - b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" -) diff --git a/.flatpak-builder/cache/objects/0c/032d7e00de039fbb2d5319b226e3192db314b0d731aa060807be9419377372.file b/.flatpak-builder/cache/objects/0c/032d7e00de039fbb2d5319b226e3192db314b0d731aa060807be9419377372.file deleted file mode 100644 index 61e00481a81f70d7cdd74b076c4c73db0c9e2f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8733 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 diff --git a/.flatpak-builder/cache/objects/0c/28d8aba122d8ab0edf56141d0eeb6faac86f50c121927dae26c7705aa1efbd.file b/.flatpak-builder/cache/objects/0c/28d8aba122d8ab0edf56141d0eeb6faac86f50c121927dae26c7705aa1efbd.file deleted file mode 100644 index 019c15efa427a9ca038bde6af20735c1dcd04cc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10101 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 int: - return c[0] - - -def o8(i: int) -> bytes: - return bytes((i & 255,)) - - -# Input, le = little endian, be = big endian -def i16le(c: bytes, o: int = 0) -> int: - """ - Converts a 2-bytes (16 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 2-bytes (16 bits) string to a signed integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 2-bytes (16 bits) string to a signed integer, big endian. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(">h", c, o)[0] - - -def i32le(c: bytes, o: int = 0) -> int: - """ - Converts a 4-bytes (32 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 4-bytes (32 bits) string to a signed integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 4-bytes (32 bits) string to a signed integer, big endian. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(">i", c, o)[0] - - -def i16be(c: bytes, o: int = 0) -> int: - return unpack_from(">H", c, o)[0] - - -def i32be(c: bytes, o: int = 0) -> int: - return unpack_from(">I", c, o)[0] - - -# Output, le = little endian, be = big endian -def o16le(i: int) -> bytes: - return pack(" bytes: - return pack(" bytes: - return pack(">H", i) - - -def o32be(i: int) -> bytes: - return pack(">I", i) diff --git a/.flatpak-builder/cache/objects/0d/cc68daab8d4361b59664976429aaead351424e220c057a84941bcc9fe2230b.dirtree b/.flatpak-builder/cache/objects/0d/cc68daab8d4361b59664976429aaead351424e220c057a84941bcc9fe2230b.dirtree deleted file mode 100644 index 803e72b75e9725562a2bc105c996412c08bd6e0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45 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 diff --git a/.flatpak-builder/cache/objects/10/3a463f00cfc3cc9225c9362e4263367b202ee3b7ab0c53461d6c79c25d669b.file b/.flatpak-builder/cache/objects/10/3a463f00cfc3cc9225c9362e4263367b202ee3b7ab0c53461d6c79c25d669b.file deleted file mode 100644 index e67954d5844e9c34e3ff5df6418a3042e1e870ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10508 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 P%hX7P8Y$JkWPbh+4+XQ_ diff --git a/.flatpak-builder/cache/objects/10/401d9ad20a396ff8153f20d6a40d7caa70fde0f03bd6756a3bd860256a5704.file b/.flatpak-builder/cache/objects/10/401d9ad20a396ff8153f20d6a40d7caa70fde0f03bd6756a3bd860256a5704.file deleted file mode 100644 index 7184fc3..0000000 --- a/.flatpak-builder/cache/objects/10/401d9ad20a396ff8153f20d6a40d7caa70fde0f03bd6756a3bd860256a5704.file +++ /dev/null @@ -1,61 +0,0 @@ -# connectionhandler.py -import json, requests - -def simple_get(connection_url:str) -> dict: - try: - response = requests.get(connection_url) - if response.status_code == 200: - return {"status": "ok", "text": response.text, "status_code": response.status_code} - else: - return {"status": "error", "status_code": response.status_code} - except Exception as e: - return {"status": "error", "status_code": 0} - -def simple_delete(connection_url:str, data) -> dict: - try: - response = requests.delete(connection_url, json=data) - if response.status_code == 200: - return {"status": "ok", "status_code": response.status_code} - else: - return {"status": "error", "text": "Failed to delete", "status_code": response.status_code} - except Exception as e: - return {"status": "error", "status_code": 0} - -def stream_post(connection_url:str, data, callback:callable) -> dict: - try: - headers = { - "Content-Type": "application/json" - } - response = requests.post(connection_url, headers=headers, data=data, stream=True) - if response.status_code == 200: - for line in response.iter_lines(): - if line: - callback(json.loads(line.decode("utf-8"))) - return {"status": "ok", "status_code": response.status_code} - else: - return {"status": "error", "status_code": response.status_code} - except Exception as e: - return {"status": "error", "status_code": 0} - - -from time import sleep -def stream_post_fake(connection_url:str, data, callback:callable) -> dict: - data = { - "status": "pulling manifest" - } - callback(data) - for i in range(2): - for a in range(11): - sleep(.1) - data = { - "status": f"downloading digestname {i}", - "digest": f"digestname {i}", - "total": 500, - "completed": a * 50 - } - callback(data) - for msg in ["verifying sha256 digest", "writting manifest", "removing any unused layers", "success"]: - sleep(.1) - data = {"status": msg} - callback(data) - return {"status": "ok", "status_code": 200} diff --git a/.flatpak-builder/cache/objects/10/9ab9de2fc2d2f81a4ccdf90db7d358cfbd2625222b4dbdaeba6a7f1da39721.dirtree b/.flatpak-builder/cache/objects/10/9ab9de2fc2d2f81a4ccdf90db7d358cfbd2625222b4dbdaeba6a7f1da39721.dirtree deleted file mode 100644 index 367c3e233980e72c169c4a84f48235aa76dbb849..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 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 G0!aWFk1KHi diff --git a/.flatpak-builder/cache/objects/10/edfa2791416895f9730ba52d351c95f6f57b3b1cfe2fbb165bf043a289c7a4.file b/.flatpak-builder/cache/objects/10/edfa2791416895f9730ba52d351c95f6f57b3b1cfe2fbb165bf043a289c7a4.file deleted file mode 100644 index d2815e8..0000000 --- a/.flatpak-builder/cache/objects/10/edfa2791416895f9730ba52d351c95f6f57b3b1cfe2fbb165bf043a289c7a4.file +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import annotations - -from .features import pilinfo - -pilinfo(supported_formats=False) diff --git a/.flatpak-builder/cache/objects/11/b8af89e321d38b665fda2465bfef5874053876f0bf449bf4480ab856e9766d.file b/.flatpak-builder/cache/objects/11/b8af89e321d38b665fda2465bfef5874053876f0bf449bf4480ab856e9766d.file deleted file mode 100644 index d95fedf..0000000 --- a/.flatpak-builder/cache/objects/11/b8af89e321d38b665fda2465bfef5874053876f0bf449bf4480ab856e9766d.file +++ /dev/null @@ -1,6 +0,0 @@ -from .__main__ import cli_detect, query_yes_no - -__all__ = ( - "cli_detect", - "query_yes_no", -) diff --git a/.flatpak-builder/cache/objects/11/d81d378558f7115ce041369e42b0497f60b72c3a2f6f426eadc7ca82a97c02.file b/.flatpak-builder/cache/objects/11/d81d378558f7115ce041369e42b0497f60b72c3a2f6f426eadc7ca82a97c02.file deleted file mode 100644 index 236a95b..0000000 --- a/.flatpak-builder/cache/objects/11/d81d378558f7115ce041369e42b0497f60b72c3a2f6f426eadc7ca82a97c02.file +++ /dev/null @@ -1,272 +0,0 @@ - - - - - Adwaita Icon Template - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - GNOME Design Team - - - - - Adwaita Icon Template - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.flatpak-builder/cache/objects/12/12cce5ea0b18d679e3baa460b1f2e6bbc3d0b88023581ce364a6dc95c2c24c.dirtree b/.flatpak-builder/cache/objects/12/12cce5ea0b18d679e3baa460b1f2e6bbc3d0b88023581ce364a6dc95c2c24c.dirtree deleted file mode 100644 index 76789c16df83e59bc923f714ab30dcc8b508468c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmYe!&(+IHO-n0IEz)z$DM(CC)Jrc;&PdHo)T_wNVVG1eH0N>g4Vhz))DE`q3f|xM z;_QL_>$dwu$F|j8R6lS-9;&!lFF8NAATuX5g+U_B_K`q0-&F1C^PkUqR#P+oUHh?< UiR%glZ7;C8D#|_ diff --git a/.flatpak-builder/cache/objects/12/ad731e6f1d18fd96638b00d5c64f36683565cf73cec3aa5990d4880eb9b0c3.file b/.flatpak-builder/cache/objects/12/ad731e6f1d18fd96638b00d5c64f36683565cf73cec3aa5990d4880eb9b0c3.file deleted file mode 100644 index 93a50d2..0000000 --- a/.flatpak-builder/cache/objects/12/ad731e6f1d18fd96638b00d5c64f36683565cf73cec3aa5990d4880eb9b0c3.file +++ /dev/null @@ -1,104 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# image enhancement classes -# -# For a background, see "Image Processing By Interpolation and -# Extrapolation", Paul Haeberli and Douglas Voorhies. Available -# at http://www.graficaobscura.com/interp/index.html -# -# History: -# 1996-03-23 fl Created -# 2009-06-16 fl Fixed mean calculation -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFilter, ImageStat - - -class _Enhance: - def enhance(self, factor): - """ - Returns an enhanced image. - - :param factor: A floating point value controlling the enhancement. - Factor 1.0 always returns a copy of the original image, - lower factors mean less color (brightness, contrast, - etc), and higher values more. There are no restrictions - on this value. - :rtype: :py:class:`~PIL.Image.Image` - """ - return Image.blend(self.degenerate, self.image, factor) - - -class Color(_Enhance): - """Adjust image color balance. - - This class can be used to adjust the colour balance of an image, in - a manner similar to the controls on a colour TV set. An enhancement - factor of 0.0 gives a black and white image. A factor of 1.0 gives - the original image. - """ - - def __init__(self, image): - self.image = image - self.intermediate_mode = "L" - if "A" in image.getbands(): - self.intermediate_mode = "LA" - - self.degenerate = image.convert(self.intermediate_mode).convert(image.mode) - - -class Contrast(_Enhance): - """Adjust image contrast. - - This class can be used to control the contrast of an image, similar - to the contrast control on a TV set. An enhancement factor of 0.0 - gives a solid gray image. A factor of 1.0 gives the original image. - """ - - def __init__(self, image): - self.image = image - mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5) - self.degenerate = Image.new("L", image.size, mean).convert(image.mode) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) - - -class Brightness(_Enhance): - """Adjust image brightness. - - This class can be used to control the brightness of an image. An - enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the - original image. - """ - - def __init__(self, image): - self.image = image - self.degenerate = Image.new(image.mode, image.size, 0) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) - - -class Sharpness(_Enhance): - """Adjust image sharpness. - - This class can be used to adjust the sharpness of an image. An - enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the - original image, and a factor of 2.0 gives a sharpened image. - """ - - def __init__(self, image): - self.image = image - self.degenerate = image.filter(ImageFilter.SMOOTH) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) diff --git a/.flatpak-builder/cache/objects/13/3102b635a79279aa181d2f79c99066b45e3b584eeea10172caff2dff4655ea.file b/.flatpak-builder/cache/objects/13/3102b635a79279aa181d2f79c99066b45e3b584eeea10172caff2dff4655ea.file deleted file mode 100644 index 2b6c1912b9f58f0a4a14bb56f87ffc02cc2b2cfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmZ3^%ge>gz`#(IEWGQa-^bmLfowQng0L7rn*kZq8B!Qh7;_kM8KW2(8B&;1m~)tN znWLB)8B&?ESYUdxSYfOvwiK3N22IwNAOTIrTil6xdHE%YC7Jno#V;8lVyvFIiRr0+ zn(Vi@;^WgwOG=AUMfRn#FC6#ECE1rCBtW+IKwX^{ltO- z{hZ7s{esGpjQl)fJwrqN;>?m%-GapAY@n&d`T?Fk`d|w{`t%Aae{tC4=BJeAq}mnn w0gV8;q1XaQd|+l|Wc;AOz^HtIK?xZ>U=Y55iXO1@v{bd!H?V+U5f4x^0K8XHZU6uP diff --git a/.flatpak-builder/cache/objects/13/3fbca07002dde1ab644fcc9fae7e5f9e371d00e5ebb80dbfa39b44a1da2282.file b/.flatpak-builder/cache/objects/13/3fbca07002dde1ab644fcc9fae7e5f9e371d00e5ebb80dbfa39b44a1da2282.file deleted file mode 100644 index 453cfd4..0000000 --- a/.flatpak-builder/cache/objects/13/3fbca07002dde1ab644fcc9fae7e5f9e371d00e5ebb80dbfa39b44a1da2282.file +++ /dev/null @@ -1,159 +0,0 @@ -"""The match_hostname() function from Python 3.5, essential when using SSL.""" - -# Note: This file is under the PSF license as the code comes from the python -# stdlib. http://docs.python.org/3/license.html -# It is modified to remove commonName support. - -from __future__ import annotations - -import ipaddress -import re -import typing -from ipaddress import IPv4Address, IPv6Address - -if typing.TYPE_CHECKING: - from .ssl_ import _TYPE_PEER_CERT_RET_DICT - -__version__ = "3.5.0.1" - - -class CertificateError(ValueError): - pass - - -def _dnsname_match( - dn: typing.Any, hostname: str, max_wildcards: int = 1 -) -> typing.Match[str] | None | bool: - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - # Ported from python3-syntax: - # leftmost, *remainder = dn.split(r'.') - parts = dn.split(r".") - leftmost = parts[0] - remainder = parts[1:] - - wildcards = leftmost.count("*") - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn) - ) - - # speed up common case w/o wildcards - if not wildcards: - return bool(dn.lower() == hostname.lower()) - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == "*": - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append("[^.]+") - elif leftmost.startswith("xn--") or hostname.startswith("xn--"): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r"\*", "[^.]*")) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r"\A" + r"\.".join(pats) + r"\Z", re.IGNORECASE) - return pat.match(hostname) - - -def _ipaddress_match(ipname: str, host_ip: IPv4Address | IPv6Address) -> bool: - """Exact matching of IP addresses. - - RFC 9110 section 4.3.5: "A reference identity of IP-ID contains the decoded - bytes of the IP address. An IP version 4 address is 4 octets, and an IP - version 6 address is 16 octets. [...] A reference identity of type IP-ID - matches if the address is identical to an iPAddress value of the - subjectAltName extension of the certificate." - """ - # OpenSSL may add a trailing newline to a subjectAltName's IP address - # Divergence from upstream: ipaddress can't handle byte str - ip = ipaddress.ip_address(ipname.rstrip()) - return bool(ip.packed == host_ip.packed) - - -def match_hostname( - cert: _TYPE_PEER_CERT_RET_DICT | None, - hostname: str, - hostname_checks_common_name: bool = False, -) -> None: - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError( - "empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED" - ) - try: - # Divergence from upstream: ipaddress can't handle byte str - # - # The ipaddress module shipped with Python < 3.9 does not support - # scoped IPv6 addresses so we unconditionally strip the Zone IDs for - # now. Once we drop support for Python 3.9 we can remove this branch. - if "%" in hostname: - host_ip = ipaddress.ip_address(hostname[: hostname.rfind("%")]) - else: - host_ip = ipaddress.ip_address(hostname) - - except ValueError: - # Not an IP address (common case) - host_ip = None - dnsnames = [] - san: tuple[tuple[str, str], ...] = cert.get("subjectAltName", ()) - key: str - value: str - for key, value in san: - if key == "DNS": - if host_ip is None and _dnsname_match(value, hostname): - return - dnsnames.append(value) - elif key == "IP Address": - if host_ip is not None and _ipaddress_match(value, host_ip): - return - dnsnames.append(value) - - # We only check 'commonName' if it's enabled and we're not verifying - # an IP address. IP addresses aren't valid within 'commonName'. - if hostname_checks_common_name and host_ip is None and not dnsnames: - for sub in cert.get("subject", ()): - for key, value in sub: - if key == "commonName": - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - - if len(dnsnames) > 1: - raise CertificateError( - "hostname %r " - "doesn't match either of %s" % (hostname, ", ".join(map(repr, dnsnames))) - ) - elif len(dnsnames) == 1: - raise CertificateError(f"hostname {hostname!r} doesn't match {dnsnames[0]!r}") - else: - raise CertificateError("no appropriate subjectAltName fields were found") diff --git a/.flatpak-builder/cache/objects/14/110d46347c604b35d8803f881d63161ef72b5f73418e154ba277d4d55d343b.dirtree b/.flatpak-builder/cache/objects/14/110d46347c604b35d8803f881d63161ef72b5f73418e154ba277d4d55d343b.dirtree deleted file mode 100644 index 792f4b15fc26a088c39feaf9b76c22c0c9c5b2b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117 zcmXS@%r8jID=yB_OD?D^$;i*sH8wQVE2vCnnC?8wSljUAE5Ai$Zr>zVyE`cvxYQZ- zT%6=!@csBFqv=w``N`SE7}|K4b?X@JG0)$v8!Wj=?XjfpW|0lo4Og*ou bool: - return prefix[:6] == b"SIMPLE" - - -class FitsImageFile(ImageFile.ImageFile): - format = "FITS" - format_description = "FITS" - - def _open(self) -> None: - assert self.fp is not None - - headers: dict[bytes, bytes] = {} - header_in_progress = False - decoder_name = "" - while True: - header = self.fp.read(80) - if not header: - msg = "Truncated FITS file" - raise OSError(msg) - keyword = header[:8].strip() - if keyword in (b"SIMPLE", b"XTENSION"): - header_in_progress = True - elif headers and not header_in_progress: - # This is now a data unit - break - elif keyword == b"END": - # Seek to the end of the header unit - self.fp.seek(math.ceil(self.fp.tell() / 2880) * 2880) - if not decoder_name: - decoder_name, offset, args = self._parse_headers(headers) - - header_in_progress = False - continue - - if decoder_name: - # Keep going to read past the headers - continue - - value = header[8:].split(b"/")[0].strip() - if value.startswith(b"="): - value = value[1:].strip() - if not headers and (not _accept(keyword) or value != b"T"): - msg = "Not a FITS file" - raise SyntaxError(msg) - headers[keyword] = value - - if not decoder_name: - msg = "No image data" - raise ValueError(msg) - - offset += self.fp.tell() - 80 - self.tile = [(decoder_name, (0, 0) + self.size, offset, args)] - - def _get_size( - self, headers: dict[bytes, bytes], prefix: bytes - ) -> tuple[int, int] | None: - naxis = int(headers[prefix + b"NAXIS"]) - if naxis == 0: - return None - - if naxis == 1: - return 1, int(headers[prefix + b"NAXIS1"]) - else: - return int(headers[prefix + b"NAXIS1"]), int(headers[prefix + b"NAXIS2"]) - - def _parse_headers( - self, headers: dict[bytes, bytes] - ) -> tuple[str, int, tuple[str | int, ...]]: - prefix = b"" - decoder_name = "raw" - offset = 0 - if ( - headers.get(b"XTENSION") == b"'BINTABLE'" - and headers.get(b"ZIMAGE") == b"T" - and headers[b"ZCMPTYPE"] == b"'GZIP_1 '" - ): - no_prefix_size = self._get_size(headers, prefix) or (0, 0) - number_of_bits = int(headers[b"BITPIX"]) - offset = no_prefix_size[0] * no_prefix_size[1] * (number_of_bits // 8) - - prefix = b"Z" - decoder_name = "fits_gzip" - - size = self._get_size(headers, prefix) - if not size: - return "", 0, () - - self._size = size - - number_of_bits = int(headers[prefix + b"BITPIX"]) - if number_of_bits == 8: - self._mode = "L" - elif number_of_bits == 16: - self._mode = "I;16" - elif number_of_bits == 32: - self._mode = "I" - elif number_of_bits in (-32, -64): - self._mode = "F" - - args = (self.mode, 0, -1) if decoder_name == "raw" else (number_of_bits,) - return decoder_name, offset, args - - -class FitsGzipDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer): - assert self.fd is not None - value = gzip.decompress(self.fd.read()) - - rows = [] - offset = 0 - number_of_bits = min(self.args[0] // 8, 4) - for y in range(self.state.ysize): - row = bytearray() - for x in range(self.state.xsize): - row += value[offset + (4 - number_of_bits) : offset + 4] - offset += 4 - rows.append(row) - self.set_as_raw(bytes([pixel for row in rows[::-1] for pixel in row])) - return -1, 0 - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(FitsImageFile.format, FitsImageFile, _accept) -Image.register_decoder("fits_gzip", FitsGzipDecoder) - -Image.register_extensions(FitsImageFile.format, [".fit", ".fits"]) diff --git a/.flatpak-builder/cache/objects/15/892a0a9bfa012cc02fae39b6639d84f30b910db45affff8ea2e33e55d351b7.file b/.flatpak-builder/cache/objects/15/892a0a9bfa012cc02fae39b6639d84f30b910db45affff8ea2e33e55d351b7.file deleted file mode 100644 index 2ffa7a91c852d734cfd7fa4cec04a792201a9810..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41393 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 MAX_STRING_LENGTH: - msg = "too many characters in string" - raise ValueError(msg) - - -# FIXME: add support for pilfont2 format (see FontFile.py) - -# -------------------------------------------------------------------- -# Font metrics format: -# "PILfont" LF -# fontdescriptor LF -# (optional) key=value... LF -# "DATA" LF -# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) -# -# To place a character, cut out srcbox and paste at dstbox, -# relative to the character position. Then move the character -# position according to dx, dy. -# -------------------------------------------------------------------- - - -class ImageFont: - """PIL font wrapper""" - - def _load_pilfont(self, filename): - with open(filename, "rb") as fp: - image = None - for ext in (".png", ".gif", ".pbm"): - if image: - image.close() - try: - fullname = os.path.splitext(filename)[0] + ext - image = Image.open(fullname) - except Exception: - pass - else: - if image and image.mode in ("1", "L"): - break - else: - if image: - image.close() - msg = "cannot find glyph data file" - raise OSError(msg) - - self.file = fullname - - self._load_pilfont_data(fp, image) - image.close() - - def _load_pilfont_data(self, file, image): - # read PILfont header - if file.readline() != b"PILfont\n": - msg = "Not a PILfont file" - raise SyntaxError(msg) - file.readline().split(b";") - self.info = [] # FIXME: should be a dictionary - while True: - s = file.readline() - if not s or s == b"DATA\n": - break - self.info.append(s) - - # read PILfont metrics - data = file.read(256 * 20) - - # check image - if image.mode not in ("1", "L"): - msg = "invalid font image mode" - raise TypeError(msg) - - image.load() - - self.font = Image.core.font(image.im, data) - - def getmask(self, text, mode="", *args, **kwargs): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - _string_length_check(text) - Image._decompression_bomb_check(self.font.getsize(text)) - return self.font.getmask(text, mode) - - def getbbox(self, text, *args, **kwargs): - """ - Returns bounding box (in pixels) of given text. - - .. versionadded:: 9.2.0 - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :return: ``(left, top, right, bottom)`` bounding box - """ - _string_length_check(text) - width, height = self.font.getsize(text) - return 0, 0, width, height - - def getlength(self, text, *args, **kwargs): - """ - Returns length (in pixels) of given text. - This is the amount by which following text should be offset. - - .. versionadded:: 9.2.0 - """ - _string_length_check(text) - width, height = self.font.getsize(text) - return width - - -## -# Wrapper for FreeType fonts. Application code should use the -# truetype factory function to create font objects. - - -class FreeTypeFont: - """FreeType font wrapper (requires _imagingft service)""" - - def __init__( - self, - font: StrOrBytesPath | BinaryIO | None = None, - size: float = 10, - index: int = 0, - encoding: str = "", - layout_engine: Layout | None = None, - ) -> None: - # FIXME: use service provider instead - - if size <= 0: - msg = "font size must be greater than 0" - raise ValueError(msg) - - self.path = font - self.size = size - self.index = index - self.encoding = encoding - - if layout_engine not in (Layout.BASIC, Layout.RAQM): - layout_engine = Layout.BASIC - if core.HAVE_RAQM: - layout_engine = Layout.RAQM - elif layout_engine == Layout.RAQM and not core.HAVE_RAQM: - warnings.warn( - "Raqm layout was requested, but Raqm is not available. " - "Falling back to basic layout." - ) - layout_engine = Layout.BASIC - - self.layout_engine = layout_engine - - def load_from_bytes(f): - self.font_bytes = f.read() - self.font = core.getfont( - "", size, index, encoding, self.font_bytes, layout_engine - ) - - if is_path(font): - font = os.path.realpath(os.fspath(font)) - if sys.platform == "win32": - font_bytes_path = font if isinstance(font, bytes) else font.encode() - try: - font_bytes_path.decode("ascii") - except UnicodeDecodeError: - # FreeType cannot load fonts with non-ASCII characters on Windows - # So load it into memory first - with open(font, "rb") as f: - load_from_bytes(f) - return - self.font = core.getfont( - font, size, index, encoding, layout_engine=layout_engine - ) - else: - load_from_bytes(font) - - def __getstate__(self): - return [self.path, self.size, self.index, self.encoding, self.layout_engine] - - def __setstate__(self, state): - path, size, index, encoding, layout_engine = state - self.__init__(path, size, index, encoding, layout_engine) - - def getname(self): - """ - :return: A tuple of the font family (e.g. Helvetica) and the font style - (e.g. Bold) - """ - return self.font.family, self.font.style - - def getmetrics(self): - """ - :return: A tuple of the font ascent (the distance from the baseline to - the highest outline point) and descent (the distance from the - baseline to the lowest outline point, a negative value) - """ - return self.font.ascent, self.font.descent - - def getlength(self, text, mode="", direction=None, features=None, language=None): - """ - Returns length (in pixels with 1/64 precision) of given text when rendered - in font with provided direction, features, and language. - - This is the amount by which following text should be offset. - Text bounding box may extend past the length in some fonts, - e.g. when using italics or accents. - - The result is returned as a float; it is a whole number if using basic layout. - - Note that the sum of two lengths may not equal the length of a concatenated - string due to kerning. If you need to adjust for kerning, include the following - character and subtract its length. - - For example, instead of :: - - hello = font.getlength("Hello") - world = font.getlength("World") - hello_world = hello + world # not adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # may fail - - use :: - - hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning - world = font.getlength("World") - hello_world = hello + world # adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # True - - or disable kerning with (requires libraqm) :: - - hello = draw.textlength("Hello", font, features=["-kern"]) - world = draw.textlength("World", font, features=["-kern"]) - hello_world = hello + world # kerning is disabled, no need to adjust - assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"]) - - .. versionadded:: 8.0.0 - - :param text: Text to measure. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :return: Either width for horizontal text, or height for vertical text. - """ - _string_length_check(text) - return self.font.getlength(text, mode, direction, features, language) / 64 - - def getbbox( - self, - text, - mode="", - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ): - """ - Returns bounding box (in pixels) of given text relative to given anchor - when rendered in font with provided direction, features, and language. - - Use :py:meth:`getlength()` to get the offset of following text with - 1/64 pixel precision. The bounding box includes extra margins for - some fonts, e.g. italics or accents. - - .. versionadded:: 8.0.0 - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :param stroke_width: The width of the text stroke. - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - :return: ``(left, top, right, bottom)`` bounding box - """ - _string_length_check(text) - size, offset = self.font.getsize( - text, mode, direction, features, language, anchor - ) - left, top = offset[0] - stroke_width, offset[1] - stroke_width - width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width - return left, top, left + width, top + height - - def getmask( - self, - text, - mode="", - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ink=0, - start=None, - ): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :param start: Tuple of horizontal and vertical offset, as text may render - differently when starting at fractional coordinates. - - .. versionadded:: 9.4.0 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - return self.getmask2( - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - anchor=anchor, - ink=ink, - start=start, - )[0] - - def getmask2( - self, - text, - mode="", - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ink=0, - start=None, - *args, - **kwargs, - ): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :param start: Tuple of horizontal and vertical offset, as text may render - differently when starting at fractional coordinates. - - .. versionadded:: 9.4.0 - - :return: A tuple of an internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module, and the text offset, the - gap between the starting coordinate and the first marking - """ - _string_length_check(text) - if start is None: - start = (0, 0) - - def fill(width, height): - size = (width, height) - Image._decompression_bomb_check(size) - return Image.core.fill("RGBA" if mode == "RGBA" else "L", size) - - return self.font.render( - text, - fill, - mode, - direction, - features, - language, - stroke_width, - anchor, - ink, - start[0], - start[1], - ) - - def font_variant( - self, font=None, size=None, index=None, encoding=None, layout_engine=None - ): - """ - Create a copy of this FreeTypeFont object, - using any specified arguments to override the settings. - - Parameters are identical to the parameters used to initialize this - object. - - :return: A FreeTypeFont object. - """ - if font is None: - try: - font = BytesIO(self.font_bytes) - except AttributeError: - font = self.path - return FreeTypeFont( - font=font, - size=self.size if size is None else size, - index=self.index if index is None else index, - encoding=self.encoding if encoding is None else encoding, - layout_engine=layout_engine or self.layout_engine, - ) - - def get_variation_names(self): - """ - :returns: A list of the named styles in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - names = self.font.getvarnames() - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - return [name.replace(b"\x00", b"") for name in names] - - def set_variation_by_name(self, name): - """ - :param name: The name of the style. - :exception OSError: If the font is not a variation font. - """ - names = self.get_variation_names() - if not isinstance(name, bytes): - name = name.encode() - index = names.index(name) + 1 - - if index == getattr(self, "_last_variation_index", None): - # When the same name is set twice in a row, - # there is an 'unknown freetype error' - # https://savannah.nongnu.org/bugs/?56186 - return - self._last_variation_index = index - - self.font.setvarname(index) - - def get_variation_axes(self): - """ - :returns: A list of the axes in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - axes = self.font.getvaraxes() - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - for axis in axes: - axis["name"] = axis["name"].replace(b"\x00", b"") - return axes - - def set_variation_by_axes(self, axes): - """ - :param axes: A list of values for each axis. - :exception OSError: If the font is not a variation font. - """ - try: - self.font.setvaraxes(axes) - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - - -class TransposedFont: - """Wrapper for writing rotated or mirrored text""" - - def __init__(self, font, orientation=None): - """ - Wrapper that creates a transposed font from any existing font - object. - - :param font: A font object. - :param orientation: An optional orientation. If given, this should - be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM, - Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or - Image.Transpose.ROTATE_270. - """ - self.font = font - self.orientation = orientation # any 'transpose' argument, or None - - def getmask(self, text, mode="", *args, **kwargs): - im = self.font.getmask(text, mode, *args, **kwargs) - if self.orientation is not None: - return im.transpose(self.orientation) - return im - - def getbbox(self, text, *args, **kwargs): - # TransposedFont doesn't support getmask2, move top-left point to (0, 0) - # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont - left, top, right, bottom = self.font.getbbox(text, *args, **kwargs) - width = right - left - height = bottom - top - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - return 0, 0, height, width - return 0, 0, width, height - - def getlength(self, text, *args, **kwargs): - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - msg = "text length is undefined for text rotated by 90 or 270 degrees" - raise ValueError(msg) - return self.font.getlength(text, *args, **kwargs) - - -def load(filename): - """ - Load a font file. This function loads a font object from the given - bitmap font file, and returns the corresponding font object. - - :param filename: Name of font file. - :return: A font object. - :exception OSError: If the file could not be read. - """ - f = ImageFont() - f._load_pilfont(filename) - return f - - -def truetype(font=None, size=10, index=0, encoding="", layout_engine=None): - """ - Load a TrueType or OpenType font from a file or file-like object, - and create a font object. - This function loads a font object from the given file or file-like - object, and creates a font object for a font of the given size. - - Pillow uses FreeType to open font files. On Windows, be aware that FreeType - will keep the file open as long as the FreeTypeFont object exists. Windows - limits the number of files that can be open in C at once to 512, so if many - fonts are opened simultaneously and that limit is approached, an - ``OSError`` may be thrown, reporting that FreeType "cannot open resource". - A workaround would be to copy the file(s) into memory, and open that instead. - - This function requires the _imagingft service. - - :param font: A filename or file-like object containing a TrueType font. - If the file is not found in this filename, the loader may also - search in other directories, such as the :file:`fonts/` - directory on Windows or :file:`/Library/Fonts/`, - :file:`/System/Library/Fonts/` and :file:`~/Library/Fonts/` on - macOS. - - :param size: The requested size, in pixels. - :param index: Which font face to load (default is first available face). - :param encoding: Which font encoding to use (default is Unicode). Possible - encodings include (see the FreeType documentation for more - information): - - * "unic" (Unicode) - * "symb" (Microsoft Symbol) - * "ADOB" (Adobe Standard) - * "ADBE" (Adobe Expert) - * "ADBC" (Adobe Custom) - * "armn" (Apple Roman) - * "sjis" (Shift JIS) - * "gb " (PRC) - * "big5" - * "wans" (Extended Wansung) - * "joha" (Johab) - * "lat1" (Latin-1) - - This specifies the character set to use. It does not alter the - encoding of any text provided in subsequent operations. - :param layout_engine: Which layout engine to use, if available: - :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`. - If it is available, Raqm layout will be used by default. - Otherwise, basic layout will be used. - - Raqm layout is recommended for all non-English text. If Raqm layout - is not required, basic layout will have better performance. - - You can check support for Raqm layout using - :py:func:`PIL.features.check_feature` with ``feature="raqm"``. - - .. versionadded:: 4.2.0 - :return: A font object. - :exception OSError: If the file could not be read. - :exception ValueError: If the font size is not greater than zero. - """ - - def freetype(font): - return FreeTypeFont(font, size, index, encoding, layout_engine) - - try: - return freetype(font) - except OSError: - if not is_path(font): - raise - ttf_filename = os.path.basename(font) - - dirs = [] - if sys.platform == "win32": - # check the windows font repository - # NOTE: must use uppercase WINDIR, to work around bugs in - # 1.5.2's os.environ.get() - windir = os.environ.get("WINDIR") - if windir: - dirs.append(os.path.join(windir, "fonts")) - elif sys.platform in ("linux", "linux2"): - lindirs = os.environ.get("XDG_DATA_DIRS") - if not lindirs: - # According to the freedesktop spec, XDG_DATA_DIRS should - # default to /usr/share - lindirs = "/usr/share" - dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")] - elif sys.platform == "darwin": - dirs += [ - "/Library/Fonts", - "/System/Library/Fonts", - os.path.expanduser("~/Library/Fonts"), - ] - - ext = os.path.splitext(ttf_filename)[1] - first_font_with_a_different_extension = None - for directory in dirs: - for walkroot, walkdir, walkfilenames in os.walk(directory): - for walkfilename in walkfilenames: - if ext and walkfilename == ttf_filename: - return freetype(os.path.join(walkroot, walkfilename)) - elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: - fontpath = os.path.join(walkroot, walkfilename) - if os.path.splitext(fontpath)[1] == ".ttf": - return freetype(fontpath) - if not ext and first_font_with_a_different_extension is None: - first_font_with_a_different_extension = fontpath - if first_font_with_a_different_extension: - return freetype(first_font_with_a_different_extension) - raise - - -def load_path(filename): - """ - Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a - bitmap font along the Python path. - - :param filename: Name of font file. - :return: A font object. - :exception OSError: If the file could not be read. - """ - for directory in sys.path: - if is_directory(directory): - if not isinstance(filename, str): - filename = filename.decode("utf-8") - try: - return load(os.path.join(directory, filename)) - except OSError: - pass - msg = "cannot find font file" - raise OSError(msg) - - -def load_default(size: float | None = None) -> FreeTypeFont | ImageFont: - """If FreeType support is available, load a version of Aileron Regular, - https://dotcolon.net/font/aileron, with a more limited character set. - - Otherwise, load a "better than nothing" font. - - .. versionadded:: 1.1.4 - - :param size: The font size of Aileron Regular. - - .. versionadded:: 10.1.0 - - :return: A font object. - """ - if core.__class__.__name__ == "module" or size is not None: - f = truetype( - BytesIO( - base64.b64decode( - b""" -AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA -AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA -MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh -tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk -OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/ -2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ -AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI -BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA -AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ -AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk -QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB -kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC -ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA -EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg -JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y -AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q -AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq -QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB// -//4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT -FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT -U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA -AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9 -ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO -AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ -gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG -oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz -qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA -DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA -P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA -LfAAMABwAAEyMnMxcjJzOmRgpagkYKWgHl+vr6AAAAAAIARgAAAf4CsgAbAB8AAAEHMxUjByM3Iwc -jNyM1MzcjNTM3MwczNzMHMxUrAQczAZgdZXEvOi9bLzovWmYdZXEvOi9bLzovWp9bHlsBn4w429vb -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 -EQQ/BCQvEjQCFQZWFSEWQv40AcxCDiUblhP9uSEAAAAAAAAWAQ4AAQAAAAAAAAATACgAAQAAAAAAA -QAHAEwAAQAAAAAAAgAHAGQAAQAAAAAAAwAaAKIAAQAAAAAABAAHAM0AAQAAAAAABQA8AU8AAQAAAA -AABgAPAawAAQAAAAAACAALAdQAAQAAAAAACQALAfgAAQAAAAAACwAXAjQAAQAAAAAADAAXAnwAAwA -BBAkAAAAmAAAAAwABBAkAAQAOADwAAwABBAkAAgAOAFQAAwABBAkAAwA0AGwAAwABBAkABAAOAL0A -AwABBAkABQB4ANUAAwABBAkABgAeAYwAAwABBAkACAAWAbwAAwABBAkACQAWAeAAAwABBAkACwAuA -gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm -lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV -ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy -AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA -HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg -B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk -AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41 -ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA -HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3 -JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB -odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs -AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA -AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB -QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA -xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A -TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A -LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA -AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ -ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG -AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE -AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE -kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ -PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA -AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA -AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA -ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD -/4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA -AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA -BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA -AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ -ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA -gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC -YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA -AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ== -""" - ) - ), - 10 if size is None else size, - layout_engine=Layout.BASIC, - ) - else: - f = ImageFont() - f._load_pilfont_data( - # courB08 - BytesIO( - base64.b64decode( - b""" -UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA -BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL -AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA -AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB -ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A -BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB -//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA -AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH -AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA -ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv -AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ -/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 -AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA -AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG -AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA -BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA -AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA -2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF -AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// -+gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA -////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA -BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv -AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA -AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA -AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA -BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// -//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA -AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF -AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB -mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn -AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA -AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 -AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA -Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB -//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA -AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ -AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC -DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ -AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ -+wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 -AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ -///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG -AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA -BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA -Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC -eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG -AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// -+gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA -////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA -BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT -AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A -AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA -Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA -Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// -//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA -AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ -AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA -LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 -AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA -AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 -AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA -AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG -AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA -EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK -AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA -pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG -AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// -+QAGAAIAzgAKANUAEw== -""" - ) - ), - Image.open( - BytesIO( - base64.b64decode( - b""" -iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u -Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 -M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g -LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F -IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA -Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 -NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx -in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 -SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY -AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt -y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG -ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY -lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H -/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 -AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 -c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ -/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw -pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv -oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR -evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA -AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// -Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR -w7IkEbzhVQAAAABJRU5ErkJggg== -""" - ) - ) - ), - ) - return f diff --git a/.flatpak-builder/cache/objects/17/bc22e6ed55df6c0be52d856eb230e70e3e7d9ed3a93df75e2d6a3549855f3e.file b/.flatpak-builder/cache/objects/17/bc22e6ed55df6c0be52d856eb230e70e3e7d9ed3a93df75e2d6a3549855f3e.file deleted file mode 100644 index 1231293c7e993696afa4accc86f9f264c9bc12c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmZ3^%ge>gz`$_s_L{@3LQGkYfowPcNdN)kXEPu@PuFO~zZ?iFtYXC5a`O`FX`JL8^da z>;;)QnR#jXZa}tRacMz8eo;wkN_<*=QEp;Mv7aW(Ew1?Zw9=B&qSW~KB9L=#aipat zg80QntU&HchR;Bf;g`OCVnKm^PG*vRL1jrsex9+Op`m_pW=X1UL1J=tVtQ(^et@Ts zeo-pO2EBsHUmP~M`6;D2sdhy?K>Z-+6gvTl56p~=j5ipRE})_Z46+wc(E|qd2KE`M V7Z?;SGALYOPyjL@sE7+_3;+rITW0_O diff --git a/.flatpak-builder/cache/objects/17/da87e0832cc83a23ac1939679c357e37259e0004094be53e9a575ca3198e2a.file b/.flatpak-builder/cache/objects/17/da87e0832cc83a23ac1939679c357e37259e0004094be53e9a575ca3198e2a.file deleted file mode 100644 index 72a1fc6642d3bdaed43c9f9f9b3d6b3ab1a29dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2069 zcma)7U1%It6ux(U_J6aR&5w=PkZi@eZIdMy3>9hBXlvS%h89G(55r{dY@BredS^nD zZ3>H2*p`K^TImW3QEH9$rBBiaANnRf2ou?daG?+op?O=Wz7!ukXSTb^h9cg*bLQT2 z&OLL^ch0%{T{s+&2_c`Yd2d|$<7? zr=%2juVmGnC*_585A$DDQa*{CAS`f|u%MwVC~d2E;B$BJlkQ0QC1S`6f%e|;F9f&O zhOb+j5?4F4t+B1mLU$yv3{Pu-AK`N(5!u3Rf{LJ?&lhanHVb)ciy}`F>U2(@H-z7P z9XGQE=&9z!t64*MirmPUOG2Gnwhc>oxM45yyin!}g=`v+w+Ds-4}Clgi(6#Hh3R8y zs4WMmF1SvCGxE$9;$R^uKO*FNaE$wqgBC}g97*cMVlr#aC5y}UhlTv%@rj9~W!lDA zQBPk0SFPmi^y%cRxukQ~=h^JyyqO;_E(@=wr_)B!=25VOu2_RW%48$hTZ`8wYVqo8 z&d{OXf`=UC&|{F0G?Mmsids7egQO@UDT&dP%%qgUyiA3Rs>}mH_(adP0|=T>XQ$tP z^K2>RzDBri*#;jm5n7Ik70OH@Z*+m?0k#X;HxM|2w$S#3l%9;0`F zf43vMLhYyZiYhC+q*gDJu1L1GbDXS5-RI$(|L3c6_o)&XgfIJd*riPAuEbqZwOg8z zR*2T|e3!1LTX&b#+bzvVSL79$`C8@1z041m5ovd@01E=D9R$#G76J~|pF3EX^B_xgvmzV_FptZ$*NCbqGDGG%fI&+Iy1kWw!ZGGt-&I??~(3V2gEVBglrsWFE z5Q@7|T5B7-R{@@p%?N4r@ve|HIwyW9h){wt6&*^Km6 zFFBETYi@?3)e|>PUq4;%y>_O0ra~V^25T3um8zvCk^K8MVlP&v9>(_8)9bN#BNlf; z@ur7_duqx}@2$|Mq58S?=x8H4x*i&>&_4$D)O+hwpPavW{@Z=4`dZ)D2X7yA2F5B% zHSo8GMEjsw)7LInFMl<)N>>kmaq7!cPGo;Y*$hT%lh=<`j%^GLSKh9kZ2HJ^FVx># zWw*`sy~%t1_m!Xg4<;Vy&g8q!z_inU5)Aq)@Z-G@(F`Duy~qcEBs{{WX?Z2xTt5JN<5hY&*`>^wcZ*ttTZ=^c!To&XbThUT6dx4eYi#P5QtDL>S%AEW*_c?sK?N zh#(xBiDTWvr8sBib-v88>N(zuZe_VniZD0kO}why-1CEYAlBg-OSX}>Fx2iSpZH#H z!F80s0w-P)6$Ali}W0G3KEkOfr1PSaC1Rw4%F6hgUki#VPz;|*a4)^gV<2} cKx|~7SCCke0Tj>&8mRV`Q;;Ofm z8zY;$y~)w!R=kfHkPJ_KfPUXC6cu04WfWUJS=ZC1Y$nsX@dDRr{7g!oS7DP+UVKfX zhcKp((OvhVsJa_wg+~7eI?(-4{UMjTi^G-pO$tb6D4lq0N7BRg2p&>86TVn$`(>l3@a$c zC^*I{OpH_57_V?p1}=pM=vG_+1;q`H3YOTgjKQ3|TP3b?InH1(()&P?V?*(Xy-jO!Th_myk4p;!Y<`dHU887B(z4Wz1VRX}Rjc z4O&bQItaaxEM7{3{A}Q8MUUFF3$Sfe0IZ>Xv7<2kX!hakcIWzy!i_xM^Y?7rThA7< zHN<#^s)51$^}WC=+wpQ>uo4(7iGwv43Z2e#1#z#lXT$uwZ?mt4IM0X;@^9}2L)+au zr@ra`s=p|I8Quw(gV9PbnxCq6_0|w>>#24GH~1=OoqaBbcg1kgRThUU;&92H`(39t zFN1KQ8tjFacQ4epJ-IVm4n-@WC=lAJec_!qpN#MJozHU>AygH_N1lhCje&KsAm;5K z=>W&#&b12*nkBnY{{VzGY7yQi$B71HXaVFf6pz!+P+X2=po7%<0J?)0slF2fIGkqB z;a+F|c+nkg(FLcOj$hOD;(Utd;L7qzv@oRjT{XT)`av-1qkuLJ2~!ZFfQlk#07MxQ zp*ZCkIm0HilaYrgYE;>Jgt9~aM5f+J-iS`nfpA-X4YSA^5s6J;S%5hA6=tmn;%G$^FF zoj01%)(iF)BEvw8V%rUPMPOC`1l5b5gDYD*<_#siPx)w<+1?bgC85_=JQwv?f+XqC zgpy==B`K9wmNbfsl5}rL)(&@Ei8O(Bv;y_Fq^L%mBs26YZVgCrEp4chx*XS*jO2Y4 z8e5VRrb;9&Eh|ZV-cCS0Dd)h3r^wcATTB8#u)zp5@k86hH87L@s%?R_scP@5C9bDB za-qbXsc~I=u!bCP&czSZkOMj}e;RUg0@T$}O<8VKi7(GZ{nXdQlDR~{S3+ypLWCA7 z+*x;$x=dCG{m#{ItoFvAk@{!5UQ_g9wXZzec&m-5^GSpHOm81DN<{@6n!0SNx&gr= z27ibhJUb6*Io z@iiC5mmoR~&@qG|SSP{8)xRnApXSyqM!0*8ub{4t*-H2Dlm4GSEu(7{bghK0?V}Lg X32paRde1*el+mRMx>RaR+tdF5|71t* diff --git a/.flatpak-builder/cache/objects/19/7523ddd926c26bcda364c1f7250099d7258e415ba16828c88b789225e573fc.dirtree b/.flatpak-builder/cache/objects/19/7523ddd926c26bcda364c1f7250099d7258e415ba16828c88b789225e573fc.dirtree deleted file mode 100644 index 288336479b56d3a01f78fdb2d89b7ac73eb4d30d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67 zcmYe!&(+IHO-n0IEz)z$DM(CC)Ge;eP0G*7Ox7zdOJ^_*-qp{3;6LwCIiCNM+82Ke Xs%OaEkv6IMk^kl<)&u+e6&#%amE9a$ diff --git a/.flatpak-builder/cache/objects/1a/139355d24ec4215e369e415085f85e34c1745d4063cb94d9d73402b33fea67.dirtree b/.flatpak-builder/cache/objects/1a/139355d24ec4215e369e415085f85e34c1745d4063cb94d9d73402b33fea67.dirtree deleted file mode 100644 index 817d8e4b1ca53d3931fb2f2a2b365277d1b54120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcma!#&&#HZ$&K{KTluWX}WusBiVE diff --git a/.flatpak-builder/cache/objects/1a/45f8b3e2783a52d596d886e763241549f93f75ef28772202747037e27789de.dirtree b/.flatpak-builder/cache/objects/1a/45f8b3e2783a52d596d886e763241549f93f75ef28772202747037e27789de.dirtree deleted file mode 100644 index 76b6fff3fd5080d7150b00049b1381f09516666b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcma!#&&~=PCMy7#TGfgBfcXmor{wjE^s typing.Iterator[str]: - ... - - def __getitem__(self, key: str) -> str: - ... - - -__all__ = ["RecentlyUsedContainer", "HTTPHeaderDict"] - - -# Key type -_KT = typing.TypeVar("_KT") -# Value type -_VT = typing.TypeVar("_VT") -# Default type -_DT = typing.TypeVar("_DT") - -ValidHTTPHeaderSource = typing.Union[ - "HTTPHeaderDict", - typing.Mapping[str, str], - typing.Iterable[typing.Tuple[str, str]], - "HasGettableStringKeys", -] - - -class _Sentinel(Enum): - not_passed = auto() - - -def ensure_can_construct_http_header_dict( - potential: object, -) -> ValidHTTPHeaderSource | None: - if isinstance(potential, HTTPHeaderDict): - return potential - elif isinstance(potential, typing.Mapping): - # Full runtime checking of the contents of a Mapping is expensive, so for the - # purposes of typechecking, we assume that any Mapping is the right shape. - return typing.cast(typing.Mapping[str, str], potential) - elif isinstance(potential, typing.Iterable): - # Similarly to Mapping, full runtime checking of the contents of an Iterable is - # expensive, so for the purposes of typechecking, we assume that any Iterable - # is the right shape. - return typing.cast(typing.Iterable[typing.Tuple[str, str]], potential) - elif hasattr(potential, "keys") and hasattr(potential, "__getitem__"): - return typing.cast("HasGettableStringKeys", potential) - else: - return None - - -class RecentlyUsedContainer(typing.Generic[_KT, _VT], typing.MutableMapping[_KT, _VT]): - """ - Provides a thread-safe dict-like container which maintains up to - ``maxsize`` keys while throwing away the least-recently-used keys beyond - ``maxsize``. - - :param maxsize: - Maximum number of recent elements to retain. - - :param dispose_func: - Every time an item is evicted from the container, - ``dispose_func(value)`` is called. Callback which will get called - """ - - _container: typing.OrderedDict[_KT, _VT] - _maxsize: int - dispose_func: typing.Callable[[_VT], None] | None - lock: RLock - - def __init__( - self, - maxsize: int = 10, - dispose_func: typing.Callable[[_VT], None] | None = None, - ) -> None: - super().__init__() - self._maxsize = maxsize - self.dispose_func = dispose_func - self._container = OrderedDict() - self.lock = RLock() - - def __getitem__(self, key: _KT) -> _VT: - # Re-insert the item, moving it to the end of the eviction line. - with self.lock: - item = self._container.pop(key) - self._container[key] = item - return item - - def __setitem__(self, key: _KT, value: _VT) -> None: - evicted_item = None - with self.lock: - # Possibly evict the existing value of 'key' - try: - # If the key exists, we'll overwrite it, which won't change the - # size of the pool. Because accessing a key should move it to - # the end of the eviction line, we pop it out first. - evicted_item = key, self._container.pop(key) - self._container[key] = value - except KeyError: - # When the key does not exist, we insert the value first so that - # evicting works in all cases, including when self._maxsize is 0 - self._container[key] = value - if len(self._container) > self._maxsize: - # If we didn't evict an existing value, and we've hit our maximum - # size, then we have to evict the least recently used item from - # the beginning of the container. - evicted_item = self._container.popitem(last=False) - - # After releasing the lock on the pool, dispose of any evicted value. - if evicted_item is not None and self.dispose_func: - _, evicted_value = evicted_item - self.dispose_func(evicted_value) - - def __delitem__(self, key: _KT) -> None: - with self.lock: - value = self._container.pop(key) - - if self.dispose_func: - self.dispose_func(value) - - def __len__(self) -> int: - with self.lock: - return len(self._container) - - def __iter__(self) -> typing.NoReturn: - raise NotImplementedError( - "Iteration over this class is unlikely to be threadsafe." - ) - - def clear(self) -> None: - with self.lock: - # Copy pointers to all values, then wipe the mapping - values = list(self._container.values()) - self._container.clear() - - if self.dispose_func: - for value in values: - self.dispose_func(value) - - def keys(self) -> set[_KT]: # type: ignore[override] - with self.lock: - return set(self._container.keys()) - - -class HTTPHeaderDictItemView(typing.Set[typing.Tuple[str, str]]): - """ - HTTPHeaderDict is unusual for a Mapping[str, str] in that it has two modes of - address. - - If we directly try to get an item with a particular name, we will get a string - back that is the concatenated version of all the values: - - >>> d['X-Header-Name'] - 'Value1, Value2, Value3' - - However, if we iterate over an HTTPHeaderDict's items, we will optionally combine - these values based on whether combine=True was called when building up the dictionary - - >>> d = HTTPHeaderDict({"A": "1", "B": "foo"}) - >>> d.add("A", "2", combine=True) - >>> d.add("B", "bar") - >>> list(d.items()) - [ - ('A', '1, 2'), - ('B', 'foo'), - ('B', 'bar'), - ] - - This class conforms to the interface required by the MutableMapping ABC while - also giving us the nonstandard iteration behavior we want; items with duplicate - keys, ordered by time of first insertion. - """ - - _headers: HTTPHeaderDict - - def __init__(self, headers: HTTPHeaderDict) -> None: - self._headers = headers - - def __len__(self) -> int: - return len(list(self._headers.iteritems())) - - def __iter__(self) -> typing.Iterator[tuple[str, str]]: - return self._headers.iteritems() - - def __contains__(self, item: object) -> bool: - if isinstance(item, tuple) and len(item) == 2: - passed_key, passed_val = item - if isinstance(passed_key, str) and isinstance(passed_val, str): - return self._headers._has_value_for_header(passed_key, passed_val) - return False - - -class HTTPHeaderDict(typing.MutableMapping[str, str]): - """ - :param headers: - An iterable of field-value pairs. Must not contain multiple field names - when compared case-insensitively. - - :param kwargs: - Additional field-value pairs to pass in to ``dict.update``. - - A ``dict`` like container for storing HTTP Headers. - - Field names are stored and compared case-insensitively in compliance with - RFC 7230. Iteration provides the first case-sensitive key seen for each - case-insensitive pair. - - Using ``__setitem__`` syntax overwrites fields that compare equal - case-insensitively in order to maintain ``dict``'s api. For fields that - compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` - in a loop. - - If multiple fields that are equal case-insensitively are passed to the - constructor or ``.update``, the behavior is undefined and some will be - lost. - - >>> headers = HTTPHeaderDict() - >>> headers.add('Set-Cookie', 'foo=bar') - >>> headers.add('set-cookie', 'baz=quxx') - >>> headers['content-length'] = '7' - >>> headers['SET-cookie'] - 'foo=bar, baz=quxx' - >>> headers['Content-Length'] - '7' - """ - - _container: typing.MutableMapping[str, list[str]] - - def __init__(self, headers: ValidHTTPHeaderSource | None = None, **kwargs: str): - super().__init__() - self._container = {} # 'dict' is insert-ordered - if headers is not None: - if isinstance(headers, HTTPHeaderDict): - self._copy_from(headers) - else: - self.extend(headers) - if kwargs: - self.extend(kwargs) - - def __setitem__(self, key: str, val: str) -> None: - # avoid a bytes/str comparison by decoding before httplib - if isinstance(key, bytes): - key = key.decode("latin-1") - self._container[key.lower()] = [key, val] - - def __getitem__(self, key: str) -> str: - val = self._container[key.lower()] - return ", ".join(val[1:]) - - def __delitem__(self, key: str) -> None: - del self._container[key.lower()] - - def __contains__(self, key: object) -> bool: - if isinstance(key, str): - return key.lower() in self._container - return False - - def setdefault(self, key: str, default: str = "") -> str: - return super().setdefault(key, default) - - def __eq__(self, other: object) -> bool: - maybe_constructable = ensure_can_construct_http_header_dict(other) - if maybe_constructable is None: - return False - else: - other_as_http_header_dict = type(self)(maybe_constructable) - - return {k.lower(): v for k, v in self.itermerged()} == { - k.lower(): v for k, v in other_as_http_header_dict.itermerged() - } - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __len__(self) -> int: - return len(self._container) - - def __iter__(self) -> typing.Iterator[str]: - # Only provide the originally cased names - for vals in self._container.values(): - yield vals[0] - - def discard(self, key: str) -> None: - try: - del self[key] - except KeyError: - pass - - def add(self, key: str, val: str, *, combine: bool = False) -> None: - """Adds a (name, value) pair, doesn't overwrite the value if it already - exists. - - If this is called with combine=True, instead of adding a new header value - as a distinct item during iteration, this will instead append the value to - any existing header value with a comma. If no existing header value exists - for the key, then the value will simply be added, ignoring the combine parameter. - - >>> headers = HTTPHeaderDict(foo='bar') - >>> headers.add('Foo', 'baz') - >>> headers['foo'] - 'bar, baz' - >>> list(headers.items()) - [('foo', 'bar'), ('foo', 'baz')] - >>> headers.add('foo', 'quz', combine=True) - >>> list(headers.items()) - [('foo', 'bar, baz, quz')] - """ - # avoid a bytes/str comparison by decoding before httplib - if isinstance(key, bytes): - key = key.decode("latin-1") - key_lower = key.lower() - new_vals = [key, val] - # Keep the common case aka no item present as fast as possible - vals = self._container.setdefault(key_lower, new_vals) - if new_vals is not vals: - # if there are values here, then there is at least the initial - # key/value pair - assert len(vals) >= 2 - if combine: - vals[-1] = vals[-1] + ", " + val - else: - vals.append(val) - - def extend(self, *args: ValidHTTPHeaderSource, **kwargs: str) -> None: - """Generic import function for any type of header-like object. - Adapted version of MutableMapping.update in order to insert items - with self.add instead of self.__setitem__ - """ - if len(args) > 1: - raise TypeError( - f"extend() takes at most 1 positional arguments ({len(args)} given)" - ) - other = args[0] if len(args) >= 1 else () - - if isinstance(other, HTTPHeaderDict): - for key, val in other.iteritems(): - self.add(key, val) - elif isinstance(other, typing.Mapping): - for key, val in other.items(): - self.add(key, val) - elif isinstance(other, typing.Iterable): - other = typing.cast(typing.Iterable[typing.Tuple[str, str]], other) - for key, value in other: - self.add(key, value) - elif hasattr(other, "keys") and hasattr(other, "__getitem__"): - # THIS IS NOT A TYPESAFE BRANCH - # In this branch, the object has a `keys` attr but is not a Mapping or any of - # the other types indicated in the method signature. We do some stuff with - # it as though it partially implements the Mapping interface, but we're not - # doing that stuff safely AT ALL. - for key in other.keys(): - self.add(key, other[key]) - - for key, value in kwargs.items(): - self.add(key, value) - - @typing.overload - def getlist(self, key: str) -> list[str]: - ... - - @typing.overload - def getlist(self, key: str, default: _DT) -> list[str] | _DT: - ... - - def getlist( - self, key: str, default: _Sentinel | _DT = _Sentinel.not_passed - ) -> list[str] | _DT: - """Returns a list of all the values for the named field. Returns an - empty list if the key doesn't exist.""" - try: - vals = self._container[key.lower()] - except KeyError: - if default is _Sentinel.not_passed: - # _DT is unbound; empty list is instance of List[str] - return [] - # _DT is bound; default is instance of _DT - return default - else: - # _DT may or may not be bound; vals[1:] is instance of List[str], which - # meets our external interface requirement of `Union[List[str], _DT]`. - return vals[1:] - - def _prepare_for_method_change(self) -> Self: - """ - Remove content-specific header fields before changing the request - method to GET or HEAD according to RFC 9110, Section 15.4. - """ - content_specific_headers = [ - "Content-Encoding", - "Content-Language", - "Content-Location", - "Content-Type", - "Content-Length", - "Digest", - "Last-Modified", - ] - for header in content_specific_headers: - self.discard(header) - return self - - # Backwards compatibility for httplib - getheaders = getlist - getallmatchingheaders = getlist - iget = getlist - - # Backwards compatibility for http.cookiejar - get_all = getlist - - def __repr__(self) -> str: - return f"{type(self).__name__}({dict(self.itermerged())})" - - def _copy_from(self, other: HTTPHeaderDict) -> None: - for key in other: - val = other.getlist(key) - self._container[key.lower()] = [key, *val] - - def copy(self) -> HTTPHeaderDict: - clone = type(self)() - clone._copy_from(self) - return clone - - def iteritems(self) -> typing.Iterator[tuple[str, str]]: - """Iterate over all header lines, including duplicate ones.""" - for key in self: - vals = self._container[key.lower()] - for val in vals[1:]: - yield vals[0], val - - def itermerged(self) -> typing.Iterator[tuple[str, str]]: - """Iterate over all headers, merging duplicate ones together.""" - for key in self: - val = self._container[key.lower()] - yield val[0], ", ".join(val[1:]) - - def items(self) -> HTTPHeaderDictItemView: # type: ignore[override] - return HTTPHeaderDictItemView(self) - - def _has_value_for_header(self, header_name: str, potential_value: str) -> bool: - if header_name in self: - return potential_value in self._container[header_name.lower()][1:] - return False - - def __ior__(self, other: object) -> HTTPHeaderDict: - # Supports extending a header dict in-place using operator |= - # combining items with add instead of __setitem__ - maybe_constructable = ensure_can_construct_http_header_dict(other) - if maybe_constructable is None: - return NotImplemented - self.extend(maybe_constructable) - return self - - def __or__(self, other: object) -> HTTPHeaderDict: - # Supports merging header dicts using operator | - # combining items with add instead of __setitem__ - maybe_constructable = ensure_can_construct_http_header_dict(other) - if maybe_constructable is None: - return NotImplemented - result = self.copy() - result.extend(maybe_constructable) - return result - - def __ror__(self, other: object) -> HTTPHeaderDict: - # Supports merging header dicts using operator | when other is on left side - # combining items with add instead of __setitem__ - maybe_constructable = ensure_can_construct_http_header_dict(other) - if maybe_constructable is None: - return NotImplemented - result = type(self)(maybe_constructable) - result.extend(self) - return result diff --git a/.flatpak-builder/cache/objects/1b/8706c6ef9a50fa88c92942fc6353ea3c8a3ffe3e78f915c6eb3c5002fa3f9d.file b/.flatpak-builder/cache/objects/1b/8706c6ef9a50fa88c92942fc6353ea3c8a3ffe3e78f915c6eb3c5002fa3f9d.file deleted file mode 100644 index 6225e8cf41e53300b0d4c0cf8c121ad82401a9b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17822 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 diff --git a/.flatpak-builder/cache/objects/1b/8cde0dbf0c57ca89d8972d7c89d3930028b423c7b0a8ec30cf455575573c34.file b/.flatpak-builder/cache/objects/1b/8cde0dbf0c57ca89d8972d7c89d3930028b423c7b0a8ec30cf455575573c34.file deleted file mode 100644 index 54a02e1035612d4d761102dc3aa2739fa29572ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30995 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 diff --git a/.flatpak-builder/cache/objects/1c/01778aed450a2fc58b4eaf4af5d4bb7c4854b8b6cd103d713369cb0af791e6.file b/.flatpak-builder/cache/objects/1c/01778aed450a2fc58b4eaf4af5d4bb7c4854b8b6cd103d713369cb0af791e6.file deleted file mode 100644 index f4529d9..0000000 --- a/.flatpak-builder/cache/objects/1c/01778aed450a2fc58b4eaf4af5d4bb7c4854b8b6cd103d713369cb0af791e6.file +++ /dev/null @@ -1,107 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Microsoft Image Composer support for PIL -# -# Notes: -# uses TiffImagePlugin.py to read the actual image streams -# -# History: -# 97-01-20 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import olefile - -from . import Image, TiffImagePlugin - -# -# -------------------------------------------------------------------- - - -def _accept(prefix): - return prefix[:8] == olefile.MAGIC - - -## -# Image plugin for Microsoft's Image Composer file format. - - -class MicImageFile(TiffImagePlugin.TiffImageFile): - format = "MIC" - format_description = "Microsoft Image Composer" - _close_exclusive_fp_after_loading = False - - def _open(self): - # read the OLE directory and see if this is a likely - # to be a Microsoft Image Composer file - - try: - self.ole = olefile.OleFileIO(self.fp) - except OSError as e: - msg = "not an MIC file; invalid OLE file" - raise SyntaxError(msg) from e - - # find ACI subfiles with Image members (maybe not the - # best way to identify MIC files, but what the... ;-) - - self.images = [ - path - for path in self.ole.listdir() - if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image" - ] - - # if we didn't find any images, this is probably not - # an MIC file. - if not self.images: - msg = "not an MIC file; no image entries" - raise SyntaxError(msg) - - self.frame = None - self._n_frames = len(self.images) - self.is_animated = self._n_frames > 1 - - self.__fp = self.fp - self.seek(0) - - def seek(self, frame): - if not self._seek_check(frame): - return - try: - filename = self.images[frame] - except IndexError as e: - msg = "no such frame" - raise EOFError(msg) from e - - self.fp = self.ole.openstream(filename) - - TiffImagePlugin.TiffImageFile._open(self) - - self.frame = frame - - def tell(self): - return self.frame - - def close(self): - self.__fp.close() - self.ole.close() - super().close() - - def __exit__(self, *args): - self.__fp.close() - self.ole.close() - super().__exit__() - - -# -# -------------------------------------------------------------------- - -Image.register_open(MicImageFile.format, MicImageFile, _accept) - -Image.register_extension(MicImageFile.format, ".mic") diff --git a/.flatpak-builder/cache/objects/1c/0d191d2c4e3e6f0157890711e8b8256d96ffec83836f2345b7faf9bae0535a.file b/.flatpak-builder/cache/objects/1c/0d191d2c4e3e6f0157890711e8b8256d96ffec83836f2345b7faf9bae0535a.file deleted file mode 100755 index 028d37c3342d4ac41e350f2383ae49474c3bc591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40832 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 diff --git a/.flatpak-builder/cache/objects/1c/702c5ca32d24017290c53e595e33e4f168b790b104d7983ffd4fc96b7cf3f7.dirtree b/.flatpak-builder/cache/objects/1c/702c5ca32d24017290c53e595e33e4f168b790b104d7983ffd4fc96b7cf3f7.dirtree deleted file mode 100644 index d06062fc97a0b3191b1c0e997fa77a0e0f2d2e62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 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 LUm8KAqjmisCSA7? diff --git a/.flatpak-builder/cache/objects/1d/7ef47339dcb8c4b4212c03ba3bf7c03c97ae89f66a6eaddb3740b546e81a9f.dirtree b/.flatpak-builder/cache/objects/1d/7ef47339dcb8c4b4212c03ba3bf7c03c97ae89f66a6eaddb3740b546e81a9f.dirtree deleted file mode 100644 index a66fb90de711c18340e865d9f77c65a330abeaf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 911 zcma!#&&%cR3rkarOX71= zOEU6Pz?y0U{>;nNuKytsb8ge*gu7YAbGmZhY4iVAo+I*yDJs7}B)%-Qs2J*`JhqXBVNuIER_RgD@%l9%y zt(~?x;cIl&*_AF^6)*51lo#aZ=YafR)*8~g*06Tvt*OR^rffYoZiMws<(?;e@t?=# z^k+MbU4&9Al2Z#nK?HVv0_Q8=#}ixS4o;FjAr(=cX3;c{qs>`2Ek?e`*Hvf!0=~4& z)EtOMoI{Bs?DL8V?vWkG5R!^{$s*I!O8O>gu2R`yNpPPV-3t{LibA+>6< z61nkg86BKOsl^4ra7YCiYco%D<(fbz?z=Hh0#!PeuHVNpsq~^r*TWT)@^);pTY8B{ zmm!H^GQ$amuM8@T;f!sJ8yW90axhsiB{B6g#m5&^CMPCmq{hcHSUt<%aZl^I%H31* zr++a)U(y9cutd4^3l*|pq$@&h^lt67a5s_f-4dm9Ovq`^^I zl9|I``m(ls`{MH#-_GDLxWY6c(Bs&dKfETI3ub0Lezbh+i@$`7QDya;aep-v0Hz|E A)&Kwi diff --git a/.flatpak-builder/cache/objects/1e/6e467308de61eaace9413cded9b9b342f3f2dc9f179812e37fb61ceef58891.file b/.flatpak-builder/cache/objects/1e/6e467308de61eaace9413cded9b9b342f3f2dc9f179812e37fb61ceef58891.file deleted file mode 100644 index 3fe782c..0000000 --- a/.flatpak-builder/cache/objects/1e/6e467308de61eaace9413cded9b9b342f3f2dc9f179812e37fb61ceef58891.file +++ /dev/null @@ -1,211 +0,0 @@ -""" -Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more -""" - -from __future__ import annotations - -# Set default logging handler to avoid "No handler found" warnings. -import logging -import sys -import typing -import warnings -from logging import NullHandler - -from . import exceptions -from ._base_connection import _TYPE_BODY -from ._collections import HTTPHeaderDict -from ._version import __version__ -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url -from .filepost import _TYPE_FIELDS, encode_multipart_formdata -from .poolmanager import PoolManager, ProxyManager, proxy_from_url -from .response import BaseHTTPResponse, HTTPResponse -from .util.request import make_headers -from .util.retry import Retry -from .util.timeout import Timeout - -# Ensure that Python is compiled with OpenSSL 1.1.1+ -# If the 'ssl' module isn't available at all that's -# fine, we only care if the module is available. -try: - import ssl -except ImportError: - pass -else: - if not ssl.OPENSSL_VERSION.startswith("OpenSSL "): # Defensive: - warnings.warn( - "urllib3 v2 only supports OpenSSL 1.1.1+, currently " - f"the 'ssl' module is compiled with {ssl.OPENSSL_VERSION!r}. " - "See: https://github.com/urllib3/urllib3/issues/3020", - exceptions.NotOpenSSLWarning, - ) - elif ssl.OPENSSL_VERSION_INFO < (1, 1, 1): # Defensive: - raise ImportError( - "urllib3 v2 only supports OpenSSL 1.1.1+, currently " - f"the 'ssl' module is compiled with {ssl.OPENSSL_VERSION!r}. " - "See: https://github.com/urllib3/urllib3/issues/2168" - ) - -__author__ = "Andrey Petrov (andrey.petrov@shazow.net)" -__license__ = "MIT" -__version__ = __version__ - -__all__ = ( - "HTTPConnectionPool", - "HTTPHeaderDict", - "HTTPSConnectionPool", - "PoolManager", - "ProxyManager", - "HTTPResponse", - "Retry", - "Timeout", - "add_stderr_logger", - "connection_from_url", - "disable_warnings", - "encode_multipart_formdata", - "make_headers", - "proxy_from_url", - "request", - "BaseHTTPResponse", -) - -logging.getLogger(__name__).addHandler(NullHandler()) - - -def add_stderr_logger( - level: int = logging.DEBUG, -) -> logging.StreamHandler[typing.TextIO]: - """ - Helper for quickly adding a StreamHandler to the logger. Useful for - debugging. - - Returns the handler after adding it. - """ - # This method needs to be in this __init__.py to get the __name__ correct - # even if urllib3 is vendored within another package. - logger = logging.getLogger(__name__) - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) - logger.addHandler(handler) - logger.setLevel(level) - logger.debug("Added a stderr logging handler to logger: %s", __name__) - return handler - - -# ... Clean up. -del NullHandler - - -# All warning filters *must* be appended unless you're really certain that they -# shouldn't be: otherwise, it's very hard for users to use most Python -# mechanisms to silence them. -# SecurityWarning's always go off by default. -warnings.simplefilter("always", exceptions.SecurityWarning, append=True) -# InsecurePlatformWarning's don't vary between requests, so we keep it default. -warnings.simplefilter("default", exceptions.InsecurePlatformWarning, append=True) - - -def disable_warnings(category: type[Warning] = exceptions.HTTPWarning) -> None: - """ - Helper for quickly disabling all urllib3 warnings. - """ - warnings.simplefilter("ignore", category) - - -_DEFAULT_POOL = PoolManager() - - -def request( - method: str, - url: str, - *, - body: _TYPE_BODY | None = None, - fields: _TYPE_FIELDS | None = None, - headers: typing.Mapping[str, str] | None = None, - preload_content: bool | None = True, - decode_content: bool | None = True, - redirect: bool | None = True, - retries: Retry | bool | int | None = None, - timeout: Timeout | float | int | None = 3, - json: typing.Any | None = None, -) -> BaseHTTPResponse: - """ - A convenience, top-level request method. It uses a module-global ``PoolManager`` instance. - Therefore, its side effects could be shared across dependencies relying on it. - To avoid side effects create a new ``PoolManager`` instance and use it instead. - The method does not accept low-level ``**urlopen_kw`` keyword arguments. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param url: - The URL to perform the request on. - - :param body: - Data to send in the request body, either :class:`str`, :class:`bytes`, - an iterable of :class:`str`/:class:`bytes`, or a file-like object. - - :param fields: - Data to encode and send in the request body. - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. - - :param bool preload_content: - If True, the response's body will be preloaded into memory. - - :param bool decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. Disabling retries - will disable redirect, too. - - :param retries: - Configure the number of retries to allow before raising a - :class:`~urllib3.exceptions.MaxRetryError` exception. - - If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a - :class:`~urllib3.util.retry.Retry` object for fine-grained control - over different types of retries. - Pass an integer number to retry connection errors that many times, - but no other types of errors. Pass zero to never retry. - - If ``False``, then retries are disabled and any exception is raised - immediately. Also, instead of raising a MaxRetryError on redirects, - the redirect response will be returned. - - :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param json: - Data to encode and send as JSON with UTF-encoded in the request body. - The ``"Content-Type"`` header will be set to ``"application/json"`` - unless specified otherwise. - """ - - return _DEFAULT_POOL.request( - method, - url, - body=body, - fields=fields, - headers=headers, - preload_content=preload_content, - decode_content=decode_content, - redirect=redirect, - retries=retries, - timeout=timeout, - json=json, - ) - - -if sys.platform == "emscripten": - from .contrib.emscripten import inject_into_urllib3 # noqa: 401 - - inject_into_urllib3() diff --git a/.flatpak-builder/cache/objects/1e/78621e90fbf44cdd33ea5de30a9b1d77b6979256079e95cd2bc65f7b03aca2.file b/.flatpak-builder/cache/objects/1e/78621e90fbf44cdd33ea5de30a9b1d77b6979256079e95cd2bc65f7b03aca2.file deleted file mode 100755 index fd6222e558d2a0a5c47a618e38cc5e2c3f09683b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41424 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 diff --git a/.flatpak-builder/cache/objects/1f/a3a43dfe8ff647cc5252f6cd6a2ef58f49a6909d1da9315009f07cfccd9004.file b/.flatpak-builder/cache/objects/1f/a3a43dfe8ff647cc5252f6cd6a2ef58f49a6909d1da9315009f07cfccd9004.file deleted file mode 100644 index f29d980645403a6649c44bdcb1e1b40814762771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6186 zcmb_g+ix7z8K0TGcy`y$hS-TrfM$YYuN^yU112QIq;c)g1P23+ORI%+cf50K58fMR zW)p0j$`6s6N>OF1pcn|ks!*CJLgJx+Kvngl?>nUcR9jxu3k5SbTix|y(blIktoEH2;?{^#`@R1%3O6JsC1jXDG312LXfu3Q zbwUy%|4QaTYdf}kx1luW3G3K}v(pkX5n8ZjcEtwt+oo1sAAUDft6-C}2R7RyhoT23ljO(_U&skc2Ml?>P8Wm2ZG~LoJF?7T)%@MOOSvp@>NTuT1XvWHmeg&St zXc~-o8M1TIv{}|d6Gw(o^q*%7n3Xe)y;Xp8%+Tz-HqFRSu(TD|rsl+l<5`VE=Ik`% z7QDyA9Hcblq;D;wTQ-g8j=}5!p;0P@iFq$fW9zvz>r15uYI@Q1z4Q$cg>ZEre2YnD zaR%`ki2*K|P$8Yq*}9o?%Uw}$NpjsD83}OSl#4s%}gjVOl zXP!68Gwoz@@zEy0j=S7mOk_O+ zvMhbJ@8CPx>)EURYms}A=+%*X?R&3|-&5PEVr9IfcHv!p-udwbLIa!i-fIxjxnC}Cz2xgk*DLVUIih2#6qTY{! zEKB#I?bqI3ed?p*?;n5f#LW|xXzaFJi5@PghaaHgv*`L`RD5pBk3t*1p9I;ahQSd2 z5Av7S;3)N`A)rR?Rp|y2!nN=gt|i335+ACnwALDg=SUV2&y1a@ z{w6ds%W_!D`N_q>=9q>Bc`_Lv$>h^|#yT1II*{wE7|4I{w=9*S6L`yyJ-PbpwYOJP z=d+#)1NPN|F6hW|M;0KoNaGs(D94B?zct4Q?s1y^5C{Q}X8zRp%lyXCGwVmsl#jkp zIr;(#6P>7lr%pV;cZV^=4XHjeBi=j*+(PND_f<pb|Y$QV%>p)c-Hc7USn=mr1s!Ai=h3K$|YwSmNzD zvBwl?ks#!3jT%tthwK8CLnwHtd}s@mONt?FrJfn3hSEKTOb{1YXp(E_jJ$ggKUGys zM_>(t038k4my@R#pKNAQ(a+hbHUa4<`dK8T3(~1lbgF!K>jb-U`G237Le~)aOdS(68E9Fz?E2qwrV9}`x zc4DEteBZGe^Sx|X+4zUzJS-L`wcL%$`t5zv?AT#Frar;xBR+M%tl zC26g$?^b=|n%X#GLx1^)_n#M%yMY$0hE2;o25=IFt02`~lX=@a5itY%9Gq!5xf$3J z%XlD<0|swc5Q51hdlP}VzZr@g-WW!(UI#&3M)t0-4}VpTbXOwXo02c|_-7rl+ktXN zywVZBdiv_=FWL{5S`U5^ZC@GR=s2|Aaj4wUQ|ag_M`Kv|J{kTrurV~cJ~Ub$8mkPA zmHWpl{p0IV?0Cj^Mz|j{3g1qmu+6u1$!N{0z&!f@wMTPPi%BOz25b7x$Buq*E8klu}btd?{8*5@6=EE#b$AoFJkRp=CpC)Eu8uJP_iozkw`!f165YK;4vx z4EqCzHl;?=>I)13)Gi6jf&NX&BSAR;$a@5z=Vbc!C~7pSsF9!&_$3s7Y5aSSiZm%)(nZ~X~m(. -# -# SPDX-License-Identifier: GPL-3.0-or-later - -import gi -gi.require_version('GtkSource', '5') -gi.require_version('GdkPixbuf', '2.0') -from gi.repository import Adw, Gtk, Gdk, GLib, GtkSource, Gio, GdkPixbuf -import json, requests, threading, os, re, base64 -from io import BytesIO -from PIL import Image -from datetime import datetime -from .connection_handler import simple_get, simple_delete, stream_post, stream_post_fake -from .available_models import available_models - -@Gtk.Template(resource_path='/com/jeffser/Alpaca/window.ui') -class AlpacaWindow(Adw.ApplicationWindow): - config_dir = os.path.join(os.getenv("XDG_CONFIG_HOME"), "/", os.path.expanduser("~/.var/app/com.jeffser.Alpaca/config")) - __gtype_name__ = 'AlpacaWindow' - #Variables - ollama_url = None - local_models = [] - #In the future I will at multiple chats, for now I'll save it like this so that past chats don't break in the future - current_chat_id="0" - chats = {"chats": {"0": {"messages": []}}} - attached_image = {"path": None, "base64": None} - - #Elements - bot_message : Gtk.TextBuffer = None - bot_message_box : Gtk.Box = None - bot_message_view : Gtk.TextView = None - connection_dialog = Gtk.Template.Child() - connection_carousel = Gtk.Template.Child() - connection_previous_button = Gtk.Template.Child() - connection_next_button = Gtk.Template.Child() - connection_url_entry = Gtk.Template.Child() - main_overlay = Gtk.Template.Child() - pull_overlay = Gtk.Template.Child() - manage_models_overlay = Gtk.Template.Child() - connection_overlay = Gtk.Template.Child() - chat_container = Gtk.Template.Child() - chat_window = Gtk.Template.Child() - message_text_view = Gtk.Template.Child() - send_button = Gtk.Template.Child() - image_button = Gtk.Template.Child() - file_filter_image = Gtk.Template.Child() - model_drop_down = Gtk.Template.Child() - model_string_list = Gtk.Template.Child() - - manage_models_button = Gtk.Template.Child() - manage_models_dialog = Gtk.Template.Child() - model_list_box = Gtk.Template.Child() - - pull_model_dialog = Gtk.Template.Child() - pull_model_status_page = Gtk.Template.Child() - pull_model_progress_bar = Gtk.Template.Child() - - toast_messages = { - "error": [ - "An error occurred", - "Failed to connect to server", - "Could not list local models", - "Could not delete model", - "Could not pull model", - "Cannot open image" - ], - "info": [ - "Please select a model before chatting", - "Conversation cannot be cleared while receiving a message" - ], - "good": [ - "Model deleted successfully", - "Model pulled successfully" - ] - } - - def show_toast(self, message_type:str, message_id:int, overlay): - if message_type not in self.toast_messages or message_id > len(self.toast_messages[message_type] or message_id < 0): - message_type = "error" - message_id = 0 - toast = Adw.Toast( - title=self.toast_messages[message_type][message_id], - timeout=2 - ) - overlay.add_toast(toast) - - def show_message(self, msg:str, bot:bool, footer:str=None, image_base64:str=None): - message_text = Gtk.TextView( - editable=False, - focusable=False, - wrap_mode= Gtk.WrapMode.WORD, - margin_top=12, - margin_bottom=12, - margin_start=12, - margin_end=12, - hexpand=True, - css_classes=["flat"] - ) - message_buffer = message_text.get_buffer() - message_buffer.insert(message_buffer.get_end_iter(), msg) - if footer is not None: message_buffer.insert_markup(message_buffer.get_end_iter(), footer, len(footer)) - - message_box = Gtk.Box( - orientation=1, - css_classes=[None if bot else "card"] - ) - message_text.set_valign(Gtk.Align.CENTER) - self.chat_container.append(message_box) - - if image_base64 is not None: - image_data = base64.b64decode(image_base64) - loader = GdkPixbuf.PixbufLoader.new() - loader.write(image_data) - loader.close() - - pixbuf = loader.get_pixbuf() - texture = Gdk.Texture.new_for_pixbuf(pixbuf) - - image = Gtk.Image.new_from_paintable(texture) - image.set_size_request(360, 360) - image.set_margin_top(10) - image.set_margin_start(10) - image.set_margin_end(10) - image.set_hexpand(False) - image.set_css_classes(["flat"]) - message_box.append(image) - - message_box.append(message_text) - - if bot: - self.bot_message = message_buffer - self.bot_message_view = message_text - self.bot_message_box = message_box - - def verify_if_image_can_be_used(self, pspec=None, user_data=None): - if self.model_drop_down.get_selected_item() == None: return True - selected = self.model_drop_down.get_selected_item().get_string().split(":")[0] - if selected in ['llava']: - self.image_button.set_sensitive(True) - return True - else: - self.image_button.set_sensitive(False) - self.image_button.set_css_classes([]) - self.image_button.get_child().set_icon_name("image-x-generic-symbolic") - self.attached_image = {"path": None, "base64": None} - return False - - def update_list_local_models(self): - self.local_models = [] - response = simple_get(self.ollama_url + "/api/tags") - for i in range(self.model_string_list.get_n_items() -1, -1, -1): - self.model_string_list.remove(i) - if response['status'] == 'ok': - for model in json.loads(response['text'])['models']: - self.model_string_list.append(model["name"]) - self.local_models.append(model["name"]) - self.model_drop_down.set_selected(0) - self.verify_if_image_can_be_used() - return - else: - self.show_connection_dialog(True) - self.show_toast("error", 2, self.connection_overlay) - - def verify_connection(self): - response = simple_get(self.ollama_url) - if response['status'] == 'ok': - if "Ollama is running" in response['text']: - with open(os.path.join(self.config_dir, "server.conf"), "w+") as f: f.write(self.ollama_url) - #self.message_text_view.grab_focus_without_selecting() - self.update_list_local_models() - return True - return False - - def add_code_blocks(self): - text = self.bot_message.get_text(self.bot_message.get_start_iter(), self.bot_message.get_end_iter(), True) - GLib.idle_add(self.bot_message_view.get_parent().remove, self.bot_message_view) - # Define a regular expression pattern to match code blocks - code_block_pattern = re.compile(r'```(\w+)\n(.*?)\n```', re.DOTALL) - parts = [] - pos = 0 - for match in code_block_pattern.finditer(text): - start, end = match.span() - if pos < start: - normal_text = text[pos:start] - parts.append({"type": "normal", "text": normal_text.strip()}) - language = match.group(1) - code_text = match.group(2) - parts.append({"type": "code", "text": code_text, "language": language}) - pos = end - # Extract any remaining normal text after the last code block - if pos < len(text): - normal_text = text[pos:] - if normal_text.strip(): - parts.append({"type": "normal", "text": normal_text.strip()}) - for part in parts: - if part['type'] == 'normal': - message_text = Gtk.TextView( - editable=False, - focusable=False, - wrap_mode= Gtk.WrapMode.WORD, - margin_top=12, - margin_bottom=12, - margin_start=12, - margin_end=12, - hexpand=True, - css_classes=["flat"] - ) - message_buffer = message_text.get_buffer() - if part['text'].split("\n")[-1] == parts[-1]['text'].split("\n")[-1]: - footer = "\n" + part['text'].split('\n')[-1] + "" - part['text'] = '\n'.join(part['text'].split("\n")[:-1]) - message_buffer.insert(message_buffer.get_end_iter(), part['text']) - message_buffer.insert_markup(message_buffer.get_end_iter(), footer, len(footer)) - else: - message_buffer.insert(message_buffer.get_end_iter(), part['text']) - self.bot_message_box.append(message_text) - else: - language = GtkSource.LanguageManager.get_default().get_language(part['language']) - buffer = GtkSource.Buffer.new_with_language(language) - buffer.set_text(part['text']) - buffer.set_style_scheme(GtkSource.StyleSchemeManager.get_default().get_scheme('classic-dark')) - source_view = GtkSource.View( - auto_indent=True, indent_width=4, buffer=buffer, show_line_numbers=True - ) - source_view.get_style_context().add_class("card") - self.bot_message_box.append(source_view) - self.bot_message = None - self.bot_message_box = None - - def update_bot_message(self, data): - vadjustment = self.chat_window.get_vadjustment() - if vadjustment.get_value() + 50 >= vadjustment.get_upper() - vadjustment.get_page_size(): - GLib.idle_add(vadjustment.set_value, vadjustment.get_upper()) - if data['done']: - formated_datetime = datetime.now().strftime("%Y/%m/%d %H:%M") - text = f"\n{data['model']}\t|\t{formated_datetime}" - GLib.idle_add(self.bot_message.insert_markup, self.bot_message.get_end_iter(), text, len(text)) - self.save_history() - else: - if self.chats["chats"][self.current_chat_id]["messages"][-1]['role'] == "user": - self.chats["chats"][self.current_chat_id]["messages"].append({ - "role": "assistant", - "model": data['model'], - "date": datetime.now().strftime("%Y/%m/%d %H:%M"), - "content": '' - }) - GLib.idle_add(self.bot_message.insert, self.bot_message.get_end_iter(), data['message']['content']) - self.chats["chats"][self.current_chat_id]["messages"][-1]['content'] += data['message']['content'] - - def run_message(self, messages, model): - response = stream_post(f"{self.ollama_url}/api/chat", data=json.dumps({"model": model, "messages": messages}), callback=self.update_bot_message) - GLib.idle_add(self.add_code_blocks) - GLib.idle_add(self.send_button.set_sensitive, True) - GLib.idle_add(self.image_button.set_sensitive, True) - GLib.idle_add(self.image_button.set_css_classes, []) - GLib.idle_add(self.image_button.get_child().set_icon_name, "image-x-generic-symbolic") - self.attached_image = {"path": None, "base64": None} - GLib.idle_add(self.message_text_view.set_sensitive, True) - if response['status'] == 'error': - GLib.idle_add(self.show_toast, 'error', 1, self.connection_overlay) - GLib.idle_add(self.show_connection_dialog, True) - - def send_message(self, button): - if not self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False): return - current_model = self.model_drop_down.get_selected_item() - if current_model is None: - self.show_toast("info", 0, self.main_overlay) - return - formated_datetime = datetime.now().strftime("%Y/%m/%d %H:%M") - self.chats["chats"][self.current_chat_id]["messages"].append({ - "role": "user", - "model": "User", - "date": formated_datetime, - "content": self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False) - }) - data = { - "model": current_model.get_string(), - "messages": self.chats["chats"][self.current_chat_id]["messages"] - } - if self.verify_if_image_can_be_used() and self.attached_image["base64"] is not None: - data["messages"][-1]["images"] = [self.attached_image["base64"]] - self.message_text_view.set_sensitive(False) - self.send_button.set_sensitive(False) - self.image_button.set_sensitive(False) - self.show_message(self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False), False, f"\n\n{formated_datetime}", self.attached_image["base64"]) - self.message_text_view.get_buffer().set_text("", 0) - self.show_message("", True) - thread = threading.Thread(target=self.run_message, args=(data['messages'], data['model'])) - thread.start() - - def delete_model(self, dialog, task, model_name, button): - if dialog.choose_finish(task) == "delete": - response = simple_delete(self.ollama_url + "/api/delete", data={"name": model_name}) - if response['status'] == 'ok': - button.set_icon_name("folder-download-symbolic") - button.set_css_classes(["accent", "pull"]) - self.show_toast("good", 0, self.manage_models_overlay) - for i in range(self.model_string_list.get_n_items()): - if self.model_string_list.get_string(i) == model_name: - self.model_string_list.remove(i) - self.model_drop_down.set_selected(0) - break - else: - self.show_toast("error", 3, self.connection_overlay) - self.manage_models_dialog.close() - self.show_connection_dialog(True) - - def pull_model_update(self, data): - try: - GLib.idle_add(self.pull_model_progress_bar.set_text, data['status']) - if 'completed' in data: - if 'total' in data: GLib.idle_add(self.pull_model_progress_bar.set_fraction, data['completed'] / data['total']) - else: GLib.idle_add(self.pull_model_progress_bar.set_fraction, 1.0) - else: - GLib.idle_add(self.pull_model_progress_bar.set_fraction, 0.0) - except Exception as e: print(e) - - def pull_model(self, dialog, task, model_name, button): - if dialog.choose_finish(task) == "pull": - data = {"name":model_name} - GLib.idle_add(self.pull_model_dialog.present, self.manage_models_dialog) - response = stream_post(f"{self.ollama_url}/api/pull", data=json.dumps(data), callback=self.pull_model_update) - - GLib.idle_add(self.pull_model_dialog.force_close) - if response['status'] == 'ok': - GLib.idle_add(button.set_icon_name, "user-trash-symbolic") - GLib.idle_add(button.set_css_classes, ["error", "delete"]) - GLib.idle_add(self.model_string_list.append, model_name) - GLib.idle_add(self.show_toast, "good", 1, self.manage_models_overlay) - else: - GLib.idle_add(self.show_toast, "error", 4, self.connection_overlay) - GLib.idle_add(self.manage_models_dialog.close) - GLib.idle_add(self.show_connection_dialog, True) - - - def pull_model_start(self, dialog, task, model_name, button): - self.pull_model_status_page.set_description(model_name) - thread = threading.Thread(target=self.pull_model, args=(dialog, task, model_name, button)) - thread.start() - - def model_action_button_activate(self, button, model_name): - action = list(set(button.get_css_classes()) & set(["delete", "pull"]))[0] - dialog = Adw.AlertDialog( - heading=f"{action.capitalize()} Model", - body=f"Are you sure you want to {action} '{model_name}'?", - close_response="cancel" - ) - dialog.add_response("cancel", "Cancel") - dialog.add_response(action, action.capitalize()) - dialog.set_response_appearance(action, Adw.ResponseAppearance.DESTRUCTIVE if action == "delete" else Adw.ResponseAppearance.SUGGESTED) - dialog.choose( - parent = self.manage_models_dialog, - cancellable = None, - callback = lambda dialog, task, model_name = model_name, button = button: - self.delete_model(dialog, task, model_name, button) if action == "delete" else self.pull_model_start(dialog, task, model_name,button) - ) - - def update_list_available_models(self): - self.model_list_box.remove_all() - for model_name, model_description in available_models.items(): - model = Adw.ActionRow( - title = model_name, - subtitle = model_description, - ) - if ":" not in model_name: model_name += ":latest" - button = Gtk.Button( - icon_name = "folder-download-symbolic" if model_name not in self.local_models else "user-trash-symbolic", - vexpand = False, - valign = 3, - css_classes = ["accent", "pull"] if model_name not in self.local_models else ["error", "delete"]) - button.connect("clicked", lambda button=button, model_name=model_name: self.model_action_button_activate(button, model_name)) - model.add_suffix(button) - self.model_list_box.append(model) - - def manage_models_button_activate(self, button): - self.manage_models_dialog.present(self) - self.update_list_available_models() - - - def connection_carousel_page_changed(self, carousel, index): - if index == 0: self.connection_previous_button.set_sensitive(False) - else: self.connection_previous_button.set_sensitive(True) - if index == carousel.get_n_pages()-1: self.connection_next_button.set_label("Connect") - else: self.connection_next_button.set_label("Next") - - def connection_previous_button_activate(self, button): - self.connection_carousel.scroll_to(self.connection_carousel.get_nth_page(self.connection_carousel.get_position()-1), True) - - def connection_next_button_activate(self, button): - if button.get_label() == "Next": self.connection_carousel.scroll_to(self.connection_carousel.get_nth_page(self.connection_carousel.get_position()+1), True) - else: - self.ollama_url = self.connection_url_entry.get_text() - if self.verify_connection(): - self.connection_dialog.force_close() - else: - self.show_connection_dialog(True) - self.show_toast("error", 1, self.connection_overlay) - - def show_connection_dialog(self, error:bool=False): - self.connection_carousel.scroll_to(self.connection_carousel.get_nth_page(self.connection_carousel.get_n_pages()-1),False) - if self.ollama_url is not None: self.connection_url_entry.set_text(self.ollama_url) - if error: self.connection_url_entry.set_css_classes(["error"]) - else: self.connection_url_entry.set_css_classes([]) - self.connection_dialog.present(self) - - def clear_conversation(self): - for widget in list(self.chat_container): self.chat_container.remove(widget) - self.chats["chats"][self.current_chat_id]["messages"] = [] - - def clear_conversation_dialog_response(self, dialog, task): - if dialog.choose_finish(task) == "empty": - self.clear_conversation() - self.save_history() - - def clear_conversation_dialog(self): - if self.bot_message is not None: - self.show_toast("info", 1, self.main_overlay) - return - dialog = Adw.AlertDialog( - heading=f"Clear Conversation", - body=f"Are you sure you want to clear the conversation?", - close_response="cancel" - ) - dialog.add_response("cancel", "Cancel") - dialog.add_response("empty", "Empty") - dialog.set_response_appearance("empty", Adw.ResponseAppearance.DESTRUCTIVE) - dialog.choose( - parent = self, - cancellable = None, - callback = self.clear_conversation_dialog_response - ) - - def save_history(self): - with open(os.path.join(self.config_dir, "chats.json"), "w+") as f: - json.dump(self.chats, f, indent=4) - - def load_history(self): - if os.path.exists(os.path.join(self.config_dir, "chats.json")): - self.clear_conversation() - try: - with open(os.path.join(self.config_dir, "chats.json"), "r") as f: - self.chats = json.load(f) - except Exception as e: - self.chats = {"chats": {"0": {"messages": []}}} - for message in self.chats['chats'][self.current_chat_id]['messages']: - if message['role'] == 'user': - self.show_message(message['content'], False, f"\n\n{message['date']}", message['images'][0] if 'images' in message and len(message['images']) > 0 else None) - else: - self.show_message(message['content'], True, f"\n\n{message['model']}\t|\t{message['date']}") - self.add_code_blocks() - self.bot_message = None - - def closing_connection_dialog_response(self, dialog, task): - result = dialog.choose_finish(task) - if result == "cancel": return - if result == "save": - self.ollama_url = self.connection_url_entry.get_text() - elif result == "discard" and self.ollama_url is None: self.destroy() - self.connection_dialog.force_close() - if self.ollama_url is None or self.verify_connection() == False: - self.show_connection_dialog(True) - self.show_toast("error", 1, self.connection_overlay) - - - def closing_connection_dialog(self, dialog): - if self.ollama_url is None: self.destroy() - if self.ollama_url == self.connection_url_entry.get_text(): - self.connection_dialog.force_close() - if self.ollama_url is None or self.verify_connection() == False: - self.show_connection_dialog(True) - self.show_toast("error", 1, self.connection_overlay) - return - dialog = Adw.AlertDialog( - heading=f"Save Changes?", - body=f"Do you want to save the URL change?", - close_response="cancel" - ) - dialog.add_response("cancel", "Cancel") - dialog.add_response("discard", "Discard") - dialog.add_response("save", "Save") - dialog.set_response_appearance("discard", Adw.ResponseAppearance.DESTRUCTIVE) - dialog.set_response_appearance("save", Adw.ResponseAppearance.SUGGESTED) - dialog.choose( - parent = self, - cancellable = None, - callback = self.closing_connection_dialog_response - ) - - def load_image(self, file_dialog, result): - try: file = file_dialog.open_finish(result) - except: return - try: - self.attached_image["path"] = file.get_path() - '''with open(self.attached_image["path"], "rb") as image_file: - self.attached_image["base64"] = base64.b64encode(image_file.read()).decode("utf-8")''' - with Image.open(self.attached_image["path"]) as img: - width, height = img.size - max_size = 240 - if width > height: - new_width = max_size - new_height = int((max_size / width) * height) - else: - new_height = max_size - new_width = int((max_size / height) * width) - resized_img = img.resize((new_width, new_height), Image.LANCZOS) - with BytesIO() as output: - resized_img.save(output, format="JPEG") - image_data = output.getvalue() - self.attached_image["base64"] = base64.b64encode(image_data).decode("utf-8") - - self.image_button.set_css_classes(["destructive-action"]) - self.image_button.get_child().set_icon_name("edit-delete-symbolic") - except Exception as e: - print(e) - self.show_toast("error", 5, self.main_overlay) - - def remove_image(self, dialog, task): - if dialog.choose_finish(task) == 'remove': - self.image_button.set_css_classes([]) - self.image_button.get_child().set_icon_name("image-x-generic-symbolic") - self.attached_image = {"path": None, "base64": None} - - def open_image(self, button): - if "destructive-action" in button.get_css_classes(): - dialog = Adw.AlertDialog( - heading=f"Remove Image?", - body=f"Are you sure you want to remove image?", - close_response="cancel" - ) - dialog.add_response("cancel", "Cancel") - dialog.add_response("remove", "Remove") - dialog.set_response_appearance("remove", Adw.ResponseAppearance.DESTRUCTIVE) - dialog.choose( - parent = self, - cancellable = None, - callback = self.remove_image - ) - else: - file_dialog = Gtk.FileDialog(default_filter=self.file_filter_image) - file_dialog.open(self, None, self.load_image) - - def __init__(self, **kwargs): - super().__init__(**kwargs) - GtkSource.init() - self.manage_models_button.connect("clicked", self.manage_models_button_activate) - self.send_button.connect("clicked", self.send_message) - self.image_button.connect("clicked", self.open_image) - self.set_default_widget(self.send_button) - self.model_drop_down.connect("notify", self.verify_if_image_can_be_used) - #self.message_text_view.set_activates_default(self.send_button) - self.connection_carousel.connect("page-changed", self.connection_carousel_page_changed) - self.connection_previous_button.connect("clicked", self.connection_previous_button_activate) - self.connection_next_button.connect("clicked", self.connection_next_button_activate) - self.connection_url_entry.connect("changed", lambda entry: entry.set_css_classes([])) - self.connection_dialog.connect("close-attempt", self.closing_connection_dialog) - self.load_history() - if os.path.exists(os.path.join(self.config_dir, "server.conf")): - with open(os.path.join(self.config_dir, "server.conf"), "r") as f: - self.ollama_url = f.read() - if self.verify_connection() is False: self.show_connection_dialog(True) - else: self.connection_dialog.present(self) - - - - diff --git a/.flatpak-builder/cache/objects/20/fa2fecec2bc624f74fe3855291ec0a1256c169c1e5140f6f9eb7549d921107.file b/.flatpak-builder/cache/objects/20/fa2fecec2bc624f74fe3855291ec0a1256c169c1e5140f6f9eb7549d921107.file deleted file mode 100755 index d853bea19e3b7e545235656b5a581fe042a8b5f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17720 zcmbt+bzGEN)b7wF-O`P8mm*!#ojSrWbTg!&AcAzabf-v*k_sXqB_$~#U4k?!-we#0 z&1Rrn;RyRD z4;?y0z1k)a00qlfe8;XH)>4lfqMVqVcMWng)hzy$uqN?)RX z*Y`Sa4bHo6nc+Nyy{rWk(_MyG{=dZ2g7X3xu7s~!OL#nlMa0vF@?drO-)@M*tOJkt zU&rA)eBKBPFYjeN`JlmI=ZunuJ^qk z@(g3i@T^r!*&nS9vu_ek{fAMKlarulhca%_^9%9_@W68Tb2Cv>k%jl?y{Br;A3l6& z0YJjz>!AnacG8oeLh^XTc*+0hg4h|c)%1l%Mh1tqd^V6k%`=W#LK%uWy8TVHDO zTlu*w`f8Zx-A`Lj_F?Js!$YvoOn0yW=_# zMZcB(+?gB8+Xl5?*~&4Q>O=OLU_%a7QG-`Emh`66?)dX)4-A4!Ag$d}f(=g{#79(k zq{!aoRnX(+pUU&RUDiwXtSIctpw{-pwe>X79|%m+=I3a9`2gR1#FnnO4BxTLE@4|i ze|z?)VC=p8uJQEWnDLpM#o;xj%e*;v()BvadM9%HVy8Zo_0j2T7{+U_f`oi==Y9dg ztVTcgr&P(GBE?7ZR-Os=mamZlGu3fk+w*El2hI*N4gC0~_m1~~K?AL~z9#<>6QKn? zVU4a8*Rc;(Lg>IcaY-=eW7(nmpD`I&XoHMI$@-{{f)02INetwudOcLuX+s)nRb&Lx ztQ>!LV!1~Zq-?THdtIhSpvZBDl>Sph7JvLn;e?9vz&wJM8%f7SNmdj4k z%1S1D{PyH&<*!llTjj%&X`e#-N-{kZusd!pqTS0DuKtOBlklZEZ}D9fOPt~aqX^$J z6SihyXYEYyD7)tR0TA94q&RtwW-201XruYIv1z3;-!Qd&rkJwd?#ofgetyswRnO+P z#uc@xD2~SkhJ?k%6q<29$3=|!g*2IAajUNf16Fd)b;mxoR=m^`SlAOVIF*vbKY` z?AJ1?^}kr}yW zg~4Hd^;RaF%AbCd9tIxTbs4bxWj+9FwLGUKMtgrZ`@wiaIMe(E%eM=H{rVw>dl`o& z3Xw#s%zbqPpT95{uuOE!Y<8^2ZeglG`kKIm7YzGDzWEmHC**k&r~!|>>)#OC(A8m0$UaEO9zg|5oWXI^i0Q)Ktue8EMcduQ}5 zyM-^2b|t8n%1k~fZJGMLT+NGQ|vCzy$ z{PHECyqi-;D}zC;w+vpJmJ^TUe?*LYr=pnxxsR^Y&CA=1*^9HH0;}@j0>AS~G2}Pd z)ZGC|{GJrq9xp}}TBTxf5w=r?kqf%T(IW-$^U~4%H&b|DY9mL;EnYkEao5!~T9mF+ zcnj%dsF@uv-r5`DOA%AFzKiUOzNucU=M{RKXJ};;R$|Wk!ETO4lnfcyb$cmZIaGB! ze^g9&{a1v^!eOXp9wDn|$BVgA$>zkt_xC2AV;Mr8F0`r@$U9e@tO~@DZ@!An>Xxq* ziPet%6=7IP_8jEhWq8m#8WdKP5!a542`{v%%NMeiG{H>$K(*^a0>UC_Fv zO&x`Oo#F?yw%VlC$8QO2T?DO>Y$}FxmmC-Uj1wlC&hV^^Zv|0x@4& zIR3&tms%J{wtv}4`|bWnRO;gWgFe~qaRZwcgSTVEpCfv!*+)VkQlmT#%=Ojhc_}I1 zo-d6`g+BnNKB|pp;Y3rGDAVOHIdt+yFM9bQ)vTAsCRAmpQSEre@YN$G;#+&F2kmZc zzoF#e8`2Y#pyU`RVw7Aq_{*{|Mzw zPf+a$R%1rHyZtm`apUdc0|KVBkKv~5_dD2G_ZJm>F;XmZn+zVl#pF4R1fZ;ni7hqD z2L!qUGD4W|Mo2`&%zs_>+gZP*k@xE9hcfzh4#Mt$rl42 z+9CepV`z zsy+*lGB!+LDm9-Q3#29SdN&02cE!?PnMK<23?}l^`LeB|V)yKVS>G}XXW5qS-Se*{ zy@m{pG-v2Tn|;cp>FGeljW(;o5qdwVmaWF`;(R>dq7p{MDm9;bjd%K9@dkCRZ@G4f za7+|h6_F7E6Nf3(`g`*nLY;&bb!$D|v?@GwKL{`j`>|mrNe`4i`Ed~N6BT=anE zg2%dZR!!Gr`n=z~uDWr~>D_YYqjtS+=J ztxNZqD(aN?D|++!ENOO2IU5r!yKfprn|8nJl}YT;5caD5X8opSiGphNR-6wPO%};# z5PLXenhX7;PkS4y>NBT%o<5eHv##*jxZN#pv~$)9gSa9fy~6T#8tLG(`b^ZgCN)-n zj6=DGM?|i51J5}1eVK4m9jxi(cV9(qEDj`m9Lq>)64SL~!I6|~>N0zkr4WJs>djVu zYY*NJLX|U~$eQynGiS>DZBw=Bhel+(R=<;pT89sns0)vZ+QL9=`GIl6=xPU zic$SEvApl;?o5)Z+Rs(v&(WSZFg5`5cFgcS>Pv3RADEWZnvG^gzw!L06PUHrwsM=4 z!LHdVWLT?^X4`z8ddce6eV?*yx%h;2@$~{mhDXdV%QW(DZUHveT!ZYo-Xwg!ICi^< zws6-JY5H6#0rS5h+Pbc%2ORqWVA(zuP_Kr%-)_Y&8uva-?79`rMYkZ^t{sXhTE z$g56F*Eb70LwA^GKb9Iy#D^VwNLoET4`by6P2I|U4Q?29dL7ab?js^Zend+dYDyZX zWq@NItudfLvoOBy`)O^{J#KnuQeR!8YRUJ=OIbgmO_S60(V_c966KCfzlv@U4NFD{ z98Ranbw7g_r~(L!3+FKNRHA%&jQokR-d8)an=-ybYjcZ=FWfIaf3%sE#%jSm zz0uUDh_fMZ6VOxt?ehkS290WI-O%XWs+U27gM_D;WoJVhjb~~lxsoFU2h6KEWpvR} zvtbTOnoj#dOP=@`)nIwYK*kdFz$GcoXCp5Kb3*5|TBC!=ZMXRKxU+sJX|g#0^@%>RO`s zlA3F@QsUi$aN(B*-YIZm=^<^P)j{!5mX!Opbk*8sb$edi$tGvE{z9G?iJ;E4=V?RgpCHc zh1=-WUDm+|bQDS>+J}Mw4f~AL36~z$TL<9BO&1e(Y}_+Ag;> zRGKNWm~{>ovAxwbTuRN7)SIk3CO%ar9DH<-nA|#C3BTbK$?$Vz2gpI=mNX?mp9Q6N zTMdo*T`+C9sD64gsmEVi%YzS zZ;4|9S>Ay&^h?NVw9qeUCXXWoFxbB!&zUyVZP307JWj40a6&g-XyFe&Hc|EGV8c;z zF_HF(e-wB-kkEv225EA_)s)_h041n8k~obXoqt%y4`A`CEv-sF3!R@C?OAQ{39XBh z|IU5<36ALw%5>y?Bi;w7{AvT7@0U04hT>}8mCo1;@dzzRop2)?IAt%M+1YWPA3&{J z@1V+IsG%Q7E!42bXxsOxGYBV_5 zU!|$!#gJA&Wdhpk*UwZ6Ib)QYLIV)=e)3gah}xlElVR4eXXmE9OVdmm?$Hw@5D-$Id= z`S||hwiGIh@%@GHzz3nmeMLWR2dxEp9? z6|*+^g@APvR3&@h0g?H54MlBoS8DxCyfFb(k;VDJGvmI>bz5jcjjms?Ym=P|b|d-h znQO?^ z*xe1VF)$C=CZn)(G)CEKZD=v1Ge7OciY@|55=hHXU?z#W2)QJ|hm}M+lMB5hp$p(q zLqDMa-5Z}JVdiLvSj!@f_K>Nu2S^zA(H@98_^G@?5pghvGP$|cD5!L~<3x-7=>}-s z-{8BVX}u6kEU$}44t-&}jm8x=?eJqP{Kof|dw?pfS!@Ds>=3kosTqSkobR`Te!L#nuz-TwYlw&k7^uaujLDodey@T6YG4>AOeH)ELr^t)!6PZ{oS% zz8jSiNZYy_^5Mxwm3bV&L;IMhL6Dro4 zaz^a!9M~vD)`SEdOE@QK=Cyc}@Hm>Q0)z%A>4$w|BST~2a3Ix^nQap#7ZstK2m|bX z`~uKeL6bXP<%4iR=YY`^k-MN{1K{E7kD7wwQlIYQ{<*7*K!eif3H^>vi%S2HJc3 zVrAlK4Pf^s<3MpeEt~q&*mV?T4MCIH$l;AT+42`Cl_H|4_pke;xhnz?=L+EA8#qXXg_%@c1 z)+qf4l$$;Jvc z=)*~cCPkfN=$bR;M(<8y!i`aF2ZcM-*y~L2E=96nZn>9zkRw#&y^p^hl+r;Bg(F@^ z$(AoGvqE`F(38Z@haVOuUt9+|rka{RWG5a1V^_o24|<(<8IQ6E|Wy|$b-1K8^+TsS*Q)%BBc*sqoPQ-Cy?V6bJ^}amDRu*2F z&5mbLMOS{W$gj=m+|Ij0QJSpUbWWnfowDAFs>AJUDa$bC*3_02XNRL)Z)V<-^lfQd zefCb2UZ4J?DpP^UT*d_p(-@gwe4~+1z(+niQ2eBFK$MGPU8C!#M%T{`uHKCS8r^+9 zEgnik?{rohRDX4hP}M&wD-_w7Jt4B8bLbj2Dz2Dvkl(pLnE8hbxkj^wZgI>oR4o>vx+P4+B>vLx8w8#is6YzGe z-6}9)d@Z9VmdklzDefMb*wA>Y<`m1$cBhW=m8jBqiHvn|Buo{ZjmZqhHn-$$G6V?lCSJW?@H#2@ zXf76qtDHyuQ_gY^Wd^7Do-kY93RNB;tp0uF3-*HHbqX)=L5A<-R#=G5fOcAWcOy{l zjlnadU^L3~GWRK>i@I|_QL^TQS;1BwNw>KqyCSn|w!3T}Uq)`hSnPzYG4uTpJ1S|1 zp-#|Hny#U+OWxBeJF)sEL6z?~d#NvfJ$>7;Mlfq!H`JEU&AZ=eV|ZVidN1M$+XcSS z+qJmA|Nemy2mSkp{-zrdKZT@u7@AJQ5I2{p4MWQ?C-<8vs)qWx@Zau5y5~gx0P9go z;JxgwVt!yvAnN#&+rU;+jREn#jgqcoSAvH3+kA@vBT^Y}2A-}a3MFe~c9%#ddW!s^ zvti_LbvC4VRe~CM;NZ=Q>`11fyX4KRWsd97{?<~5#%Ul5(#5Zh{93tuXkBE_UK7b+ za=DcyeIl_A)7Qm+R_5Mw-}#n>>{n(YYyBt08D1lNv=j%A`@8VwY*x9zTd&z zULGW5-C#ct*zCsK8hS6GTSqF>I9s@%j=aGR(!ru&x8t}I9kF!}Gs&4C_b%JbIu1Su z-ytbO%f%5x|2PSuR*f}&-KZLi1Jy3B=KWj|>1@3D{iw15KkW2ocd3{;tk*7r+3(hW z+%F0_;Zada>N#q+r&GyYE6g+WYuz&8oBsgp@vjtRZUCw|x^q&{Xnn7IcwBar`8cJg zHw0(5$r_7JM=8I(JJ96Q_LG#_TV37EjPnT}_X7t}huM9wdnkT8tG6m5*z@^LuM7fc(c;%-0{HfPNERE=so-o5yPg$ z>$%S#golymn+feLI?o+*PcnWvVR4@O)STw?W2L|Obk2<$BYM?RoU`!v+!%cVQLn(! zTlq|(=c>)a+liz&8Lu~)sn6F_M%&xvzYj|)(o}!lzppXf`8G6r z_4P;Bq$RR$UTRlt>Xnb>AA=9h^S~W1-kGuvfl#Y!Q3)Ovp`L5ClNz_MK2&Kh0}Pj( zYQM_HYJR@>u1fazt(*|HaV+FUg;&L>@3FEr(&;ic*pw)j`;n|>k9EIC%Fd9ezoJO& zpH`05JL`ICSQIe8o6}L^7UrFu^z8I$-+TF=$*HObZw!WRjeh>NL(htQ)=?L3$x8)> zC<^Ci6{Ik&Vjt@u-RX`hMO*apvs5E0UWxNDgd~Uy8INHVs9{q`?+ZVq=qdk(o5srA zMg-KUE3t3k${7UPDv}#~N~f%!qa&J@sD6qkgPnNrW?MFYC@XaEymf0jGz90PpUMXn zan`Bu#dnldG_FrZ%w}dP-_^G*9xBM}&J_(FrkR)K zX(tS~Nx)Pf#WTSrjYo=KvFA9m*&=Zz9WFjGCECY>m(jwNlK!~l*2G)ZJz7p@MLMg3GYju-G)OA{+jzEQRJ@$`kMN8HtaHS2iruuH z^vpbvZ8WFkD##Z&F&M5DE;}j?7m+gGnN}{3qv!L@m@M5)BM!MmBI;knMVgRjER_P@ znW?)O)OnC7J2>)jtyI9*DWCh3#ES(Tx#GP$3dh)|CF$o+nP=Kw55`Z|1mBJfs@an` zi^;Df-=ID_mWx7HUfVOH2r&@Ex*>q}B6Ooh_TEHezJ5yIQ%Cv-@?{e%_sux?A%rVI z=0a2M6-wfsDr-vmSiY2RBh$+*%w&Bz-;3H+hr8bN5O@;u#!$rrx4&B`^W<4dILU6z z2~E$56=55L;m^!`S`bf2+7o*NF*|xtHC&ETO`?Ugsf@*3ZPm_Y<|ql&xJ0$=7RN z;HpT(a?*U1eE+2iejRuKU<)|w5^O+%g zN0J!gLiEUSe1>KbCH3>yA4tz$>VE0}h8ffPi9A-HEs1QED%|hGVnSqDbYtxft08Ja zMn;u}vq$)-r2S#*%NbO4)&tRzLax&r`zYLd>J8NNfy^iXb%npq#Ag9uJ3H&L1`a$0BI&OK;hRe#YaPvEHd6%(l1>#|FYCJ8~o+ zN-JBN38+qzZ8GnDE^TGgG7Cxy zuCwJ+Z3hX;`Z136{vi(uixEkOg_&iZZvk4*5?cokEDHV4D~NrjUd(K*$uFsgU_{}n zMEDC_jJ>lP+;hWpmRLl6lOj?=hRz!IYs~z)!%*(7NsCEBjZs_gFz)_6rfGNkxvOimH zuc-?&&j~r&Yvm#{vk~hs-t;VGNn!0MZD27~?=&y`ZB?}$EpFJ;$8f^RK?`{7Bua1=rNs>^NrR&zs@I2`p#xC&_L|+(=)AHB2|8e zvSF4zphIeW%C6u-h`Jd+vY0q=u2x;<6>MUfDe7>*y?2O~lzG zqdg)j4b&?|#9{d`d05vi;H5Z6`}6%eT}i6QqDkS7LynCNH-&9xP$n)z?|5@y3+ZM| z#Mg<%**fKeWOfSMTDhOQVn_s}3L_0*oY4&}~Un84E9glEz)d|w1rV%Rl-77^37BU$zvcOp^$hXhKzK)yA)1o6H# z^lz1#>fgVnC|s~cWZMtjzw!{GWVQ1yT+#nv@4CuqM6KdYGquCKrWNTy6FJ%yzw2Gw*>fV z8fE)>x*VaDkFwjyHVhm{cDS;#v$H5K@@-y~IF^^V{(x-9e~O`~^2d8*w4ACcP|DteyINCTj8|kMsWMSrr3mG&g=*sZs6J)Q~-JO2SRi zPI^IB#l`yU)8yNYa}bba$FPg$cBI8=7h$IUw0tFqNTB<+D-xTWka-hZW}s6@DkZPk zVZqW1Cso6M#XJQ!xq@24=pvrKNS-3(qj1X zXMK2&dfR2|q+cUbxtUvtHIKQ;v3H&r@2ORCbsMpGSvFtCr+7nK2jBXOBVxC&jJ?$# zJhWuR4ie>Lk2Lk?F$wGfCFj}u3ZuazK4Ex84TjzOhLzoW!J`;U=R9<=%yNw59Fca3|S z12vmV>i0{e2L!#Y%*^Gn^lcW?Up|<1G1n-GcCU{o#jqPb`}OmQ|AMdI!f!09ua9;9 zepDj6dQS!GOgaVe5gg!~FG*vbKD*nvi%Ca-QQP3h{{2{(pP_8D%vtc!r-7I1MtUYE z^OjQNnrg3OFhPrkyak7rwl7|m5_-ujXv)8H2-9!SnwP8c80M*~u4yjL8DAN${$Y$c zm0VY;FstR-VsIdE1MI)STS3e5jfM?Kj5X3d6N9bz>6n0V_;y~vCi^#h*{z#S=p1Uc z(e_;*Kc4PXhVljaNavDv7E&+}nJf_VJRzTcG1sMrcA=>v@c|f(Ie1cUByqo{k@vYD zLD<4H`ZH=G%<`nW7$nai-2i7YFFQkfGw-LBcRifAYt@3DnS1p#X2fQ_4Vp~qGLPly zm;gJM;EYsAvviKr|I((Gab^0}G1fdt>^nah02z4gFbb}A?9c#j^DTSH)e>sA1=j`c z(cfClpG_LUczO`nisa|_MfdM&V&K94B|y@KM1~}5(*O4D#{Y_tEZ)W2-7vtOYFYlep&B%|nIr+H0)iAYYQZxXaqUH(PHk^P6B_7`Zc? zQSRZJ({Z4Cp|tOyr!e^-&$W{IZU=O18Lzy!%%d_4>w$TA;duoMncpP9lR?iUDRw*cn#xu z#f+)NIpK{`Xwr=zjqdU*(6r@^Y&TbwI1^voB zRxv(j8{2(9v`e+2Cr1j7cQm@8K&AUll48FhTm&VlraA<>hdJ5!X}d91T7@EOHHqYx z2oaz71g||6$mF-4FLPotOmnHveQu%*y*~Hfd1sYgKF9a=`D7+~Pxw2h;NXI7X>MOt z+GFRQ7X|`d{CHMNO~(U9nHCao5 z`hIFJgd1#{DF!sPi;k7N8;(Ry6B}uA_A=O-sSoNdA}^G%Zk({=6;atds@@Ed^@+6p zN!KhE;6(fJi}=Tk_bXw9V{4H1H>Mv6|*w9B6Gl z|Mp9Xk61~dK^0S3$5ZQ_5c{s!xOaD&%fnO`Y`w2+Q0U`NNHHFiKJpr)zn^WCy=FZ(vd`X1c}SDY^wXC|X-{9Dd zC~KLqxmRu|amHgsL_@H#1Ea~{R>z+|+`iU^{Z1Seuy=6{2EdjtAOr9L^F;p~!Gq%j z#Q($@;JDT`Toj5U0Vo0U(pUb7-=)i4;-mly__~6tQ2@XW+JME4y{6-N=}!VctY1L* zCqWzkmVYi>CkL*B2mgJ2?WGPS03dUvfLMRf1;;{TREClrV2OW(ZGx4AL^!Al(q06knEflI^j95@a)(3tYb-1?uTRuime`M(55LBvvIzNEN1xWuBx4*>60EqP>h*1a>2LOlwi1ii- z{5f1_UK)X1*@R1+96%uTPrMY0BSTl?Al9oOMysIswNv(T=p7WNM>zdq=b$)Zjm94^ z;P5|iB;_2p1>stP;KIqVeEdPd+{s+zq#ff0o1-w4@;0Xy| z;)v}2wu=9uV+hyz4%aD%Q!Jr4{onMzT95xjKMsmB{^j*|qXMq~3V!|SA%;M15O;`& zl@$*NU;!fP0D+dyKx+qQ3v&mcCB)gy9cb?14FEYix;TI# zU`yyioPYHITG=|;0?pmr%zc1hCy1L5z{<_s5e&5SaCG#6QvT=xp`MU`xI*kz9L=q5 zovfirY5Bn0S~kuQXDts1Ku=B$D5IsNpdk;`QP9;_(*x+K0u@!DT`grzJxy5evH{f6 z*8|F`Y09Zy6Hx*~MG#I(3VJ{lbr~gvOI(6osy10xBrO3Ci+1P)JW*4nb8?)0CA_18OQN>Ozy#gMMErKm{*jLv`HToZY0A zpv#@)fC4;%LI9wOo;oxc#G!-gzz&?Axdk+&mXD@|9T)@wLZ>VPfw<{H+@Mtj0JVI8 z@?diZ2WRN4fbI};kUbD&V-K`4w{`eSS_sNk@CE^OJe(l5j$j2?To~l$2Gj*Z;7Sh8 z=9ZUrft@t4T0rYy3A0d7HD@Plpp3hLv#q5T1V+_&vIRL?f`JN7Fr%m|54JM*aDc!? zK z9k+FN1_=m4J=`G9e@{tJ4C<@m=;92eU70K5WkEEcRfEpT0|ZM*#?2b2W$xw<*7Ja# z=Kwv#2?jMG1LuU)G%VjNquZ9v@2w=vC$p{!11Q> z4*hWn?4rJufCjq4J;847(9<890@%SECjJ-K*2&8GA3i|0zas!`ETO$WqQDN-U%+J> zs`V#k?q=>}4ZR=nShz!X2&Oa00eZvw8*p>7h69(E%T-p;xdV8hcPvNfjR?R4tAw>P zv;hHoL-%kca|;VMu;M3D}0P?Uz0H8ewP~5g(xg zhGPgmV*M_HFZLgNI1KQ(#>a#UBlxf3!mu^2uvZd9eE4e$VEP)r9ljVA!QY0F{@AW{ z0shdjKj;4v9st3YfO9X`NJHC*c_M7?HU8Q)z80K+J%2b12*1V`gD;###214njEH}I z{`Ams7$yrBbiuxAAowSL@L{hO*ZDW$e0bUZdig={uf1MFzYYGmv0UTR!(W~d{D<)P z2o~bq3SnX253rmN@dF62JP~|^-+%FMK?nZi$6n)W{a@nWxfUPseTj(Aj3^j9f$RA= zUyG0U9zpPN5sAa?_4>iCU04Xj`2?W9azyY0{v-b@F96^bwDBh&@g0NUTOu6c_IiAc zYy35aD@O#s?ppk79ncZR4-+VFdrWKcbJY+SmAq@9+ODUjUvzB0l2#4#7wK ze*lQ{3lSG_97V6iM|{`)#lI@YUwZ@}VPWNgwGr_F(pRqZaA5wb``4cSuhv!L2h{w@ zpO?PE5q!R@?q7RETm--YO#qg|bw33E`nM;{7q%hn(jV>10r*ZDp1;wbAheCB8v;&* zHV|3}3}#ai1%dw4#-H1DUs)({9fSF&QeUwU&ohL^bzfM1*D;uH0NoX%^x6r3-FFbq zzh1vv%vXF)*aiB>hTtP?D|8IjzRuUF2bI``S9VtOdi)&^A)0w@DT(L z;fMtVu4Aw<9e6@75RPzr-4`E<|8?*A!}mL!9}0i)z{&wDDdPM?Jbz)&lxrzos(6cB c8bIr{!Rzs1n%7(|i6Za^uirJowJzX)0FLe4-~a#s diff --git a/.flatpak-builder/cache/objects/21/a31500c5f0f53818186a1ceaa761f2f2ec28aa11d79a512dd41f5f0d90a7ff.file b/.flatpak-builder/cache/objects/21/a31500c5f0f53818186a1ceaa761f2f2ec28aa11d79a512dd41f5f0d90a7ff.file deleted file mode 100644 index 60a4d97..0000000 --- a/.flatpak-builder/cache/objects/21/a31500c5f0f53818186a1ceaa761f2f2ec28aa11d79a512dd41f5f0d90a7ff.file +++ /dev/null @@ -1,381 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# EXIF tags -# -# Copyright (c) 2003 by Secret Labs AB -# -# See the README file for information on usage and redistribution. -# - -""" -This module provides constants and clear-text names for various -well-known EXIF tags. -""" -from __future__ import annotations - -from enum import IntEnum - - -class Base(IntEnum): - # possibly incomplete - InteropIndex = 0x0001 - ProcessingSoftware = 0x000B - NewSubfileType = 0x00FE - SubfileType = 0x00FF - ImageWidth = 0x0100 - ImageLength = 0x0101 - BitsPerSample = 0x0102 - Compression = 0x0103 - PhotometricInterpretation = 0x0106 - Thresholding = 0x0107 - CellWidth = 0x0108 - CellLength = 0x0109 - FillOrder = 0x010A - DocumentName = 0x010D - ImageDescription = 0x010E - Make = 0x010F - Model = 0x0110 - StripOffsets = 0x0111 - Orientation = 0x0112 - SamplesPerPixel = 0x0115 - RowsPerStrip = 0x0116 - StripByteCounts = 0x0117 - MinSampleValue = 0x0118 - MaxSampleValue = 0x0119 - XResolution = 0x011A - YResolution = 0x011B - PlanarConfiguration = 0x011C - PageName = 0x011D - FreeOffsets = 0x0120 - FreeByteCounts = 0x0121 - GrayResponseUnit = 0x0122 - GrayResponseCurve = 0x0123 - T4Options = 0x0124 - T6Options = 0x0125 - ResolutionUnit = 0x0128 - PageNumber = 0x0129 - TransferFunction = 0x012D - Software = 0x0131 - DateTime = 0x0132 - Artist = 0x013B - HostComputer = 0x013C - Predictor = 0x013D - WhitePoint = 0x013E - PrimaryChromaticities = 0x013F - ColorMap = 0x0140 - HalftoneHints = 0x0141 - TileWidth = 0x0142 - TileLength = 0x0143 - TileOffsets = 0x0144 - TileByteCounts = 0x0145 - SubIFDs = 0x014A - InkSet = 0x014C - InkNames = 0x014D - NumberOfInks = 0x014E - DotRange = 0x0150 - TargetPrinter = 0x0151 - ExtraSamples = 0x0152 - SampleFormat = 0x0153 - SMinSampleValue = 0x0154 - SMaxSampleValue = 0x0155 - TransferRange = 0x0156 - ClipPath = 0x0157 - XClipPathUnits = 0x0158 - YClipPathUnits = 0x0159 - Indexed = 0x015A - JPEGTables = 0x015B - OPIProxy = 0x015F - JPEGProc = 0x0200 - JpegIFOffset = 0x0201 - JpegIFByteCount = 0x0202 - JpegRestartInterval = 0x0203 - JpegLosslessPredictors = 0x0205 - JpegPointTransforms = 0x0206 - JpegQTables = 0x0207 - JpegDCTables = 0x0208 - JpegACTables = 0x0209 - YCbCrCoefficients = 0x0211 - YCbCrSubSampling = 0x0212 - YCbCrPositioning = 0x0213 - ReferenceBlackWhite = 0x0214 - XMLPacket = 0x02BC - RelatedImageFileFormat = 0x1000 - RelatedImageWidth = 0x1001 - RelatedImageLength = 0x1002 - Rating = 0x4746 - RatingPercent = 0x4749 - ImageID = 0x800D - CFARepeatPatternDim = 0x828D - BatteryLevel = 0x828F - Copyright = 0x8298 - ExposureTime = 0x829A - FNumber = 0x829D - IPTCNAA = 0x83BB - ImageResources = 0x8649 - ExifOffset = 0x8769 - InterColorProfile = 0x8773 - ExposureProgram = 0x8822 - SpectralSensitivity = 0x8824 - GPSInfo = 0x8825 - ISOSpeedRatings = 0x8827 - OECF = 0x8828 - Interlace = 0x8829 - TimeZoneOffset = 0x882A - SelfTimerMode = 0x882B - SensitivityType = 0x8830 - StandardOutputSensitivity = 0x8831 - RecommendedExposureIndex = 0x8832 - ISOSpeed = 0x8833 - ISOSpeedLatitudeyyy = 0x8834 - ISOSpeedLatitudezzz = 0x8835 - ExifVersion = 0x9000 - DateTimeOriginal = 0x9003 - DateTimeDigitized = 0x9004 - OffsetTime = 0x9010 - OffsetTimeOriginal = 0x9011 - OffsetTimeDigitized = 0x9012 - ComponentsConfiguration = 0x9101 - CompressedBitsPerPixel = 0x9102 - ShutterSpeedValue = 0x9201 - ApertureValue = 0x9202 - BrightnessValue = 0x9203 - ExposureBiasValue = 0x9204 - MaxApertureValue = 0x9205 - SubjectDistance = 0x9206 - MeteringMode = 0x9207 - LightSource = 0x9208 - Flash = 0x9209 - FocalLength = 0x920A - Noise = 0x920D - ImageNumber = 0x9211 - SecurityClassification = 0x9212 - ImageHistory = 0x9213 - TIFFEPStandardID = 0x9216 - MakerNote = 0x927C - UserComment = 0x9286 - SubsecTime = 0x9290 - SubsecTimeOriginal = 0x9291 - SubsecTimeDigitized = 0x9292 - AmbientTemperature = 0x9400 - Humidity = 0x9401 - Pressure = 0x9402 - WaterDepth = 0x9403 - Acceleration = 0x9404 - CameraElevationAngle = 0x9405 - XPTitle = 0x9C9B - XPComment = 0x9C9C - XPAuthor = 0x9C9D - XPKeywords = 0x9C9E - XPSubject = 0x9C9F - FlashPixVersion = 0xA000 - ColorSpace = 0xA001 - ExifImageWidth = 0xA002 - ExifImageHeight = 0xA003 - RelatedSoundFile = 0xA004 - ExifInteroperabilityOffset = 0xA005 - FlashEnergy = 0xA20B - SpatialFrequencyResponse = 0xA20C - FocalPlaneXResolution = 0xA20E - FocalPlaneYResolution = 0xA20F - FocalPlaneResolutionUnit = 0xA210 - SubjectLocation = 0xA214 - ExposureIndex = 0xA215 - SensingMethod = 0xA217 - FileSource = 0xA300 - SceneType = 0xA301 - CFAPattern = 0xA302 - CustomRendered = 0xA401 - ExposureMode = 0xA402 - WhiteBalance = 0xA403 - DigitalZoomRatio = 0xA404 - FocalLengthIn35mmFilm = 0xA405 - SceneCaptureType = 0xA406 - GainControl = 0xA407 - Contrast = 0xA408 - Saturation = 0xA409 - Sharpness = 0xA40A - DeviceSettingDescription = 0xA40B - SubjectDistanceRange = 0xA40C - ImageUniqueID = 0xA420 - CameraOwnerName = 0xA430 - BodySerialNumber = 0xA431 - LensSpecification = 0xA432 - LensMake = 0xA433 - LensModel = 0xA434 - LensSerialNumber = 0xA435 - CompositeImage = 0xA460 - CompositeImageCount = 0xA461 - CompositeImageExposureTimes = 0xA462 - Gamma = 0xA500 - PrintImageMatching = 0xC4A5 - DNGVersion = 0xC612 - DNGBackwardVersion = 0xC613 - UniqueCameraModel = 0xC614 - LocalizedCameraModel = 0xC615 - CFAPlaneColor = 0xC616 - CFALayout = 0xC617 - LinearizationTable = 0xC618 - BlackLevelRepeatDim = 0xC619 - BlackLevel = 0xC61A - BlackLevelDeltaH = 0xC61B - BlackLevelDeltaV = 0xC61C - WhiteLevel = 0xC61D - DefaultScale = 0xC61E - DefaultCropOrigin = 0xC61F - DefaultCropSize = 0xC620 - ColorMatrix1 = 0xC621 - ColorMatrix2 = 0xC622 - CameraCalibration1 = 0xC623 - CameraCalibration2 = 0xC624 - ReductionMatrix1 = 0xC625 - ReductionMatrix2 = 0xC626 - AnalogBalance = 0xC627 - AsShotNeutral = 0xC628 - AsShotWhiteXY = 0xC629 - BaselineExposure = 0xC62A - BaselineNoise = 0xC62B - BaselineSharpness = 0xC62C - BayerGreenSplit = 0xC62D - LinearResponseLimit = 0xC62E - CameraSerialNumber = 0xC62F - LensInfo = 0xC630 - ChromaBlurRadius = 0xC631 - AntiAliasStrength = 0xC632 - ShadowScale = 0xC633 - DNGPrivateData = 0xC634 - MakerNoteSafety = 0xC635 - CalibrationIlluminant1 = 0xC65A - CalibrationIlluminant2 = 0xC65B - BestQualityScale = 0xC65C - RawDataUniqueID = 0xC65D - OriginalRawFileName = 0xC68B - OriginalRawFileData = 0xC68C - ActiveArea = 0xC68D - MaskedAreas = 0xC68E - AsShotICCProfile = 0xC68F - AsShotPreProfileMatrix = 0xC690 - CurrentICCProfile = 0xC691 - CurrentPreProfileMatrix = 0xC692 - ColorimetricReference = 0xC6BF - CameraCalibrationSignature = 0xC6F3 - ProfileCalibrationSignature = 0xC6F4 - AsShotProfileName = 0xC6F6 - NoiseReductionApplied = 0xC6F7 - ProfileName = 0xC6F8 - ProfileHueSatMapDims = 0xC6F9 - ProfileHueSatMapData1 = 0xC6FA - ProfileHueSatMapData2 = 0xC6FB - ProfileToneCurve = 0xC6FC - ProfileEmbedPolicy = 0xC6FD - ProfileCopyright = 0xC6FE - ForwardMatrix1 = 0xC714 - ForwardMatrix2 = 0xC715 - PreviewApplicationName = 0xC716 - PreviewApplicationVersion = 0xC717 - PreviewSettingsName = 0xC718 - PreviewSettingsDigest = 0xC719 - PreviewColorSpace = 0xC71A - PreviewDateTime = 0xC71B - RawImageDigest = 0xC71C - OriginalRawFileDigest = 0xC71D - SubTileBlockSize = 0xC71E - RowInterleaveFactor = 0xC71F - ProfileLookTableDims = 0xC725 - ProfileLookTableData = 0xC726 - OpcodeList1 = 0xC740 - OpcodeList2 = 0xC741 - OpcodeList3 = 0xC74E - NoiseProfile = 0xC761 - - -"""Maps EXIF tags to tag names.""" -TAGS = { - **{i.value: i.name for i in Base}, - 0x920C: "SpatialFrequencyResponse", - 0x9214: "SubjectLocation", - 0x9215: "ExposureIndex", - 0x828E: "CFAPattern", - 0x920B: "FlashEnergy", - 0x9216: "TIFF/EPStandardID", -} - - -class GPS(IntEnum): - GPSVersionID = 0 - GPSLatitudeRef = 1 - GPSLatitude = 2 - GPSLongitudeRef = 3 - GPSLongitude = 4 - GPSAltitudeRef = 5 - GPSAltitude = 6 - GPSTimeStamp = 7 - GPSSatellites = 8 - GPSStatus = 9 - GPSMeasureMode = 10 - GPSDOP = 11 - GPSSpeedRef = 12 - GPSSpeed = 13 - GPSTrackRef = 14 - GPSTrack = 15 - GPSImgDirectionRef = 16 - GPSImgDirection = 17 - GPSMapDatum = 18 - GPSDestLatitudeRef = 19 - GPSDestLatitude = 20 - GPSDestLongitudeRef = 21 - GPSDestLongitude = 22 - GPSDestBearingRef = 23 - GPSDestBearing = 24 - GPSDestDistanceRef = 25 - GPSDestDistance = 26 - GPSProcessingMethod = 27 - GPSAreaInformation = 28 - GPSDateStamp = 29 - GPSDifferential = 30 - GPSHPositioningError = 31 - - -"""Maps EXIF GPS tags to tag names.""" -GPSTAGS = {i.value: i.name for i in GPS} - - -class Interop(IntEnum): - InteropIndex = 1 - InteropVersion = 2 - RelatedImageFileFormat = 4096 - RelatedImageWidth = 4097 - RleatedImageHeight = 4098 - - -class IFD(IntEnum): - Exif = 34665 - GPSInfo = 34853 - Makernote = 37500 - Interop = 40965 - IFD1 = -1 - - -class LightSource(IntEnum): - Unknown = 0 - Daylight = 1 - Fluorescent = 2 - Tungsten = 3 - Flash = 4 - Fine = 9 - Cloudy = 10 - Shade = 11 - DaylightFluorescent = 12 - DayWhiteFluorescent = 13 - CoolWhiteFluorescent = 14 - WhiteFluorescent = 15 - StandardLightA = 17 - StandardLightB = 18 - StandardLightC = 19 - D55 = 20 - D65 = 21 - D75 = 22 - D50 = 23 - ISO = 24 - Other = 255 diff --git a/.flatpak-builder/cache/objects/22/2468b6d24cf1faa93b8438db4450775d18798ac9fe43915f1aaf98693452ef.dirtree b/.flatpak-builder/cache/objects/22/2468b6d24cf1faa93b8438db4450775d18798ac9fe43915f1aaf98693452ef.dirtree deleted file mode 100644 index b09a7d9c2d7442843a63dbb13155ed074e9aaac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58 zcmYe!&(+IHO-n0IEz)z$DM(CC)GNqKXGlwq+-KCz+o7(`Y<^X!@?VtewA$TG?_yk5 OWVI}ay17u?!V&8{c diff --git a/.flatpak-builder/cache/objects/22/4ec00b2b1dff51a62818b8071f923d2158b17375c96120779c8955b728a69e.file b/.flatpak-builder/cache/objects/22/4ec00b2b1dff51a62818b8071f923d2158b17375c96120779c8955b728a69e.file deleted file mode 100644 index ecba24fdec609f303eebab992a8264e1963d4b73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43749 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 diff --git a/.flatpak-builder/cache/objects/22/924a6c416ea38cd81333bd42bf3a67fe5aee0e0875e23edd1317618f44868d.file b/.flatpak-builder/cache/objects/22/924a6c416ea38cd81333bd42bf3a67fe5aee0e0875e23edd1317618f44868d.file deleted file mode 100644 index bc8b12f1aa0a69e8d27f1d1c505f3c96aa09b939..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmZ3^%ge>gz`!u|^$pRrC(pcm3}nLr6NJV1Sq#XS&XB^8!kEL5%NWJT$dJMm#gxJv z%%I8g5~N6z@fLStUS57lVo7FxUU3zhp@E*Uo`Ihx^DVCU__WfJ(xTM(_#%)^x47fu z%TkMqf$HMpS2BDCY5!%YpIA_!pOcxSUreC`^* zihayATef`L^hsgt^QNBFJ{Diiyk?OR%*eD7B2ARxm6X--v&&};?_?Kzu|qX?+W$Ar z&H2i%+kgGs^&mLP5N2X-Vo3&(W>(c^x336}44S)io5H!$w^v?XHw*n2=ec&do!G+A zn3SK!a5M9Z3Wzn-@~ENf>~~TD8)c9A6ckpcTs`Kx&TE$DlwdY1>5i=j=bFF_Ey*U* znF_!3-@MU2rt;nYacj`TH(Wwt2Qv>o72(gHw>@O;Btdq=`0~`G0wN8Y?dY?@Lt6B( vTGa%_Se=v^<^L7DOShc)z+cM0cz$MKf=&R#Vur5_o{aMtKQP)dc{2e3$o%FJ diff --git a/.flatpak-builder/cache/objects/23/7ade21152cefba1be4735b97948533c029c9b5ea899b10c84671e10939b27b.dirtree b/.flatpak-builder/cache/objects/23/7ade21152cefba1be4735b97948533c029c9b5ea899b10c84671e10939b27b.dirtree deleted file mode 100644 index abfb68590c6c505cbb75237013e3bdbd2c8d77b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 911 zcma!#&&%cR3rkarOX71= zOEU6Pz?y0U{>;nNuKytsb8ge*gu7YAbGmZhY4iVAo+I*yDJs7}B)%-Qs2J*`JhqXBVNuIER_RgD@%l9%y zt(~?x;cIl&*_AF^6)*51lo#aZ=YafR)*8~g*06Tvt*OR^rffYoZiMws<(?;e@t?=# z^k+MbU4&9Al2Z#nK?HVv0_Q8=#}ixS4o;FjAr(=cX3;c{qs>`2Ek?e`*Hvf!0=~4& z)EtOMoI{Bs?DL8V?vWkG5R!^{$s*I!O8O>gu2R`yNpPPV-3t{LibA+>6< z61nkg86BKOsl^4ra7YCiYco%D<(fbz?z=Hh0#!PeuHVNpsq~^r*TWT)@^);pTY8B{ zmm!H^GQ$amuM8@T;f!sJ8yW90axhsiB{B6g#m5&^CMPCmq{hcHSUt<%aZl^I%H31* zr++^kr@N_QmHfzMa8gaD{0?pvSQ@e|Swa7tG9h{Al^s7k>#Eqsrw6t`2sUiO_Vj-@A0~STCza-&L30m+|-i9 zl*E!mhS}C}PC3eFSuPuVljhj8+n#&n!*!kEGFQT+e=OV}7ypn`CoC;9C$*Si&CFjr zc0WB5x&Gl~|Mqzw7^2df^w$!h zt8a?GX?DEk&I##IV=GH6Vrctze^KQ@)kT@dr6(WlJotIx3GvTc+0WXPwF&+?WcxdT LkSQuG9(@r2M*MI3 diff --git a/.flatpak-builder/cache/objects/23/fc6533bcf398912375e6d7ca87c10335a0878fb8bcdc782b887e710b9bac98.file b/.flatpak-builder/cache/objects/23/fc6533bcf398912375e6d7ca87c10335a0878fb8bcdc782b887e710b9bac98.file deleted file mode 100644 index d8c60c2b0b79a9c784567b1fddd945c70ddd6db7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2960 zcmai0UvC@75#J;4cqB!Nj3`TXg4XBQhC#)qs-&&mKrtfQLK4JKT1)K%gW_OCQoN&`%&00!myPKxokiy|Hiu6ndyTv;2E@ zi|ifeW@mmkJ2Sg8$1jq}c$g6K@MrA9KmPTrzx*Be{)luq=_v(fmrz0_ixj22Bq1NN zLirFp!&bN`=Vg$|RI!v|Bp;DTh`d8+!9-5W>_`edCW|*(bQP82Km-Es|{X z2xnQzA2DpZ_(`1gLxh2ieZWq>=trb~unQ^VO0+OY< zTf#ujS6zdnDL?GE+?NF#;moaY+m{zgHZ!~Ki(nL>FqfXLg$VhTv`btJzB@dLN{>PQ z1b&_25xuXE5s$3)XU#sQhs7riKL*5;K58TEssp|EoR)^~3g7rkRNj!?*bq_<+WA=W z!c?J=Uxo%--o#j57*q|uxuJMUvwviU;WYXjGU7#O?5>ClJc@s-M~IfuB9D6tRlI>*?g4*OTQG`HF)M?^|2z^8{{Ysl7Zm3DNI%4vmkQ8PNcH84&DP6MevE3& zrf3tjkr2Vi3Q}u(zdCp7Rk5FcoD8rJqL07O{Uv?O~>xT*@Ke{+S|Gs|x zr?-5?sgxP_qq<(O3$CvFvdb(h8$+A<{p0s;PK$n(E8pX1 z;O**YXWDb-6_7cnA>@B=l5a*yX0rZ^ro2CP{$T8UP2N`9awhgxD?PrW?j{~38jJhs zGY9E2wYjfTWA&K_Yujs$%+^M2qc!n*J^b~=cN*rW){eE8e)TXjUSF!4^`)K5yH_7w zZC=>VOdVvVYB#{vZtPL4aqiR9PO3K7N~P;_TWhto*2HT;3#ggds?;j2$yXZJ8b4`V z+gY#6|Hw?#KWbzei;c;hYI9~kbN(Q6zINjUZP&r*eM?eKoS5m_10$?j>g17a*o@E|S>j19e;dbM)k&q9+^Uzn*NK`~1Qe7k_*4 zH@VMqzdyGhy?hY8yw|&*LY{~TdFl`3MI*-Ev?UcYGPM!@8om%^>!$9)m+kmvq#s^095%mhvNC=Ef3A5NeinQc zQEP^EJRZ>Z)DdB1`FK3=t?X(|(f43299SD7lpHV^N)w(hj$m)VkNzUzmjDMJWW}^f z4$I0Sc0L0_{sxjC0C8|FJhq)|Kq0VoEQG;X?9AUr>?Fl(?=JOSEDkpV0M>Du&h7sJc!|rml - - :param radius: Standard deviation of the Gaussian kernel. Either a sequence of two - numbers for x and y, or a single number for both. - """ - - name = "GaussianBlur" - - def __init__(self, radius=2): - self.radius = radius - - def filter(self, image): - xy = self.radius - if not isinstance(xy, (tuple, list)): - xy = (xy, xy) - if xy == (0, 0): - return image.copy() - return image.gaussian_blur(xy) - - -class BoxBlur(MultibandFilter): - """Blurs the image by setting each pixel to the average value of the pixels - in a square box extending radius pixels in each direction. - Supports float radius of arbitrary size. Uses an optimized implementation - which runs in linear time relative to the size of the image - for any radius value. - - :param radius: Size of the box in a direction. Either a sequence of two numbers for - x and y, or a single number for both. - - Radius 0 does not blur, returns an identical image. - Radius 1 takes 1 pixel in each direction, i.e. 9 pixels in total. - """ - - name = "BoxBlur" - - def __init__(self, radius): - xy = radius - if not isinstance(xy, (tuple, list)): - xy = (xy, xy) - if xy[0] < 0 or xy[1] < 0: - msg = "radius must be >= 0" - raise ValueError(msg) - self.radius = radius - - def filter(self, image): - xy = self.radius - if not isinstance(xy, (tuple, list)): - xy = (xy, xy) - if xy == (0, 0): - return image.copy() - return image.box_blur(xy) - - -class UnsharpMask(MultibandFilter): - """Unsharp mask filter. - - See Wikipedia's entry on `digital unsharp masking`_ for an explanation of - the parameters. - - :param radius: Blur Radius - :param percent: Unsharp strength, in percent - :param threshold: Threshold controls the minimum brightness change that - will be sharpened - - .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking - - """ - - name = "UnsharpMask" - - def __init__(self, radius=2, percent=150, threshold=3): - self.radius = radius - self.percent = percent - self.threshold = threshold - - def filter(self, image): - return image.unsharp_mask(self.radius, self.percent, self.threshold) - - -class BLUR(BuiltinFilter): - name = "Blur" - # fmt: off - filterargs = (5, 5), 16, 0, ( - 1, 1, 1, 1, 1, - 1, 0, 0, 0, 1, - 1, 0, 0, 0, 1, - 1, 0, 0, 0, 1, - 1, 1, 1, 1, 1, - ) - # fmt: on - - -class CONTOUR(BuiltinFilter): - name = "Contour" - # fmt: off - filterargs = (3, 3), 1, 255, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class DETAIL(BuiltinFilter): - name = "Detail" - # fmt: off - filterargs = (3, 3), 6, 0, ( - 0, -1, 0, - -1, 10, -1, - 0, -1, 0, - ) - # fmt: on - - -class EDGE_ENHANCE(BuiltinFilter): - name = "Edge-enhance" - # fmt: off - filterargs = (3, 3), 2, 0, ( - -1, -1, -1, - -1, 10, -1, - -1, -1, -1, - ) - # fmt: on - - -class EDGE_ENHANCE_MORE(BuiltinFilter): - name = "Edge-enhance More" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 9, -1, - -1, -1, -1, - ) - # fmt: on - - -class EMBOSS(BuiltinFilter): - name = "Emboss" - # fmt: off - filterargs = (3, 3), 1, 128, ( - -1, 0, 0, - 0, 1, 0, - 0, 0, 0, - ) - # fmt: on - - -class FIND_EDGES(BuiltinFilter): - name = "Find Edges" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class SHARPEN(BuiltinFilter): - name = "Sharpen" - # fmt: off - filterargs = (3, 3), 16, 0, ( - -2, -2, -2, - -2, 32, -2, - -2, -2, -2, - ) - # fmt: on - - -class SMOOTH(BuiltinFilter): - name = "Smooth" - # fmt: off - filterargs = (3, 3), 13, 0, ( - 1, 1, 1, - 1, 5, 1, - 1, 1, 1, - ) - # fmt: on - - -class SMOOTH_MORE(BuiltinFilter): - name = "Smooth More" - # fmt: off - filterargs = (5, 5), 100, 0, ( - 1, 1, 1, 1, 1, - 1, 5, 5, 5, 1, - 1, 5, 44, 5, 1, - 1, 5, 5, 5, 1, - 1, 1, 1, 1, 1, - ) - # fmt: on - - -class Color3DLUT(MultibandFilter): - """Three-dimensional color lookup table. - - Transforms 3-channel pixels using the values of the channels as coordinates - in the 3D lookup table and interpolating the nearest elements. - - This method allows you to apply almost any color transformation - in constant time by using pre-calculated decimated tables. - - .. versionadded:: 5.2.0 - - :param size: Size of the table. One int or tuple of (int, int, int). - Minimal size in any dimension is 2, maximum is 65. - :param table: Flat lookup table. A list of ``channels * size**3`` - float elements or a list of ``size**3`` channels-sized - tuples with floats. Channels are changed first, - then first dimension, then second, then third. - Value 0.0 corresponds lowest value of output, 1.0 highest. - :param channels: Number of channels in the table. Could be 3 or 4. - Default is 3. - :param target_mode: A mode for the result image. Should have not less - than ``channels`` channels. Default is ``None``, - which means that mode wouldn't be changed. - """ - - name = "Color 3D LUT" - - def __init__(self, size, table, channels=3, target_mode=None, **kwargs): - if channels not in (3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - self.size = size = self._check_size(size) - self.channels = channels - self.mode = target_mode - - # Hidden flag `_copy_table=False` could be used to avoid extra copying - # of the table if the table is specially made for the constructor. - copy_table = kwargs.get("_copy_table", True) - items = size[0] * size[1] * size[2] - wrong_size = False - - numpy = None - if hasattr(table, "shape"): - try: - import numpy - except ImportError: - pass - - if numpy and isinstance(table, numpy.ndarray): - if copy_table: - table = table.copy() - - if table.shape in [ - (items * channels,), - (items, channels), - (size[2], size[1], size[0], channels), - ]: - table = table.reshape(items * channels) - else: - wrong_size = True - - else: - if copy_table: - table = list(table) - - # Convert to a flat list - if table and isinstance(table[0], (list, tuple)): - table, raw_table = [], table - for pixel in raw_table: - if len(pixel) != channels: - msg = ( - "The elements of the table should " - f"have a length of {channels}." - ) - raise ValueError(msg) - table.extend(pixel) - - if wrong_size or len(table) != items * channels: - msg = ( - "The table should have either channels * size**3 float items " - "or size**3 items of channels-sized tuples with floats. " - f"Table should be: {channels}x{size[0]}x{size[1]}x{size[2]}. " - f"Actual length: {len(table)}" - ) - raise ValueError(msg) - self.table = table - - @staticmethod - def _check_size(size): - try: - _, _, _ = size - except ValueError as e: - msg = "Size should be either an integer or a tuple of three integers." - raise ValueError(msg) from e - except TypeError: - size = (size, size, size) - size = [int(x) for x in size] - for size_1d in size: - if not 2 <= size_1d <= 65: - msg = "Size should be in [2, 65] range." - raise ValueError(msg) - return size - - @classmethod - def generate(cls, size, callback, channels=3, target_mode=None): - """Generates new LUT using provided callback. - - :param size: Size of the table. Passed to the constructor. - :param callback: Function with three parameters which correspond - three color channels. Will be called ``size**3`` - times with values from 0.0 to 1.0 and should return - a tuple with ``channels`` elements. - :param channels: The number of channels which should return callback. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - size_1d, size_2d, size_3d = cls._check_size(size) - if channels not in (3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - - table = [0] * (size_1d * size_2d * size_3d * channels) - idx_out = 0 - for b in range(size_3d): - for g in range(size_2d): - for r in range(size_1d): - table[idx_out : idx_out + channels] = callback( - r / (size_1d - 1), g / (size_2d - 1), b / (size_3d - 1) - ) - idx_out += channels - - return cls( - (size_1d, size_2d, size_3d), - table, - channels=channels, - target_mode=target_mode, - _copy_table=False, - ) - - def transform(self, callback, with_normals=False, channels=None, target_mode=None): - """Transforms the table values using provided callback and returns - a new LUT with altered values. - - :param callback: A function which takes old lookup table values - and returns a new set of values. The number - of arguments which function should take is - ``self.channels`` or ``3 + self.channels`` - if ``with_normals`` flag is set. - Should return a tuple of ``self.channels`` or - ``channels`` elements if it is set. - :param with_normals: If true, ``callback`` will be called with - coordinates in the color cube as the first - three arguments. Otherwise, ``callback`` - will be called only with actual color values. - :param channels: The number of channels in the resulting lookup table. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - if channels not in (None, 3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - ch_in = self.channels - ch_out = channels or ch_in - size_1d, size_2d, size_3d = self.size - - table = [0] * (size_1d * size_2d * size_3d * ch_out) - idx_in = 0 - idx_out = 0 - for b in range(size_3d): - for g in range(size_2d): - for r in range(size_1d): - values = self.table[idx_in : idx_in + ch_in] - if with_normals: - values = callback( - r / (size_1d - 1), - g / (size_2d - 1), - b / (size_3d - 1), - *values, - ) - else: - values = callback(*values) - table[idx_out : idx_out + ch_out] = values - idx_in += ch_in - idx_out += ch_out - - return type(self)( - self.size, - table, - channels=ch_out, - target_mode=target_mode or self.mode, - _copy_table=False, - ) - - def __repr__(self): - r = [ - f"{self.__class__.__name__} from {self.table.__class__.__name__}", - "size={:d}x{:d}x{:d}".format(*self.size), - f"channels={self.channels:d}", - ] - if self.mode: - r.append(f"target_mode={self.mode}") - return "<{}>".format(" ".join(r)) - - def filter(self, image): - from . import Image - - return image.color_lut_3d( - self.mode or image.mode, - Image.Resampling.BILINEAR, - self.channels, - self.size[0], - self.size[1], - self.size[2], - self.table, - ) diff --git a/.flatpak-builder/cache/objects/24/acbb915c6ac43f3ece67dedf1ad4c4500de87a4533b0a2090cb1c535560586.dirtree b/.flatpak-builder/cache/objects/24/acbb915c6ac43f3ece67dedf1ad4c4500de87a4533b0a2090cb1c535560586.dirtree deleted file mode 100644 index ab50609b2fd3c6347526364c253c0e112b842f2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110 zcmV-!0FnQ4b#4GuD-@SovWugjuqzQo!JnE==@IE(SZ+ILmuPh`6P{lLC3J0Y0B$r3 zod2_Wn4G0V=DTXY;lL<%P%Y?zVOMq!QKa QbM`5S>kDjDh$I9?CNqaH_y7O^ diff --git a/.flatpak-builder/cache/objects/25/3f960c0851bc62c644df32eadf1d0f1108b20554e92f5973dc888fefe104f0.file b/.flatpak-builder/cache/objects/25/3f960c0851bc62c644df32eadf1d0f1108b20554e92f5973dc888fefe104f0.file deleted file mode 100644 index 8d197ea..0000000 --- a/.flatpak-builder/cache/objects/25/3f960c0851bc62c644df32eadf1d0f1108b20554e92f5973dc888fefe104f0.file +++ /dev/null @@ -1,418 +0,0 @@ -""" -Support for streaming http requests in emscripten. - -A few caveats - - -Firstly, you can't do streaming http in the main UI thread, because atomics.wait isn't allowed. -Streaming only works if you're running pyodide in a web worker. - -Secondly, this uses an extra web worker and SharedArrayBuffer to do the asynchronous fetch -operation, so it requires that you have crossOriginIsolation enabled, by serving over https -(or from localhost) with the two headers below set: - - Cross-Origin-Opener-Policy: same-origin - Cross-Origin-Embedder-Policy: require-corp - -You can tell if cross origin isolation is successfully enabled by looking at the global crossOriginIsolated variable in -javascript console. If it isn't, streaming requests will fallback to XMLHttpRequest, i.e. getting the whole -request into a buffer and then returning it. it shows a warning in the javascript console in this case. - -Finally, the webworker which does the streaming fetch is created on initial import, but will only be started once -control is returned to javascript. Call `await wait_for_streaming_ready()` to wait for streaming fetch. - -NB: in this code, there are a lot of javascript objects. They are named js_* -to make it clear what type of object they are. -""" -from __future__ import annotations - -import io -import json -from email.parser import Parser -from importlib.resources import files -from typing import TYPE_CHECKING, Any - -import js # type: ignore[import-not-found] -from pyodide.ffi import ( # type: ignore[import-not-found] - JsArray, - JsException, - JsProxy, - to_js, -) - -if TYPE_CHECKING: - from typing_extensions import Buffer - -from .request import EmscriptenRequest -from .response import EmscriptenResponse - -""" -There are some headers that trigger unintended CORS preflight requests. -See also https://github.com/koenvo/pyodide-http/issues/22 -""" -HEADERS_TO_IGNORE = ("user-agent",) - -SUCCESS_HEADER = -1 -SUCCESS_EOF = -2 -ERROR_TIMEOUT = -3 -ERROR_EXCEPTION = -4 - -_STREAMING_WORKER_CODE = ( - files(__package__) - .joinpath("emscripten_fetch_worker.js") - .read_text(encoding="utf-8") -) - - -class _RequestError(Exception): - def __init__( - self, - message: str | None = None, - *, - request: EmscriptenRequest | None = None, - response: EmscriptenResponse | None = None, - ): - self.request = request - self.response = response - self.message = message - super().__init__(self.message) - - -class _StreamingError(_RequestError): - pass - - -class _TimeoutError(_RequestError): - pass - - -def _obj_from_dict(dict_val: dict[str, Any]) -> JsProxy: - return to_js(dict_val, dict_converter=js.Object.fromEntries) - - -class _ReadStream(io.RawIOBase): - def __init__( - self, - int_buffer: JsArray, - byte_buffer: JsArray, - timeout: float, - worker: JsProxy, - connection_id: int, - request: EmscriptenRequest, - ): - self.int_buffer = int_buffer - self.byte_buffer = byte_buffer - self.read_pos = 0 - self.read_len = 0 - self.connection_id = connection_id - self.worker = worker - self.timeout = int(1000 * timeout) if timeout > 0 else None - self.is_live = True - self._is_closed = False - self.request: EmscriptenRequest | None = request - - def __del__(self) -> None: - self.close() - - # this is compatible with _base_connection - def is_closed(self) -> bool: - return self._is_closed - - # for compatibility with RawIOBase - @property - def closed(self) -> bool: - return self.is_closed() - - def close(self) -> None: - if not self.is_closed(): - self.read_len = 0 - self.read_pos = 0 - self.int_buffer = None - self.byte_buffer = None - self._is_closed = True - self.request = None - if self.is_live: - self.worker.postMessage(_obj_from_dict({"close": self.connection_id})) - self.is_live = False - super().close() - - def readable(self) -> bool: - return True - - def writable(self) -> bool: - return False - - def seekable(self) -> bool: - return False - - def readinto(self, byte_obj: Buffer) -> int: - if not self.int_buffer: - raise _StreamingError( - "No buffer for stream in _ReadStream.readinto", - request=self.request, - response=None, - ) - if self.read_len == 0: - # wait for the worker to send something - js.Atomics.store(self.int_buffer, 0, ERROR_TIMEOUT) - self.worker.postMessage(_obj_from_dict({"getMore": self.connection_id})) - if ( - js.Atomics.wait(self.int_buffer, 0, ERROR_TIMEOUT, self.timeout) - == "timed-out" - ): - raise _TimeoutError - data_len = self.int_buffer[0] - if data_len > 0: - self.read_len = data_len - self.read_pos = 0 - elif data_len == ERROR_EXCEPTION: - string_len = self.int_buffer[1] - # decode the error string - js_decoder = js.TextDecoder.new() - json_str = js_decoder.decode(self.byte_buffer.slice(0, string_len)) - raise _StreamingError( - f"Exception thrown in fetch: {json_str}", - request=self.request, - response=None, - ) - else: - # EOF, free the buffers and return zero - # and free the request - self.is_live = False - self.close() - return 0 - # copy from int32array to python bytes - ret_length = min(self.read_len, len(memoryview(byte_obj))) - subarray = self.byte_buffer.subarray( - self.read_pos, self.read_pos + ret_length - ).to_py() - memoryview(byte_obj)[0:ret_length] = subarray - self.read_len -= ret_length - self.read_pos += ret_length - return ret_length - - -class _StreamingFetcher: - def __init__(self) -> None: - # make web-worker and data buffer on startup - self.streaming_ready = False - - js_data_blob = js.Blob.new( - [_STREAMING_WORKER_CODE], _obj_from_dict({"type": "application/javascript"}) - ) - - def promise_resolver(js_resolve_fn: JsProxy, js_reject_fn: JsProxy) -> None: - def onMsg(e: JsProxy) -> None: - self.streaming_ready = True - js_resolve_fn(e) - - def onErr(e: JsProxy) -> None: - js_reject_fn(e) # Defensive: never happens in ci - - self.js_worker.onmessage = onMsg - self.js_worker.onerror = onErr - - js_data_url = js.URL.createObjectURL(js_data_blob) - self.js_worker = js.globalThis.Worker.new(js_data_url) - self.js_worker_ready_promise = js.globalThis.Promise.new(promise_resolver) - - def send(self, request: EmscriptenRequest) -> EmscriptenResponse: - headers = { - k: v for k, v in request.headers.items() if k not in HEADERS_TO_IGNORE - } - - body = request.body - fetch_data = {"headers": headers, "body": to_js(body), "method": request.method} - # start the request off in the worker - timeout = int(1000 * request.timeout) if request.timeout > 0 else None - js_shared_buffer = js.SharedArrayBuffer.new(1048576) - js_int_buffer = js.Int32Array.new(js_shared_buffer) - js_byte_buffer = js.Uint8Array.new(js_shared_buffer, 8) - - js.Atomics.store(js_int_buffer, 0, ERROR_TIMEOUT) - js.Atomics.notify(js_int_buffer, 0) - js_absolute_url = js.URL.new(request.url, js.location).href - self.js_worker.postMessage( - _obj_from_dict( - { - "buffer": js_shared_buffer, - "url": js_absolute_url, - "fetchParams": fetch_data, - } - ) - ) - # wait for the worker to send something - js.Atomics.wait(js_int_buffer, 0, ERROR_TIMEOUT, timeout) - if js_int_buffer[0] == ERROR_TIMEOUT: - raise _TimeoutError( - "Timeout connecting to streaming request", - request=request, - response=None, - ) - elif js_int_buffer[0] == SUCCESS_HEADER: - # got response - # header length is in second int of intBuffer - string_len = js_int_buffer[1] - # decode the rest to a JSON string - js_decoder = js.TextDecoder.new() - # this does a copy (the slice) because decode can't work on shared array - # for some silly reason - json_str = js_decoder.decode(js_byte_buffer.slice(0, string_len)) - # get it as an object - response_obj = json.loads(json_str) - return EmscriptenResponse( - request=request, - status_code=response_obj["status"], - headers=response_obj["headers"], - body=_ReadStream( - js_int_buffer, - js_byte_buffer, - request.timeout, - self.js_worker, - response_obj["connectionID"], - request, - ), - ) - elif js_int_buffer[0] == ERROR_EXCEPTION: - string_len = js_int_buffer[1] - # decode the error string - js_decoder = js.TextDecoder.new() - json_str = js_decoder.decode(js_byte_buffer.slice(0, string_len)) - raise _StreamingError( - f"Exception thrown in fetch: {json_str}", request=request, response=None - ) - else: - raise _StreamingError( - f"Unknown status from worker in fetch: {js_int_buffer[0]}", - request=request, - response=None, - ) - - -# check if we are in a worker or not -def is_in_browser_main_thread() -> bool: - return hasattr(js, "window") and hasattr(js, "self") and js.self == js.window - - -def is_cross_origin_isolated() -> bool: - return hasattr(js, "crossOriginIsolated") and js.crossOriginIsolated - - -def is_in_node() -> bool: - return ( - hasattr(js, "process") - and hasattr(js.process, "release") - and hasattr(js.process.release, "name") - and js.process.release.name == "node" - ) - - -def is_worker_available() -> bool: - return hasattr(js, "Worker") and hasattr(js, "Blob") - - -_fetcher: _StreamingFetcher | None = None - -if is_worker_available() and ( - (is_cross_origin_isolated() and not is_in_browser_main_thread()) - and (not is_in_node()) -): - _fetcher = _StreamingFetcher() -else: - _fetcher = None - - -def send_streaming_request(request: EmscriptenRequest) -> EmscriptenResponse | None: - if _fetcher and streaming_ready(): - return _fetcher.send(request) - else: - _show_streaming_warning() - return None - - -_SHOWN_TIMEOUT_WARNING = False - - -def _show_timeout_warning() -> None: - global _SHOWN_TIMEOUT_WARNING - if not _SHOWN_TIMEOUT_WARNING: - _SHOWN_TIMEOUT_WARNING = True - message = "Warning: Timeout is not available on main browser thread" - js.console.warn(message) - - -_SHOWN_STREAMING_WARNING = False - - -def _show_streaming_warning() -> None: - global _SHOWN_STREAMING_WARNING - if not _SHOWN_STREAMING_WARNING: - _SHOWN_STREAMING_WARNING = True - message = "Can't stream HTTP requests because: \n" - if not is_cross_origin_isolated(): - message += " Page is not cross-origin isolated\n" - if is_in_browser_main_thread(): - message += " Python is running in main browser thread\n" - if not is_worker_available(): - message += " Worker or Blob classes are not available in this environment." # Defensive: this is always False in browsers that we test in - if streaming_ready() is False: - message += """ Streaming fetch worker isn't ready. If you want to be sure that streaming fetch -is working, you need to call: 'await urllib3.contrib.emscripten.fetch.wait_for_streaming_ready()`""" - from js import console - - console.warn(message) - - -def send_request(request: EmscriptenRequest) -> EmscriptenResponse: - try: - js_xhr = js.XMLHttpRequest.new() - - if not is_in_browser_main_thread(): - js_xhr.responseType = "arraybuffer" - if request.timeout: - js_xhr.timeout = int(request.timeout * 1000) - else: - js_xhr.overrideMimeType("text/plain; charset=ISO-8859-15") - if request.timeout: - # timeout isn't available on the main thread - show a warning in console - # if it is set - _show_timeout_warning() - - js_xhr.open(request.method, request.url, False) - for name, value in request.headers.items(): - if name.lower() not in HEADERS_TO_IGNORE: - js_xhr.setRequestHeader(name, value) - - js_xhr.send(to_js(request.body)) - - headers = dict(Parser().parsestr(js_xhr.getAllResponseHeaders())) - - if not is_in_browser_main_thread(): - body = js_xhr.response.to_py().tobytes() - else: - body = js_xhr.response.encode("ISO-8859-15") - return EmscriptenResponse( - status_code=js_xhr.status, headers=headers, body=body, request=request - ) - except JsException as err: - if err.name == "TimeoutError": - raise _TimeoutError(err.message, request=request) - elif err.name == "NetworkError": - raise _RequestError(err.message, request=request) - else: - # general http error - raise _RequestError(err.message, request=request) - - -def streaming_ready() -> bool | None: - if _fetcher: - return _fetcher.streaming_ready - else: - return None # no fetcher, return None to signify that - - -async def wait_for_streaming_ready() -> bool: - if _fetcher: - await _fetcher.js_worker_ready_promise - return True - else: - return False diff --git a/.flatpak-builder/cache/objects/25/9ec7fa86388bcaee9a8f3045b6299e4b7bd497badecb763a962cb05e365a4c.file b/.flatpak-builder/cache/objects/25/9ec7fa86388bcaee9a8f3045b6299e4b7bd497badecb763a962cb05e365a4c.file deleted file mode 100644 index eb57d497d26e9a9565b38f206117a9cf5061394e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11900 zcmbt)Wl$YW(C(fC9NgVCgb*BpyOW?ngFC@JI2@edL4rF$g1fuB1$Wn=!Rr`Y8OW>Ww<c0azmUSS z^-+zRP*CcvK?oxVYHC;pSoqjtsYTgTZFI5V{07^_439Mtu7!ID5nuf;QoS|Wi z{{kCSe7s`<`b@=CBajh6Lqii@JE~$&;tisr5lQR2LP7Be)U*rm zf(=-gY5>294M-El6W}i3iiwFu5SjG87ZI|aMCdfGq6pu4`SA0`bj6nZ6mIy;R_fNS=OcQ7pEmE zlS=lM5{wME>fVF0^Tdov!x*$?dt2oL-vg3(qq1KRsd9YLH&tpD1+_9tgO;kb$2fuJ zyv#9|+SIYLlDOC;D~C|P-1!~{5~*3-B={xg+ZG3|LH+bJS0B}15LVI0K(rWmgy7bK zk2?AVVt+x&V|!_8|BY4U&+e!WrKRCufZSmJ(Y^;k*(UTg=A`RxT4e*@0g^idM8yWX z#HU0VtJCmh9A-j17r8T*AwU6OYR&!)MN*AcXvBr zW&V>~Mr&L%u0p$#T=tx!LJ_sJwB%wJ+^qtFxY8B{=S=>h0)U_2j18bdfhu}gf?gKO z69zWqASz&^8jWWU+w`FMeAcMe7_?{;ZDKehL>l~SX>{*LW>gNVumKRp02Phr3;I~8 zJ#w~L}{H zUYVI09Bjwx;l~<;%uBeD1z+T?=&IJ^UeqwhjhWtD-G9us@bDUQ?cWDHqI%1GwZS1=V z>?fz5FM>rS(SrP}uyu@WatR!Lu(8wf<#eS@YQsj-Ce~05tF$}=639t{Sy9kXqAem9 zxx&wI$D`(BL81}3CE=yY=@skyn>}8@r27brcqbtL|G@dHijqsG}E4E{Xnh}ur|eud6v&B6MM5<_%)($ z8llr(`|Z{{;V(egPJ1TFWunzATMKzE@aKE!q(f(0%9x<`+k|#3gwB>hNuL$nZ-S8z ziHV7QcMmD1b%_ZHF0{FSQVUDfT5@$iq4@xJCtt;cHG#{^OK~}sCCiKfK8V!MQ1I8u z?eSRx+WT*Mf9wIOIn84{!J&N==umI-`*2^oL8DH#FtGA_jwv>ulP(a@M?gr(6A>0B zJI{}+blwEcX86-r^B7bo(Fr{{Imr$Rf{&PMau3|v;w%m?t^LCv^NF_@7f=CO{c{;I zl5Z?xSP8HW_IZF#{xaMPNHr7soGJ(rp!r1$oz>poM25{zR{E{e{Q}PmDxvzfk2naO z=yW4Imd^JRQu2_jwx*Fn6j4u4Pe9DFIBR?0Bbp0p=i^U}Gv~e06vN=6ECQ(|GkI}D zUyt)$RRk(Fwo1MqxtDIgU%O>Ro$Tz)Ba)Nz^BC!NYUt#eLhzifgUoq~+Yx`Hr=$=k zCnT7vw-}Y(tAUj9WKzeYUsrJdkUW%OS$FpxS$2zZ_R6~i zVECAe@r|IQPxcVgks{j)>E?j&5dw;UtArchUY~}piVU=Vr=vm;+V`u zMog(p)d8-gsOY?@4aj;2!1wRp`&~<~){cw15w#j;ve6G%W&|#I?~ws=c<9p;a`{JW z(t$HErE^e6bpvZFKj=~7B$IMKRhiC{?(Z;Wz@ zb3>$T&8c{4HTVx3`W%k4qV-&MGU4pLZ9a5~HXS0*8k(kDuhVF-3!a7$JzcF?KGL4Gldk z;!Y}n21f;_{PAocSUIpsZHWCsk$YDC{Q2f<22yrBI2NWjQacN9;;LoN*zg$DXwowK zK|!_NWw=vM=2SGsDTN%u;AE});1HUr!+(#-VRp04S2ziaIEu|WVMYcB9-SIGJ3qahSqXI0^S&fQ28M>)F$o)4(ENxq#*(c-3L<1mI_urP0-1dPkcJ4SDkCp=O^dpn;$p#-=YngFe%A7~~F7Z(@h z(1zb-vLke*4Wi)0$Hi59^ldjIQps^C%V0wB;aAy-*nmzB{fj#aFawc8U*J4~SR<7E zauZCIQ?me91Oqn3tt%x>TH0+q!(8`>qnG!R!}4n^sz*R~E1Yv4i#1-9=HtnM;V1*aw?roHC*O-3T?eCdod(Co z22N!5wic=)QP1jZlR`WygrmZc*n{#=MynKX#64E&N6Ub8VITfrv8j{tw+3uhJ8*-7 ziLQN*{$l=j53j<~4wd_7C7uq`Oef1;=i#?rw|_(KE5oK|B;LF7U4yS__w1O%yt z%d2nR*Sq}rS-gi%+Wnh!>0@?o_qPM)<9&L!k-f3Y5Na;2h3)%0#*}wPu%;_;qG65T zjnpyofhpRz=lfZHCdWTBcq?C#@T7__oI#+MgO%cpfh+5&YGOLM-`s`M)lRKfS-gcKe^4%nS~Xiha8wCKE`F?g@>i zp?$_PZQ8?saq@Y*5jBk6XDyeMk;&0})L3|&2PMs@tMQ&cmWy2c_w12UQnA0IDAQ>W zE#YRKVl3lJZLsOz4f@qU6Mg(^FAw~P5<2s}dYU64DMdv?BRVdQ1CJ1&mZt(sDp-nv zfk9l%7c{=JL&H-6NFJSF1j_^&Ek%C+UAr6Yh%3GQ<4~z3qa&Ar*OddcP|PH zd!pk~&KUIKdwz9W@^l6T?o!YIXm&Q0taPA`t-uL>&LVH75U_hCq8X669&*9th; zRI7}emrPMjjaOM;10!wh`l9MBJUnEhY2U(mweNJQ230zWI2wPX{kNt-U*8)B7M8A; z4ovlXw?Hv*NmKalZgFe^g2>odte}u!DlRT~F@G^6jPjLjWaN?+9SjWQAb&X|Bs6H& z5K{aQ<_qYBjpPkHLQ_M7QAH7SRYT=|om+q`dib?|$;LsA7X%PQ;BR8*9IX6;6BloN z6+~$?6mWvKC*UWCDS}@)->q>1lk`0xmSyEz6kbOXxEuQx-2;@qVT1eSLz1;J1egEwW!b+kZDOdwk8*Adb+X!?#_((FxSMhYJL=pSDkFUGy0% zX!vGV-)=r*t_5luq($`RyDK*LG_kRGfEs37Q=o8hm+1p%4%I0z8o~X0uR-bMF zVgszM?YKX-`|)*|a^$M+e`_o-VAXZDW$o?j`{HW@JsOv-2-W zD z!U72leS-V%0XAIt9iQAGiew_eC!;o|X1i4HkGZN9ce9HcCAV#k>ACCKLohnNT(3tv zp0Mxhr6os`7VXDwt8b>n}(uA%%T8AMMco(m0x^mV;G@5hrZjAm6~eV zxw&AVWTh`}7~C()+cBZ(VGs9gPXZXCopg6B-oJL4*W@U){7e=$iDO(}UnYu@&j0m6 zMqB&p{fl|cQl;&(ee&z24qH-+7*+ZsB@%q@aAH81s39;=v!nil4q3?aTUY5o;o+XQ zyq+Ty01@3C{x(*ZI51%4W!vSYRr8<&4-a3obb7=(pYx^06pff)cJ^DFo}(P`nzs+T zjRq;2-OVfjU}e1TC}KiW7IkT7fWwJDpHOL_E>lNsNJB$Hfo4@X)ghr^1av8r&u4VmZ*A{hES}a=uVV#Waxeb!h=?xNTYg;&SSHVE zHg8zI_=C%uU7KHvarJb0SiwYbJof_C30;BiBow%g{}70l3DjT2>{KPg$6&fQctaxpG}&wjsiPJVZ`h+T)h%apNOYcaLldP z`tyLn!t;Q>%i+>gp5wpr{6;(j@0+>-CFtq%G4SoVnRM05<@zg`eQzCb@GN=zV9(=j zGyfW{WzCa)Jd54}c-NQYCrTGf$wWA1mddh${Jn~QKG(mrU{_sWNTeN7@i+=pu zAmqSH#+D+lyLC8KU)JIDzA+SoLQF-4oradSvGAZtM8{`a>TV?(?84ih`+QW6>K zv)KEoQbI#j)+j_2*dp+`sR?W@W1Lda0;CW%-w!_R<){7EIi+kQQ3ngf88Yn=JgrN$ z)??4HCAKYd6!$Dg9afGKYC_+=K;v@Ovp7Fgo-p9}U2H-(49_Ul>&uOeNvP|-a5T8b z^-i`4tkayK-{AwuhVmV(f&NCFz_pBf*?8yiqt#1Bo$vM0a>nwL-6}Ww4;AcGKMOZ~ zL7tKHTOhgIfcA_mgbG8cRL=5eplUy?$ogvQ`_&X==J`_`TJm!*TJPK5Vqrvn zx4+Pf+tpw9ZhvM*)1vhJrF(KYCh8~AGw@PgW@R~3CBL)>z&LPqKwBaVLuCD%(mWB#*D0Fqnwzjssk2q2{gjE0% zAZ;wfY~-iWSgL)c>oWJk-=v#LRCMI7&SQviFFCElvaLi@%-s90GEdXOcK6}k}=PvngC1-+QS*c?4z{b&$u%$jIh#i6@`Vi_FKz zXXkg?=?~Yq`%|aNa8n%9{Ov(7FZ{WfWYAE2pXeOz%8 zw+eA1P~YQvmcQbOFpYEnOQ}JJesCmw8;ltlFtxBSd3n-Qvy2EkKPX+ST(tRJ`}QD) z0T4Ft>JF~dV)|W|l$jYlA^a#`cLVQ(jnEm&5FSv`p`Yj3Qle3&(WW3qDG55K4vit} zO5wCnvv(U|?GRPLn_b4QeTxFc92y_Klx@Ms#~&Oi@r0-AYWWV{kQg2w7MlAeXIVV3 zL{Li$t7SRe>m0KZ9ijTlha7P8Uw_5LV}cz2+-+=_#3k+odz3al;Q^F5q@)or2`OGX z-RKHbw^yA+Q~|t4lc)03?VbM>3H-m3M#tM+g*5Kpbv)j8Z2wLcRsZkQ2Vlmw_3FkC zi-<_;tbS{Io850s5WgDdA57>e|Fn6zG3iyqOPj3P-=JY)4jic)Pzwv|_l?50!9H6C zotz(jz04pcIeAHhmi1lnJ8s(t?--v3D{3PSRtEGp)Ul_^6q<8Kq2w;&D#|)lpX_fw}To~SPSfU=m0MHMpTaMYo54 zU%YE;UrbO@9^RlpW2#`5`KqpurI6TV##PpO7L5I4lgO*$*sh(D$&6J2!$H`8 z!Zh?a5*x4jTqG);hmEO7?6au&dos?t3a5mYuCc}&JOq6-=(sT(E;tSC6~y|Y5};H6JuWZSvfei;>un< z8e)h7xNT>2>z_|%t_`@(g!Q%dfVsOT`tVAcDc&58+vVf?8|P>GFoZ} zq5>aUY_{WLLgF7v(N=s&;1oiSo- zd}*Tea6thF{_cpUR)o7nyM`qnxzPgy|T=mi#yz6YfHG0wwhmB|D=!LPnA zAChKzd%632I4NCP##G!^^-ZeocD5&~9D4{Fmhr4)R1ysJtNu`m*ORDeFAZA7w%#1# zgkqBSy*!6vQxJscx3y3+G``TD{s~<)?mEE6{gLTAyz6qt~hPX{}j7wGc@Z*Qd-O&^XI7!Kgx;@e>t!h8x`-J5JgqvD*9k| z_hrP#(H(m_J1H4-#X{T(!F!y!mvv0SwTS5G?tpm%(WLSv^yG^b&MRx(`%pA;wPP4Q ze*THSf+)z5q2C^ zJIAlRlU(UH++V`%Jc=a~+%DdHmdettzJwDM6Qia`y(FrxapD>}oY^g@d|8fSDYPV; zL8_t5(%2_*Tfb7OJ=^efnEEdO+4bvC*(bXG;l+(PLoebxG>i!#-ca^;7-$vADOyoW zuly#Q2OGM5#-4Duy7QcEP;WQT)(%O*6xnv-S;X~StcJVVZ##4%37mp@RE&ygxoc%? z6GcK=t2Y)&mhX-t?9Vsj@Li)-31Q1oV?HisWHcKw(~sWKc!KrIEmG^+?Q3zQHK>wr zkvj9@kMgQGM9t22udUY}_3pMkF!_TshH2r6Q?n(eLhtM<|Ez$%w>X);=e?Y4+;QK| zb@18dvMcEk`Gj5tv-`Z6AAI2qavINiKU3E=W~miJ^l<64Ijq~s-*v}T7wx+D=o-E- z_xTDI$T3hP|6^b>pI>!+L_Y|0#Qo#NJNV(*)1=$SttmYu?0g58)v1Z2@~EUv>t=|M zrBKd_B<4J<`Rw@sdUg#D54EY;c?hV(P{`zO@8AFX{1`lMB}iWp10ytyw}L`dw6`9R z+mOFsxL^EwtL`Vf0dr<1+q?*qW?&Rm4W$o($je3($?G;|+Qm~%1$6NG;bL&~9fgN9 z4QnJ(gQBxHs%ZNKrgN~{Gh3UdTZtoT5d%u5=a$q{_2M;_u4|R^J|z*)H^%UYkGhJ4 zFwX*^LMXJdQhC;yjfiekhYiuuv5KY8nU^g2!xgdj%c0e*^FsZ#rl9a6-(dBYQ}dL` zS*I(HZi%ONCLRLJp_@CQ+yA#AxrJfPIN->C#f2H4nW~>h9b#@K>O=D}q%d zI3c0=c?BaB&c5veBn*o;)k6jckxHMekd4#+yofP)N*JyN1_t_VV@Eu?1Hl@HRAVzK+lcNTd28o{1-I#8AO)(Sr`>_4p`@*E**(0mEC5FWIJv2v%YEgN+_ znW00bza5u+yf6)WE4``?R%5J$es*q3$go@WN;YV`WN(PJUXPCmS6#wEnMUe#9FF`S zDLUiI{;iOcGbyE^t?>zVmg}{!@4kGo(|hG1iGuk%q-=IuMEM2ungSUx(ybt>!w_at z9CijB8=O=4eQ4-c{Th~MN)8L7bj}ZYoM9pUYN{{?2iR?u6C48$TJKNt6B{c9vd2N)VM1A&u4rSlH=)hXvo(kE7~r#bF- zl>!y+D-)pfc7g%tkLY_OEW1Z*oyX;UaWQL>E-rWt$qK2xhKB?8N9MbTjP~vKPa~L( zYee`I*de!T1_#bCPIf1W_+^6_wp__0$;Rb|kBUj2x6En4WVw&^lUrZQ*VXNb63x#ORl2dnvZbYY!)VScxZHkl*=ybzP%f-*r9 zD-K3BxEEgi4bq7>3i9Ct;S&TV{j`{kuI8=v|7leBC#9{j27~hXF`-OzHj?x6QN)Wy zLdtAgfonuR4w5KXJVFFB5Vmx5Rss!hAL-^=i9A-0653}qRsz0i1~MVMYs5F`*`;F{AJ7R+V?k>3EDH{Uzfzp z+gy(bwM33Tg|>(EWWw9?UyrUMb(BOEP&${>ioW}Ax-8RUxF}pUNBe(x@LC78c6=qS zw^`FLnV%i$d)sR?I4K5myuL|FhIlbZ2&XH)ohy3=8B{zFczru_KCWK#czN+{Jbmy@ zX1idi{d&0kUKqdvWu0A2korY^x3++c@$Yri$nhC-WcU3gFGFH`7}xLYgF#)T*$9Ts zVk`N7<|$>SNmG{x6B$|hKUQYB{lmlcS)gLZvd484(=4AeJz*NRT_21fHGX~R8I%?A zkaLWTjuzMT#?7y@iuQf>%#o=m!6q8~>(sbc9sZ_N#PGrK0lk3Ky?@q5?r}otk_IAg zMNFHg#JRqVS`^OoesE+&CU_N;Hw2B1H4F*~x!XZG!;n%@*0&4E%Ay2=8_|PGKCM%7 z(6n`)uh8HJTDiFSjP-N)l0fP< z(E#xcPXu7{d=VNxR{10BBXUsLTlq>pl06M&ER4)Vs`s&GX^wBt7E4s zvwQn1Ut%fARv_Xy@IDTMotaF?CkR;cq4t;@ygS3_nW`GPG0vxA z&5g7J`g^bS24OxZ(30N|En`Ct=S)3a&L&dusn7#MaY-tyEg2*>Fvu5P0{=Pngrkd^ zlNT?0tD0T*DJtk3prVPz!tUMJ|CNV_yk;f?aVYq=Qr)kNV~aLzdfUO#s@PgNH=V{_ zPn?ARra^Pav%Dn|RFxz85s&)KN3m8nw;n>5qscEJAN(|Lo)Llm^R5-@F5J3d86E@x z(ATnlCIqq037XAXx1={Rb&$>3!Pt$#A6o2i9sWkK!qP^#c|dn0`YYSd1ISUY~* z_y|RAZ2B@o(mg%KIFUXoYFWxE#DlU^yXsgBc!Jgp4Mg z#j(w$(Qi8SG*yJg+oKJ)B>&vzJ5ObWEX8=;$CXI!@CffKh5$4K5NSA@8#pjp8 zL2=%=$BxAIpMkh~xhyqIgYYg&<_AAVvGQLWzU%Vh8}=9>beK=R?uq#%QFhx`L?Ru7 z`ng0h|Am7c*5VCx;=&R(C5Ne?u8@rf$GQ&=KBgOM_PE%+Y^6f6c*QYaJnGRFk|cQJ zJ`KL#zs~k>x~Lf5-i$`Z@%+Wcg|ZhH%Q$?}S-p;z&Qj*dGWT~dj*5MENmE+V(&=hq z_g~eYxv7qJj)8aKancYjYAMTJIxhNPJzjnboW-0<9AgHM)_2L$WHA<6I6i#hNMbFM z&su`Cwc@)*()Mc3<6X1%%hIjQR>8jZ%zRwYIVdwY9Zqh4XDt6R%W)VbfIW-8SlGCTLuug#uZYOsu`{#E6p4A$KP|*7@cxuhE;`l8e<(UG#HAtfEMTj(r^$)NRJlp6F$==1 zAE`|DYHm7yCcS-e8JBAr;NyUE_2<+9%Wc}&0t>c31h9F#XU7KS5#9Fnh-#K(v z_mw{cFCa5KuaV)mwT+{DK^cG#$=7Cbs9y>iKx%y2)~*rXhdL*PQgXbi)y}rp(s8=m z$-3KTf@n~So1~mbV*-AV^-aD}5f6n&29f-0XR5^_uy@NH%-y=j zm7k1+7xWD+yQ9k?73wXm)=9OCt4aiA!;%L+K(uIqdEmf-TK{=E7&bx1pE(lgLA6@n zKWU!87VwQg`YHKU*0#O{*GEk{?!T)lD#u6Z>4@LK%BZS83Ez;?mBK6U7dC_-u=NH3 zIWK5kAb47nN`6pDpkWp6cminmW?1UeY+3nn{|n?m2K*SvUQfA+jkxxE?D>A=+3_h z<;ZYxMT^)eDk*G}AH57@`N_%R#8J^79-L2g3zn%Xq(DW#EZ5^i-m_@ScA9F=So%fk ztxCc}(&;NHL1uvxIh2Gkwz?hrZW)}$Z|*-h5h$7k6{?H~y>a`1Vcz(=Du^KJO}=Cm zKOuY??m|Yf;fUkgOI>}wCWk>O;HO-^;O+QAvWY9oZwc5Dv8f$11YF{tWkBt4t2@V# zjD7=%ON zN5u>6Qu@8py_^o;g3C|`viOLfKByV1BI(fF(1!?Rl0Ip_J&k_RAFIelgbmrVv+DsD zmd^@uX#K5Mf`7>6&m2!zf3iBI;w6-%I!kevUrEmHNt~^7bb0@};0Wq*i>uqZ>AQWaB{lFogwyOa}ExYe z>R}q8h5)YTm?TA3AoUY+1DxlckZq&1f$^5*fAarfVHT>QT2_f=Isxt7=!eh;R2WHk5srix}MbH$n;* zG62+0^O7UNl^ZzOj}k;(ZAjw*m?XCsDLH7)>kHO2A}CJj7~snG51OEoz~`>=&O zrAvrE8(iXQc@t|IeCpF?Th-ZRbjcePKrkvS>T%};OM2QA`T#e&NC|I*r=C?dG*oA6ELCfAv(|p=6g7msy~amI~_JACkai~ zpMD2Zxd&f-y4<3EC(*fp1;Bxd*qGjvLwipRJl#g;9vXHtU<`lj_)cOIHNJVX3g`h^ zMFBJeNG?~~7*Jbt$p~Cd62IA4jI!Ub-x(X%^vpEzJqha+kdFw|6hZFvRqjx*=nkE6 x6Iuc@$nPV5fnLN}4C55P#sBUIHc8PdVmXU{&!u2%Gwe7yASb0LSuSoE@IM diff --git a/.flatpak-builder/cache/objects/25/dc8086607be10177bf37659a1cb67e2a52b8282ebc2a95a66186f4261b84d9.file b/.flatpak-builder/cache/objects/25/dc8086607be10177bf37659a1cb67e2a52b8282ebc2a95a66186f4261b84d9.file deleted file mode 100644 index 65cc706..0000000 --- a/.flatpak-builder/cache/objects/25/dc8086607be10177bf37659a1cb67e2a52b8282ebc2a95a66186f4261b84d9.file +++ /dev/null @@ -1,200 +0,0 @@ -# -# The Python Imaging Library. -# -# MSP file handling -# -# This is the format used by the Paint program in Windows 1 and 2. -# -# History: -# 95-09-05 fl Created -# 97-01-03 fl Read/write MSP images -# 17-02-21 es Fixed RLE interpretation -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-97. -# Copyright (c) Eric Soroos 2017. -# -# See the README file for information on usage and redistribution. -# -# More info on this format: https://archive.org/details/gg243631 -# Page 313: -# Figure 205. Windows Paint Version 1: "DanM" Format -# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 -# -# See also: https://www.fileformat.info/format/mspaint/egff.htm -from __future__ import annotations - -import io -import struct -from typing import IO - -from . import Image, ImageFile -from ._binary import i16le as i16 -from ._binary import o16le as o16 - -# -# read MSP files - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] in [b"DanM", b"LinS"] - - -## -# Image plugin for Windows MSP images. This plugin supports both -# uncompressed (Windows 1.0). - - -class MspImageFile(ImageFile.ImageFile): - format = "MSP" - format_description = "Windows Paint" - - def _open(self) -> None: - # Header - assert self.fp is not None - - s = self.fp.read(32) - if not _accept(s): - msg = "not an MSP file" - raise SyntaxError(msg) - - # Header checksum - checksum = 0 - for i in range(0, 32, 2): - checksum = checksum ^ i16(s, i) - if checksum != 0: - msg = "bad MSP checksum" - raise SyntaxError(msg) - - self._mode = "1" - self._size = i16(s, 4), i16(s, 6) - - if s[:4] == b"DanM": - self.tile = [("raw", (0, 0) + self.size, 32, ("1", 0, 1))] - else: - self.tile = [("MSP", (0, 0) + self.size, 32, None)] - - -class MspDecoder(ImageFile.PyDecoder): - # The algo for the MSP decoder is from - # https://www.fileformat.info/format/mspaint/egff.htm - # cc-by-attribution -- That page references is taken from the - # Encyclopedia of Graphics File Formats and is licensed by - # O'Reilly under the Creative Common/Attribution license - # - # For RLE encoded files, the 32byte header is followed by a scan - # line map, encoded as one 16bit word of encoded byte length per - # line. - # - # NOTE: the encoded length of the line can be 0. This was not - # handled in the previous version of this encoder, and there's no - # mention of how to handle it in the documentation. From the few - # examples I've seen, I've assumed that it is a fill of the - # background color, in this case, white. - # - # - # Pseudocode of the decoder: - # Read a BYTE value as the RunType - # If the RunType value is zero - # Read next byte as the RunCount - # Read the next byte as the RunValue - # Write the RunValue byte RunCount times - # If the RunType value is non-zero - # Use this value as the RunCount - # Read and write the next RunCount bytes literally - # - # e.g.: - # 0x00 03 ff 05 00 01 02 03 04 - # would yield the bytes: - # 0xff ff ff 00 01 02 03 04 - # - # which are then interpreted as a bit packed mode '1' image - - _pulls_fd = True - - def decode(self, buffer: bytes) -> tuple[int, int]: - assert self.fd is not None - - img = io.BytesIO() - blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8)) - try: - self.fd.seek(32) - rowmap = struct.unpack_from( - f"<{self.state.ysize}H", self.fd.read(self.state.ysize * 2) - ) - except struct.error as e: - msg = "Truncated MSP file in row map" - raise OSError(msg) from e - - for x, rowlen in enumerate(rowmap): - try: - if rowlen == 0: - img.write(blank_line) - continue - row = self.fd.read(rowlen) - if len(row) != rowlen: - msg = f"Truncated MSP file, expected {rowlen} bytes on row {x}" - raise OSError(msg) - idx = 0 - while idx < rowlen: - runtype = row[idx] - idx += 1 - if runtype == 0: - (runcount, runval) = struct.unpack_from("Bc", row, idx) - img.write(runval * runcount) - idx += 2 - else: - runcount = runtype - img.write(row[idx : idx + runcount]) - idx += runcount - - except struct.error as e: - msg = f"Corrupted MSP file in row {x}" - raise OSError(msg) from e - - self.set_as_raw(img.getvalue(), ("1", 0, 1)) - - return -1, 0 - - -Image.register_decoder("MSP", MspDecoder) - - -# -# write MSP files (uncompressed only) - - -def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None: - if im.mode != "1": - msg = f"cannot write mode {im.mode} as MSP" - raise OSError(msg) - - # create MSP header - header = [0] * 16 - - header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 - header[2], header[3] = im.size - header[4], header[5] = 1, 1 - header[6], header[7] = 1, 1 - header[8], header[9] = im.size - - checksum = 0 - for h in header: - checksum = checksum ^ h - header[12] = checksum # FIXME: is this the right field? - - # header - for h in header: - fp.write(o16(h)) - - # image body - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 32, ("1", 0, 1))]) - - -# -# registry - -Image.register_open(MspImageFile.format, MspImageFile, _accept) -Image.register_save(MspImageFile.format, _save) - -Image.register_extension(MspImageFile.format, ".msp") diff --git a/.flatpak-builder/cache/objects/25/f8093265cdb7ec53719960f96bef51490af6a3dab5199aed21b7c6800cd62e.file b/.flatpak-builder/cache/objects/25/f8093265cdb7ec53719960f96bef51490af6a3dab5199aed21b7c6800cd62e.file deleted file mode 100644 index 7313904679c40b23fed91ce6c4cf53a4e676d31f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18773 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 G%>Ngvc*=kP diff --git a/.flatpak-builder/cache/objects/26/b385f32c30de351dc0a6349bf71f19f54945b0108bcca9e1a1d57eb84bdfd7.file b/.flatpak-builder/cache/objects/26/b385f32c30de351dc0a6349bf71f19f54945b0108bcca9e1a1d57eb84bdfd7.file deleted file mode 100644 index 670f9e1f750c9e5e50301008f9374b65ee75c7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40208 zcmc(|32+-%nkJZu`v!P{mqbFOcu71&QKTj6GEYgCMAT+#qDyq9Y-Lnz4tK8i&JJSJZvqxCWGFGwEp6S}zgC1AK zI20Y*`~5F7flQE6xjLq2lHfz)<$Et*zI^Y$|Nnj8?RFSBj{8q@zxa3QPlLgKkMqJ| zQ_jA)fFidzft%z6UNFq?lRW!2Od8m?ani`XO_L_}ZJsoE`JkrWwzychWoSoAlwgS+LBM&6ZD=vvccA#cai71v|IR zRL)jSR?Ye+{j=4R)w4B|H7wsgQ#)HXSvOlhSwFjFa?9-2$*r>ulMSWcO^(WDm>t%I47xc(jCn`4FmW)l=?!23*0veCW$f?hV;4?^CY{HCI?U z(IV8o!A%Ydbx50pdZhb>El3XtPY4Zf@RJ9HM*KP?1dtvM87@CwXkptMT*)&H2~8+9 zEHon>5w;^86N_*Abx|=~1Br=`mpk(kFzSNRJDhNKXh|NKXpgNGI^b zr-Yu8=Xg@sg=hc^do&**VBOwJ$*)a45gkGjthIyujhn) z_%$h<5C-wShS}M9 zVFYbV3!_K{VGL^MXAVz`I*3ls2B)ckB7uaa3(N~M&@VdsIhLxFX_Q2I{3WvlqiJ6 zkT4paj&~UHuG!#~(A1?+5Sg*OeJ&`*LR0hN%r9wCACI&o}t=Q#0XMyu+GzQ6mde=NIOJu~@!F`%BlB`IY%-Jd`)0 z7kTS^ME+&N;IJn14xG(L*g3|hVmcbV5)NGsic=TF=)$$HOzBlTjh`Oi+x_ zv$&5%t_Ekq!cjKld57}z-02hfs&f%BbS)eag6C&K!%<;jOcbLco}pp{V{t4J3q@jK z8ZP8HZ8CW!Rz7X4SmIfp^Jsp~h z<4LEZ0(!KlWOS(+c{BRZw|lw(rO>Pe|Ac0~I049Wi?b7q=VrJiK2p}q#S2i28P0&3+UWu1cSE0=W( zw$ifks^WbwJJs`qIl;v%)n6QUxiDVe!#n1eD~Q!!wcPce#fGrd&dL*aECi@!E_fx7xT_zvvW}~ z&K6zXdTK5dIUZU7+&Vt?+|Gj=*}1dPeMo|+Gd3r`1U=0juGQT&Wt z&mrf~!p)mwa{%dis~DP_2~LOd1~HU3&j#bum-75Ez&g{VC_u|DJbm6rV2d89_(TjW zsZYdys85tP0UE|*v?c@Wc+l4asM#|UKHoF95Wf_S^mX_4_5fCdy5@q@SArKqu^tsC z^)Q^&J-3jrVvQYB-mzds?b{I(hv5mZp1KdhTxN$?SUkqn_-R)6y1J zV#_(|$(L)s>i6q1-tEPHu(OiR+*f+L(p9{=?%--$@73(QTeEX@BwMpfs@auv->=-Z z&e`l+Sdtvgc`H&2cfEm(H;}9Fr-jtv)ZtuxV|q_|Pp+c+)`52qtQc3$Wh-_{6+2P- zQCVlR6+5Jg9m&x(Z`qCOX;WJG?(la;v)&HL+ksBGx8$npQ}I+BiSk2PTY zUpHB~f8wYz-sG!{-y8}I4RRk3mJNH2pLlqrI_OMmi~hfuL~@IZYaq9t$`ifu!a4*@ z<@E693>VkH*o{{^_{H~5hvM^MByd)o4|N8@7eJ(h0yK>Su}jhU86j{!6p-<1Na%Jr ziCSMk62&Q#JuEmdw$GZY0axuU(w0DeG*OoXzW;(cZIG zv2%4aThS|3^k!VWpH;N4R%R=@rHby1tNRPo;B-T8LIxZ937qJMJ^>`D2c2SNf?LtN z9BNHI^si|NuLh)~VX;RZ?pPog3CIuvbX|-{z{qqcKqLm}v7opRn4c4Z@lbc(j5R+S z1OB&O3dVx*xF{aM4S@A|K{F0{A61o=7<^)5~T@!l++4mka9# z&kH$ zDz#Pe>{flt;ydiw-NiPFXC=>G`qoP50P&dwzkH6hrlE$4t${+c>+j9esDG6^^C-7z zn+d}l=97NxF;;CDD*~Cy0eZ{~YKdRsF)p?0xI`*9l(M2n{MQW$%uwwJ;<+FfS>of{ z)D}Uj@d-X*SafhDd^(n?L#ANz)~TtP5V)hf5np-B1rYv`Xr4bGY{A@A`L+PoWk3i4 z+0TX}0DT0@z^KJR-E^V+#rP%0#DUj~0md;l63iWF99Hstn636$crg@+%D|UyGYAlT zEd+X}la-<@cAxX1P$UoqA%h!%cZ`EIB)&5gXb*RXx*1CuosY9RZRgtp7iNMNSvmBH zigk1cWL7n}5SRhG5{O4-Kr|f%IW`?H>3DbGSdl*s^mXs*48-Q=h@`@uW@ZRAh@si& zRRZ{c;?&ESu3Ozi*v!o2O|eku$}fp3>?jkD;!8Y92|?JrAsWk@FT~=>HK+i^dzpr|6g zj0^u5|FOTsBv|G^C@i1IRo7%pm7iHX0I(fd>lVohs-wYNzE)kA?tSO#&8taQ()F3$ zmnut*W$ks69q_l_T#jlt=Zlw)X6;)g`_^@?#$3K`sJ55qs{FT}efQaSCT~tA$A9hN zwlv({yE2}w-zm|jFL`3!#`!AJ+itglsKIB=S98<7ZZg;IM&YXMpI11_%74WnS*PU7 zFMnOll~qW-wjVWQynEL26t>$+QlxqnVcbl~uRK-yKi)ri1UC zxOpOVBGzu{DOOrS_--!*13 zern_?wRy&Bji1)=NXMsXdaFkPYu;s8Gp^?2yNK5|$5*A$aLJG`eBG2VT;P|Ckut&f z1{W{jB90p^k@_te!O5Eh^NeZMykwd+EfL%_ELjpp@S)ExS?!#zFNKy?G+43N*@RUO znU`#la==_)v4jknpX2B*Mft!(?y)JKo3QEcA(|4lB@1u>f8)7?1#lbfYWdSrDt5^( zSe6{|>SCY3wQ4Y`9%G4B3CHFbODKI-N5X!&fU{OK7+-TIhraKEsVJ#fa@siqxcfwj zOkhPbdYYD;`j(bl375Df;nKD!LNXHJ1>2H4;YzrRcS0$9@z({67mZmnq!jU{;vE=e z!SJKVzg{BG!8_evEE#Vto^LJ->2NIWR|#3dcLiJ+pPvJ!3eGD?FBrH8;Z`I7xth!p zFtHYh+KI8Vr$;7qgeDQ0B%c2wfaEwP)GZJfFWNzV0j2)|_rBq2?iSB;H=v+kl(gZs zo{1ljV9e0HE6-nu(ehKk^#l8Xi$Iar=fp#c+aOkyrD;>tt!`Ov5IfXeDDs!6$cW^> z;r<2yJyW+2pH)7+cLo3Hz4C8u%7|np;5mX30rFrmZ-e|o zzKbPv9n5`9tfPXCFz5+jP_Pgp&HTJY2tgDW%3IJE$VtS#l`yJ|7&uXus(Wke}R zN5Xj2l1$Nq1Ia>2@!SKh3< z)$ne^iZxr-E|s+}KasPRWvp9s^)2bHq&Mlk&)(vXp2vI3*6ow(_9eaRrY^HPXWNz8 z>~p`WHtD!u761mb`&p74S~pnS)ocEmn-}l-+wc0@SIe^gosxfN%9t{KxmHmRHtsyXJ>HFjf_8dT!5&e)N={^ zgLp#6=kjr)8kM62@9axJpIU^{g6RqYJWlLEzFCuRQSw`~SiZ=oK160-!a>OxfUto2 z-(g+cbykF)g-HI3&}ES}D#S?kNN~2md&uBAdj2w)0TAzWN#=zf@CSbRcQ_vKhe)S` z1pDzC;))Z#jfFdnfuIH zp6W|mR!muEi{xxs9?e;uG(%dy;YjcKZe7;bDfv2C#+}ML!Jk%tIP#N*I}IO={zdsO zj%J=b^U0}?PLW{l+C6XMU2h|r@wQ0bmW-{1W>qVzSWNCvRn*uh`5>T8@92wVq?ivl zRgd39!TSg^N<$UJWyL!ze`(q0qAWBTrK8Y;vwx20^D#UN@hmv#fQ}1ycZ?4 zm0lPV#uy*jEAT6t`Chzr!k92zG?dUY)bqxN-1{r_{KqfG3lbAh(e!rMvEd2jvDTI? z(6*&zp`U?HXLDW7_t5$em3wfcuaVoWC}eS$Av=%{ec2`RL!NW<(K06tE1QmfDJLKp zif}>?U6w2lx#Q*|TSAe>PU)!UlB@mPk~LvnDd>LGXQpqA-KNr?M9JIN&js)bM*7n~ z11NrHGuO+-OxFyumXV}jJpK|E5PYV^U!0b;E`dlCv>m7)&@urcITXeE4AixOnedem zLAC`*CN6{^S%!ckFdLdZk8{XZf`P^G91}1H#pz3+O_|7qfkKt8VZ|b(bQgouafmji zqjL+YY$hHQ0s1-vq?MnEg;-0M=OHW?WhpwrRLI2106<`U3qbjQDHyp(!gHc?9`HTl z8yLBX4o?weiXw7kBF%I;8jj?x=q01MK-o>H=hn&a+&B?pHUgTY`Oe!Q8&(RUTl7N+ zi+LyLyV>yc6v>I8`V}ET&YMJtdpc|~gtjUVpSQ>(lef%aw8Gc(Hrz`l_Kfk_xxA+^ z2vdv{by1(D@HoN@^mZioR7p3PZmU$vQf{v zzm^iR)_TbbLdsySyzi|@I)82Bs%vjvyfypo?8<1?-y!)szJ6-?Nb>2N1F{N>x%2&| z+ilwYn|H?Ru|k)tar_CDrYE)0?!W{4!}{FJHHC?($q&<*k}` zYtjQN1DU!V*|MEd+0LY8-OV{69eG&8zxHvi3dy-OeKG57m7ENBR6>!IbbjXb-}qYk zTGrbpdE1tc=B)12v-hf6?^d;DtJhGYwW{iy&)j<9 z-4|AxSFV0P@$JN&k!;&uscr9vfrLkn$vybv9}Msbtv7Pb#_QjkXc6a zz-R87bVJtNF1d+tvJb4D$hm6nxf<@e8q(Llwe;T7>eJcAJyPSItgByg^=Dj6hd02= zvgC8B^(#t>d7GV)z+{tB_noyFQ*DgI+@Bum81FOwS)XbAG3%cV@3FM z7=+x|b+RoX`Km>h^+JYfqkFUR9)O7{7&}di;W;ps07&@Ft~lvT1r>z&2vjgIA^ubR zVo4`Kg1lpy>o5-qE`pKz}j%N3ql=hs=G)`n2CnTh%Ez1+Bqu|TT zo;A1k#&fCHR^nNAr{pGb(B5#znJeF#aVZ~Adv=l`DhbW}2AcVryyDg3nKJWBOMPZ@ z+;F7!rk~B)S|wX+M*V!b=By$3C~8l&XKnS8tv+L`&)M8y^UNONXL|6o|DtM` zhnUek)M)&;!bRterlDr*$IV7MZ{_K{tp?|x@PXlNdM1TP86*C`_i-5t0lFtWYGE#3wL;(k86;ADWM8fZ46q`fwM3}qX{W9 z6F7sm0Y(lqWuXlqO>-Ff1{7dg1Rx+V4TNr?O$jnoSyYC02hK&HT7Ygrt`UjGH>nky zpT5+oBI00#wV^SM>kNdtFLrmzD(u0*qAL5)p+ihKHFYJlFa=94W>nVxe0v*yw{-^E zkk!`lVh3xFCb6c?N0i#U)iy{%pwVb6wssa&M(8|jIs)ypq;-cHhUgmDw#)=(g0OBI zEZn%eyQmv48l?=E?xEi#ofm2H{{U8ucq`yyX;LaG znlfgjr+tUwk8yP$io}lK1coo$Ih%WViI8&qGizC@<^AUO=f5lbXe3j+D{JkQte_@% z^HF}yQFbs$4XV68MPhP68|c@a_yKY?%Z@~~%2%wMr}>~9Z8(Cxe{)D3K509lgt0TE#5 zfjrMI1Wu2S1a|Kl*b7riW=s^=t(a{=mk-lsi2vtjg0L%KX3k)4XJ><5u@HX2+(=N` zyhc`BjIs>Pgvbgzh6Tu`3sIYFLC(U2ARL*VnTPQKv!fQeWZV|(4g`kuS-1-<$yj}| zj0h5?D&Luv1wY>75ZVUjrs+u7{#Sw)) zCR7|VGYf&>1z2UU2L;YmM**ZmFs2l^78PN{#$*PAWTrp(G8+{bQN9-gJnfXtZ&*$f&-Hti-409bx7`bLDMgwl<(7)M2B zz%Ut=3F7flKPU=;!D-w$56GbY>E)X#)CD~`%b1XLYHwg=Kj51>jQMg% z8_3f^GdB53#l&Cf9}#!+;Bn~9MFdzE{*S0lY)uUBFmGb77mJHi8I^q5h9<>7!F7?q z+ShRcu-46ae9Pl&zNVG_tgl1zF*Y6Q52JZY(v$;uGQj4;aAR*Oo*qt*q(^QpWSnjI z+-2#?i2N<*AziCzTQ#jdwJNTj{lJl}=#wh?V2f(=yzPF=4QYwWQ4mw%EL%SL2$=VO zp?|ly@Nb5B!6iVvgaHChivW0(FdRV58!iYX@t7MAK*tin9TN&0$-=P|+9AiJhow5m zX)b}B1vZ^X7{FZ9BOoVApsz;O*YgZAT7oZu>v)nT0h?L`vI3w6I_3F?r4tsv3bdpp z%%&JX6%4SLG1V+U9r%`DKsLr^cAA=1DFhBGE0bAa%5%EC?Lstqu!*hf3*p$MrcMAJ z@n93+^)=W;sY{erHBrv(LI=SBYJlCH>~Yx%6^Oy)DkQWE-E5AwcgU1E$Pctgi(6^4 zt)nx*ZcBNE8-sa~mpkYyEM7oMT#7`MVIjkZiG9!rz1j(T$o^Q zCNC@n<}hNZ1gH@;?aFp_T)WggWfrZ0J>%CLF0_X zfihyAs2VmAWdl-LyL7K2b)(0)M67AMOR^UQC8`)#X4*k^v1XZ33)4@qxy^9w1T$QL zkIf4Y_!sci1S@>LX`(#^9Y}+O1*Nk zCVg&Y_wDC0WnK8(W$9|O{4M7pg>^)kKNUDV(!B2Be9##1_7OfES{Yt>YGwF# zcy)mMP8xdQD{|}Ly9ZbNs)_%-ih;Wo19#>>oX%DZOBKTz*D%(@@`;U@voL#iqo*?F zOu)SE#WLavE+bDq2tyWy*9`xZGyKCZE~_R{44(F|8KO1mXHF5pzzB0Id?G07sif)4 zgT+g#)C@07(W!tYCU3+TqtNtkuK=EuSHb`eNFu}Z<-Aj_#+(=P7NreZFa;u~f&n2W zJdrQM;Zgh)CCI*&$t&^NJX}T9^6~rSmBfR=*b+(7l56hx&Vi&eHGcDW))vUv0{5N% z0wcC5U}!?KC6*Pi4A(DCEI5Aglj2a0sKX`GrkjuLqlOY=2)I z2Cclfs6_dog#H6py?K4pSFCS%NPTk&w@l8S1w{+Sr*M>tr$D=YrE-gCAz}RLWid4^ zi!^pWv_riaOoroXS|SRf$Q6or`Fw8-AJ-vL4lwXsX zn!{Q5Bq9RX35r^b5z`O)ZcZ~r;lVE+a<^L&!G-$x$p43 z-ThW~x;pFFCONi!ZZ_DP){Q2!Wg}c6Zj2Dc7sLk=HMfEv8;?>W6*7y{QhA$mku)$x z;~LZ`;r5n{O9t?+Fl2|*GnuacE=<@hU!^T7C&m&M7=_zlxMJB{zP7>G+n%rsHieQr zh}x!vT}x$de&<9fgu?yMj*;Mso_qa@^=%1T!USU*8utx{e#{u7Tr0m!+$iPmY}JOghi zvBQzK$X(1^nA9tlcPYJK!69JALid92xcn^>Js!q0GuKGgqM2RH8^OQI1gsZ#2wk6w zUYLS+7GiJ2$gGQXoh7nqOPwNK(%w(y-2Qiz=Rxnp{u(EY#`RRb{lZ%>q?@zu2Fcy9 zJf5rHwzBQ^zHc3V?{K!hQ>yP=y>RELJE!lQ{@`+|74AdjmCMI-RrSjg_sd{VY%{~P z8A;Nt6Ly1cB`=q*Ty4XODOHsm$u%^8>+*Y-S1Z05y&X-S%6S`Bn(lhH!-G2Kug`4h zOiv+^{9X6_eRutRcP6s_5y?N2GUjTwrlWWGEK$sT_((N-?$r$5tr`6AP`2g?spg54 zIoH;iJf1dw%l@AIo6g(LtZVz1IcIgcKI7b;F>T)nENH?qU_oO4-ws&F5fyY|^M_b< z2(T->%8B(PkT0^44_V+QJ@EibSaX6$ZG!-7GQp~x+hhw_ET1KH`KWkCw^)vzJ^N(f zC=2kx=tDhXmnUUxP)qD@g4j19-BreGQJu(Lv}z}SlVn7?XlQF9AG+)DMaQu-r@Hp; z?cdkcyXXV@ogq7Zthb)av1sIhc|LxjYcGTmvv>g_%}DWoK>{wos`O6GQRe@OBt~xv zb6cL-wOT|b(-Ufq&rq(8CiXH;7#C1ke{27{`_r$<{?p4R?mIDGc{8(#ihow$e`h9J zKO)tSWKA{8CsM8Vt-jQF##)CDjImN-$s4%mZN2MlU762%yCiQ{#@2Norc+yBx=+^o z-uh(XzO^>}LdM#G&wZ~yd2QXy*>>QEJn7Jz!ePQ$GycC=N1}L)@I_8-*^%JJAb)t3 z%zF&KgCHhkDPiEWQ|)r0Jp?W(G_0RGf&mmSaNrN|FCX9ti8I^^)1il$ZkDsH zHklM3mWGGbBiF4DEP95B)wQT~=^5xB2Ho{%;*cE7Lj6O|9*`1%dIOv#?~d*X#-l?~ zZjn7X*yvHP7&8EBkjNgJI?;(OL=&-m6=nidI-nk*@d?hz&59zKmUfu)Hnr_MkKj4V zMMM+2G#|MFSC6YPA{aCfvjKA(y@PcSHBSW89GpfFiYOAM4DmmscpptJ0vWOa5Xcyt z{f)(pwKi8lhBF&K5QQf#_dNr@cR}*(Snd5_FzXqRJOdwwGoGVa&r!*9boofG4DO0X zGr2XGs{ljYm2bcF)=TNJth-5aHzf@@C;1!Ls{nPAN9pg&oZa_!!&?n$yKJBM6dn5!BROjY95mC3)mQE|?#eXoBKO&WcV4~uDnyPB_cx5G@pqgzouFwmj{2OZGIb{1 zx3VQ$-<7HAl04lRoASxooXG@qB}pS-hts34hpL5-{0=qmgDVidgUJ2+G1E-VtYL@| zJAeQcJ4)U*-jBE+wu(;mI?V`;WqXOO;wDyvh^+^vSYyhiX{p3)OCM9;n7 zgeTa+?p&_^Vlkl{oolBi~gS-rp5n5#it~MR5)1ZmsP5fSv)}xtUv=jJ{1Sy zQ7D58jUWurNiAMzhQwA%-Lvp+5fr6NZ+AdJpt8_Nxhq4ij0)Y|4GT$FSg~%9&Q^)& z6QE3`Ppky?<#@5^Vc)G{keK*?B3HlQ8CkLE zP>6qv!U!hF#fU-ydtCEq_ISM)k~SS|aYHtX$^ynV|@?_0g_Is>hYct%}o z6@G}57gpNk06rPlPJ}gLVq(zJyj@OmuKIhfrn|1DmAzS4r{wC)s2{Qw?IO!ho6%gm z<}FY4-rSeIw7QV-?#p`jN#1=K+df!&GVv$HNixex&g;9ekg?UsA3_ckE-6Mt$xkbX z?A*up#-W|Yk9Y8t_V|Y_+$WZ@;X30dwLH?r;i2J?(XsI(M~^*m{KUzLQ%^p1`pnsL zPe1eQbCbdI(?aON#Y^GKS7v4-(YaT|SbYBKwd)IuyLxx`?dczQZ129V?y1*wHrE7o zXw81{|1s$G)me5eNd&PUK|$px^_bCa(k>kG%Rb!M=I? zx6-!+^3bukdM?rh!=NCO0xSd&zk)1F)hsnm5Hqa_2F{&62Ia6Co)Xd1ATWou3WIwD zN@X~xgb#uI@G8-pfR$=N1b3R530;I9i=Zi4^bDODId)7Ibt)DQ%}uU|NRoWcRhHUz z<7n!s)GMhoH%=z`HHuF0=D>}C)KhQmPwr3merw-*`@XsVHqHU;+$Z?8%If!x>7lgv zO~-A=JEv}*O7STkF3C_2^SG={*ZhIZwkJLcB9T8?|8dEGJmWhKaD}o2^Z;4QzA=&U zHsO=2-;$nRdFuA{Resg5YPg+1xRI1O6@15*vfZ!mkguf=r4JP{t6S3jD`mI$rd~_E zmK;lMdlMuzXzaHid+V`O|C@(y93qbqT67t3Y+Vg;Izyg-AV! zSwUVL7*F-k!l+WZIl-4IB^bq0pt~5wLMvU<9?{UHwKh;OADj-!rfJL=PWFz)Qc+0` zis_@;JVDSELwr+xLHrV<^A|4>Z>CI~9;O`*OfO6`{|&anU@JDy4DPT1VTQq4Wd>|y zO$M$BR!>;E5WCA(Tq?Ds7)2H6k;-k&+gn=O+BRI_fdoBJUQ_f`E>RokjDTh%F5b!PfTGv2YRcTDn*Wo%JKjwL)y5KAh zTxV#K%q<>4gf@pR`N}VaYZu)aaZMlodNFrL;TB!VnJonPEVcgZquG< zQJ>BuqeS$jzgNjGyq_Nu*ky;V_vYWOH>DDfhmT9byoe`b5?&{gShpka2+Mq;jW*o9& z*^lKbw6kkhH*1MCr6NFbZD1LThJz<$nfUMGMIfLtvDNd_@w|n?5l>&i@96XuL<+GZ z#8`X^5}t^R@jOBlZl3}LIGGK`t}r}@>IO*8jmXPe!gEkGLtcX)?8J0F4CF>XsXRMj zMzBOWDo-ej18d~T)?sRN~{kl29t_5)hc-$rSso%U4Tco9DNera3pou=%zera2O z);%D(2kyKgx%WZvU0HqW*t^Hl)9*~&ocQ`lcygXyL!H_5=yzMCrrm#Z=+owpgpWIZ z(UI*tA@!ZeHl383PG&t5l4s&CUXeUcEg#Vqzw=nOX}{F8KkGRlc@BK|l;k=5QCrq? z3^E^AdFq+0Ys*U8>XB?y-(BaPjA_qC_MS8jY~|13gb)o`EG9S#0=I~KfrW!x1g_Fs ziWk?SmXs~R1Zay&;zH_I8RoQk@#`b9Js|>xW8`JNwCDPDikt?;EKT3**ROYL{!3;r zCOoSMkWdOey4Tp|F=K|yiMvu)d zSULtp1omeEXr`|qii3&Gt$Ji>Z5YUfk@+!lAJUv43XI8!UH)`g`uxhCZ-&3wu-cog z>C8Gimq*u}Ws%1K^hN{$T=1!2k6o+3%aJlb2_&N7(a#QuI`yq zR*Tq*DnF;;7?y_v{AAUd%_G@r(zUW;He+kX2e=J>$2>_X)g(uOVw3a4MOFcg-FJGE zdl=pHdSx|t%h6)|4&S181}xA`6S(VF*SZL*^TL}LRvKjG0KbTyZ#+s>yjnD&pXf^T za9U={Q5b&sz^cO!X{bS#WX4D`YP!N+7c?^{qv!65MkimnZ<<&t`o3XmRBYh>qP?bZ2gUk0h(Ym=4S!4&G3?l#AQ~67L)AnRx%L{d5nd&kvX)`yUBl(vC*_Xefbo+?9;uEFq~$~Pz933f)gKA`JPGX$VmIkM)T4+2 zHeVv8aEJoaZ(cva5u;Dx_EllM*px6XdmmQ%Ak+3Fj1Rj`t*JU8gnToIjcCpDu+j&) zi1*QLsf!e`ivJR!%h^=d1aXGdxIDcBZOCP=-fe`t$V+xU)FvaIGvv4fE1aw0=zL7J zGw%#6ghMkzC!?{je8{RP21S)@f}}4CT>~yqfK#>tX|er=9w=)K2JT8fh=n4P^Ui<} zB~x2$v~h6)VEqh6OC;pa^rW&DOnwTHIfJ;_V@yHfK_NTx_UMct8@HEO|2WA*Na>W= zgX!}hXodY04J(=~A6HekQkki2Sw5MwLTqR-x2#qAZ$5Er;@t^IA1gbh%Fd)c*SP)n z4CGdxwQX59Sk1j~6;GP!?>>2zo9w+gZw&?Zq^jxbnaXzgbH8oZHw-r&>AhLs_6++_ z+)lW!BKb0T@L@Ie)plik$|vST$3HX;HE|y|H4mHhtE50P{RJM8Xr?zvv4mih34Ym$ z0EYnEdO)kEoi?ltXhDms3Et}_SXuMpUkTgraKj;3V6THKMNVZ!gSLvrVdsrk z@k9K}$A;jTyjFCm?T5aecp$+;w7D07d}w5pqtx0*tkrW}#iv3^U2jDrbkBIs8#}c3 zOsM`Z>eYRb)7tCckW7~giX_nut0cQNhXjXMQ``O+DS9A4^ax01i6e=!9r?t z^-)R5!ZY;8E7TDIISJRxz-h7#Id>Bkx2L>qvT{l)gQfjckb+2n%-p`<{j zjwPEmtTU*0{ORxih%iDn3ZMz}?f`msE}me(Mb%Ql;}LL1glmp!<|qffXA$nn>>8Go zfFln>>N;^2kux+#Uwj)0)*i{c+*dS0nkIn zyczM8VR6NaYv{L@;XI%+H?t$#ehw`JXHtn5fEBZo z!wyt=8+(snVDcX7fgA7tK0&EH>)>etB_VBTKey{^xv8OaCf%lkkoSMUd!m+meG&SWLu6&EyqwKTX9;dIGwb8=7a^o z?Za8;PRY4*oh!Eoa$B&!h}DfipGZ=+wTi$>jl7))jO)q*YtT=>oveBqPz^`$)bYtRD|bpuJtl&h${dH7z%&b!5}Dqy}+7P#}$ zz5Ww-`%nDE*=+x5ssA*~)Z7+DU|sB}N=?EL!rm>}yVp6h8G27jKyBBrRc%{o{Z3D| zYPVFiJ2{>l$1W?i?_)?ZUW^BCXDU)TL6}e~kQ~Q@+UrR#U@tU9?R`$kuZqn-?2Kw| zcFn`t5F|%67Q65CCHrFom|DLm=f^6Hzo@Jn?J)eJot<~ojG4@z@&@FyNZaO5O-4Ge zFpX7PKds}D>L_`FxI__rF^WVl(S?|wN0=zg$0GG0!nPPOb2K!B9zp^?7#4>#_#qHv zrhQ}yqoqVuh^H5~6x?xsz_S$yfJ5s-q<9)QFRV-*(^f&iQfZrkS3pv69M$#`oM}f@ z$lF|;ZEO0>>fVfXPu99evQj8k^A^N@P1-;6*1nmzk$}aNEcGJ5rXB?f&Vu$JCgA7z z-{coe98eKgEq6bRGDE4tC_b!AY5XAly8!j4X+yT1*4~>bPqifwva#4Rx+)khnwAiu z0d{g^Dej|fvY2_N18P-`IA96PK7xvuB|rl}9`~a&h;0B*A2{{0O>Dr*GiC=tkl9W( ziixF$lV^s*6w7)LyC`52KLoWtA0ks|wW?y~!X}PlQmssp!N8E#I27|J1~E1T48UF0 zQ_`Fg9A>g?xl`CgPBxpK$QvOAUo;N(^ekF%hHoHk!X6@-Dlv8jQexIOtJB6emu@UkAUv;Rt;tveIj{fiSKoRyz4!Lv)gwPX{)fjuG-o>xNu7tX-oujj zaK?5RV9Z{2!<%l&+8S5dB>+ZSU(V*c;YE_#D^+aI+O|{ZEW5efvit-oRm+yga#e_c zY{dQulz@S9R;H~PXCpqj%KG#%sj?NGs;;u+*t(f>1rVgzRi--o6(%aWUsw`?vLtBF zkO*5Auxdg9`B*Y)fkdf_qi8&esmE_ldX-LoOwNZWh4dhZ)Fa}wj{Ptu%%%Fu*l8UL zvPlURyHoq*>Z2ic=ffNgu>T%LrN~C<7wi(86huGRh5~C+Xc8xAwZz$0iQj1suA)(< z*MT>{r6{6-AwZbAgOtWUNtTQUAs>+UN}*K&9q5Jd#d&$754OC*kvZDuBuZk0=nTXS zi1LXQORJIOb1Y1!O1mpo3(Px;X;Wc+TG+FSwML=C(89#2sV7gLdiFVLm!xcS3TV*X zKBn>jGB{AWNfv8zf3cvSgf$tWk_bxHKLk8bzzeiQpxb~q1_Q%TCWW99gS{={yU;+W zJPn?PmDAxa`I$;A+X|>_LZ%(Z@XACA;E2ef3~w=jbBuCl@v`$Kij68`H^NnU2gD*U zTM8ncMu(lY$zwwzK0(*)g}%y7u~vve%{wEZYbwsmdrOhvNfgl8mT?2gbb9LJ?wVla}$%}WIpdxaV-Pnofn<|wFBMj)L6eu;A^|nghR=}_F+FPCP zcD~bnvm5@dR`R$o@BXXW?$y|b&r(pZ+Ht9NoMo=nb*)Z+cr;TtmaQ9;>c$Xr-q(1~ z*L>I4yfVIe>R#vJyPbzW0?-?mI>)oVBa-h3iFME-Z{MABRV$Wg1FQX6SFhxvt;upl z|Jes#In+d#GKMi7<3kIY{=cC2L4tpnEa~KpkPSeP4Jzgon|v~tiy1D7pWQNtRxd!~neE>-f_0hUH2#Q`F29Yet;JTUnsDQiH-W z)~LuhoACL@^YVAb)Fjg^C{Q>ExUeTYffGGNrv=G+psCgS$hy7TC7=vrVp`lMFG$6D zLLK04JR(%Cu)~OTZ?ZcptFvg_(X(UGaU~R*>w<*+Y6z`4&f#IZhG@(dy+dp#)~+#S zC)T`0&d57PqLGLkj|o!9COi`xn0z(N|Ax+;I6E~oGBWn$*{QLKkyE3`CXO&pm5qvw ziM{H`s;(JR7}nQmSa+i>kcL2Xji1$ZX6w48y6&~c0eArA>RN$2?G6y*cE{&NtBYI? zU9!ueJm6@fa1;jI0MbzomIaaujt(n@BHEME096$JB?cU-C##DX5}{>E{JcS`{m-;p z4eb7K$BhTs5$Z7yGn2rMHf-N7!r;mQ9TV+q0_(pe?0KUT5J7~tq88JAmpTB3d0<@g z!+N5}hv+%mNeB3I^PZQ8Az8m|OR{QG-*2XW0$I9C6}x}c@rKcaZSyB9eKX9i@VSRk z9i_X|V1t!^&B7Vj7yo4eYEVoiLaRV(v~l%JIC4daDaSuTNAcO4(vD}cH+&;28KLlJi|VV<^zXNfVmxZn3<~-^AcuO6|&;(XQ%~1 z3R4T1>5*f3w_+tu`T=Z?VuZ3l#%1JHMS<}mSH%B~ZpMUWn}|)y*$AqUL0F?=2z^S? zN*=-q0Hlv|dzZ)VSJo|`yzeS|`}kYO)9$RRRdTh0`eo?DTt%v4*Jo_=QOk;1#$D^2 zj~IU>@OywJuPIlz^;;e9b*zkF-;%nWQr*rsk0(b`{*+%;;9)Nk9`3)Cpln)9`I95` zNBn;iaq$)kyb-&#@a_U+B-J~l>K%|8Bu$Wk$l)a-k=@!QZS8u;fh|+crOv4qikclk*d{3028H$sk#E`E_v7dP@c9q7X1k6^T}P6m zsft^*@7AUdX3ILHvW~24N5-||zRmr%>n&I6Y}QsM+3GUv1KhfNf++(3xOT{A_}J$e z+GhSZz$5*nqGq_$^hu{79dhHR!JFkjP>bi_qI|y zn+H44#-`T8IuZoHF`7LG`a=6v!-G=!-O2hzJ=6GOYOSLS^&oObStomn-&EGc?xEU+ z@7QF#G@dAhJGj+5Xf3a``*9XZdK3pb?_!mX5Ku{+iC@xqE?UT=vTwI|5i?-X&fF`z zV&RKy!pIkU2V|SAe^13(iQa)OY&1Y1zVLe{B%k)}#-+mPOb9m1{|V*tuHjQBr_P-n z@7q0fVodvMcr0&IuI(-4_YP=F;n(n(*p3e7%~O$iY_y1t*mI>R)1|b<> zHgI`6U1oL$dc#d+M;3A=ox-Dv^Jw!=F%@G*oB$|!I8S-1Db<^5y74TiW~=)ftx|c* zcdtrqgPF4Z87qBq-s@kSP&F=DwE3owifVWST*f#&`lt(M)$vdC}}7oE(RbUXG7Pd}Y9!L^lkIx?Df0QHtvvHdFctoX451jBuZxMX!> zEtJ*MnR7Wol3&wj*d6R@`szx2_4J*p4{aI$P}VstIfpZ*;f+*2K{hsP{}3m?Vb<~` z)?s{+n%Cn9Ekg!3YHFVy`cfBQ(I2UWx>uuaj*}_2auk%j;5xK4e1eSi42!R-vy{ZH zqyl5R4C0L`Zt##1&BDPL85AN~-n@mTXd!f?9Kb?}OhF7PDcm~AXdkw%rLHOMKn9)o zmjf+AYR@P~N+4WiLJ)G`fnZf>2dXrsA-0*G_yAYI=rNfIn}G|cst37cB=M&yDLV?{ zvBYH*`jY06fa>x*^2>X{A;gQxXs%iFRi`bty;)zoBqNM<(7*F4 zX1lId0Q(RY5Fc3lM|kfxEKRomER&H`)PDW=@@TSU%~YFiUD>|MXH7dK(~gX3hn&*_ zn%=ZiGVRQ$A9=0QyHXEYTkPG9qWO}w&TF@b&~w?MM=M6rdiG)e*`vDm&T9jFZD>Wa z&P!Tp(aN>St4dRXrp7+1mL-#} zA26SR7|lk#dA~$#^g1>n#ay*dEV_@%K|ttb2ig~{9kRH3u^EA&!6cuTchaNCJAfX9 zL|Lq_PKHP23G_N%3!55?XH@^Tjq{qq-AH+r^2q=OMiu-X2-k0WU-YHk7AUE;6U-`l2CqD`o$tr8)@I4typG^Dj-G1%41(8u*){JyXIgm^Psa&5O@4&Pa=LWxsV9L@KnBYRg%Q ziD?o&gn$#T(c~Z)Dn}V*7}Y3S!60lGg4)DoO3o_dPNpPaL>^IVEP9Pd-b3Q6NMa z<7+4}cg5Q;zV#v^Oz?8xkd@t%yLEZINNzoS=iG3kBCBK(A?#TR_%`b&t&mpnpKD zkT3-@VpA?grD#VR0;Px_gZ+Rg^gKl-ghDNh+L&7O%EhNJq!Ww#hp<&2?NuCzPEXH^ zWHt=77Ztt+&_vBE^8LX1sIb5^^@Vm8cb);&U`mXDAt@gt<5{ha+QbA;vZ-lOt999eU&~h=6=$X6=s~pYrbl+DX<6MJU(IcHqeSRrS!w(A4m`iO~~dQ%??^J(_o``A?oYefEsZ0Pm$H zU&0W87nuphiH;RVDDMeMUZ!N3k~b-NA4%S$ypq{q1QK{r-k0sibonQgkYIyFC6^;P ze@Z|9oRTahEX3GnboQSq`7f0GEt0$)!u>@!G-F$InCvR9#pGeZ3>jsou~z!IgA%fx z7e^==r-W=wm?D>{$3)U{F#$QkSdmICBt|J`j*?d>AvqOezZvhu2x*!AAkfcNQi&$* zf$hL-RG6O$9TLBTBKUBzZvadKr}I2Emg7wzKalu1-m~nczZ_SVQ9n7(zRdnMJ7J}% zeBs2g%>HtmcbWZZPCU!(FUK`!^q>3OuFPhi`&>mv|H*ONGx`sfJ#PT@@%KtxR;u=2 zFTn^7X1IOY&$_`z_xOiM$~nFx!?kNa>xRGIK(O(1aeQZn+o}EB_cSd#@7HcmSKY4v z=GNO=Go1f^ZT-r0##R;Wv&ZpGnQ6X723C`1fZ0dnNzg%)TcO zc_C{$A(>79($*UQY3mIct{OzC$@<2D)MIyzbs1ybx}}Ny0t?Ae-fr$$=L$)Ug+~Ol zLQ;O1?_1{z$*5s~F6$GKH}RmB3yG(RufrYG1O^%gmxNyiI}gy0-NT;jtfL zAsMLS5%#Z;9N5Bxcq$~1^NsYokc{(w9%3$ivfD*X6p{uTzl$b@lKA~R^wfo9x1VpJ zpGtzCs9Q*Od#L$B(q!ea|4JdL+|I*Wt&lv)bLI7^+MJ1ST{*pha>KG`-BCqDQAl=G z@crvtA?b9{&q9LE;%6c8+jtmt6cT?G{VXKA)R8Ucdtrdg_ZCN%a(3*a&KHvFyq$Wl zPim^EOd;7*Lyxad1}r?-Dt%J!q(LksTbihqLUICb8eX=o%*Cv&L9#V0n{#$gs_f0$ zWlP~?-LjP)rjR_&*YP9ZzBK8en@SXtfQ`pqoQ1^idVQP`Y9lD5KFIy8efFL?*)X^L z`v3m_@4Mfh11IaO-(Gv|z1Lp*c}}u7d3+^l4u>MHbme*_$tg-P4`}_KkRYs3ISW5O zr(DcrGm=3kJr(9!kf2Jo#ZwxY^q6n)GX3C77A~kg9!sy8$CGFd*Dt6&-ULKhV_5Ol z{L6SctXljiry^b&V2anw<2Cbmf+{3H7pGYkr%)d0?%}vhi@BVjay*mAlj$@bPf$vO zt`%n(P9y9@%H#r5k~S9e>k^i=(-=Qd|}qqm+$$(ldYwXl@BeYs0(o~ z!(BoQu4{3VOI(Hf^SHl&TU=B{8gA~Y489mY^VpO1V-CpqHl7~6xUc4z$UkS5i}(ZO z!-M-8+%s^O;x5MR!#xf6CAe?EeID*5xEJG|g_{a7ANO3`bX{hV#Lo-xvYk_Zhe+ z;TBge9-O$ZzEL5f}cuH06I=3zZ3>LmHd^!PbJ@&0{?D`{G6FW zzCDF~{K)62@^em#a(y`kek1Tx<$ps8`!7pTzx^rfc3}$rW(qy;rAW6fg`PjAsF#Wq z`0rBS&!)gLQrPY86y^O>iu%n+QLge7dag%)PE{{QQq=n=DfC~SqMiPGigIZw?ELE# z`8<-sZXc$oU#M4{xaI5XDfGOULeG;aR_f+{=lR`e00{?D`eBPKMpM@##t5VqE z4=L~$Qs|-iiW9edy_cfA8&lZrx)kMYOOYR%uU#f5N*MH<%FaJQ{?Eb8&Pg3Ru3gYe z*OR!XUBuA!;1q9s@v2v$@m72cJl71jQLe_dTm&>vV?y0E^f(Z8~C zZN1+LJ9S7!RcmEMO3m2c=|Xg&SHbN-C=;u+-mxFh4ym zUHeb|s-VSHl(khXf!K;*AXF7ZV0mL*RZ}&hK@Y$>XsQWT_yd8aKnsFBtyL9ES9pje zE)b|#;SX{-r08p^tgcv8-_~49=`ZpJZ499dTDYL8HIY3_xFr~<_cwC=t19b5etQxn zO@W5WAgl(1RozihReMK8O=Vp@7hmkBd|3HG?oiOCz&K=OTXRAknW40@zP_nSWN=|^ zWuU^_SnX$dqAV}=2O6o|u#GFQuA;0m(BfYiYOeQJtbn0cD#&bALo+Y_(yFRZAmFbi z>52uRy83FCeJ%0w+*G^FivD_Phva~$EM%3t0t;`jDy*!nq`s*#SV2Av2_hBVmKCA3K?`7Q-qpfd zd|BI)P{Uey!NOX9)g6$wqPkk#O(E(^kOgu=)ByaUrEXm#jEz#E0}1+Dlp3pZpeDVf z$!bJUL3LVDQP)tp4z{VG4x+TFI)tXMFyKeDnMnXuL#776GP&GeSedD-18o(n{DBrYJ0jTo9NyN;+7>i5)hBzi`nt80K`Ql(mZlkBQUFw0Pm6rs1q&-? z&M26rh{xp9%o(((!b-{dhn0Mae`#3FrwTh6AFn4via9>?NLu5A19@=U=6nx7 z_$@5&GL$78n_5?g>nWD-r#Y@k_;VcZl<=20-Ywz7oEKD->oqQK zO7bHW3cH*?u&9uKhs)-ne1z9mmxO=J<+~+3 z#^qxYo))mu9gy&DE^kWsL@qxf;q6>L`%z1uuunFZ&ynyoT)t4kFW~aU5?;*ZyCwYF z%~pCn5+0+?CR{NIzn#kuNI2U}f&8$9Z{qT%gb#a|dPVu6MMZfp;rY*!@HIDCa!v`q zip%Fpc>67ue6fVj=JJ|^x39M3*GPCVm#>v@rOJ};mGH$}eo(@*xqo&(X2lcb74^|2 z;i8>rkB^rxjYLC&yPy_$^#dt%Tpf z@m2{BbG%c+AL4kIgg?&l9tnS%oI@E-2Zg%bV~F0V=W z9*(b;@RvAVE8%Z*yj8+K(cj(Hr*@m2|cg5#YM{v5}Z)b_el7M9PgFz zW^RW837^<%*=tC`FXgx?;YA!DmGI>p&w66K{cAX$BjKBQesU$em*ZXExAaT^Im3En zKf7&smJRQ*;r9LBZ8m(WO}^KL=h*O=4Zqli57_XlZ1|uJzuJZm*>HOAE3RQ1K1YC{ zrVZC@_=pWJwc(>Syv&AoZnYS)nZt%}w&7_uyvv5C+wg81jxE;2)nmgm6R4tWv*A={ z;_9{G69otwv*Bmj@BtfsmJJ`Y;r4gQLpFSpO@7#hi+9izY}#6|!!NVpwKn{68{TZgr`hmU8$R8Jx7+Y5YPb8Yy18=h~&i*0zJ4R_h_VjI4|hHEx_p$#vy;cgqg+J<{<_!=8tV#8}~_#zwL zY{R`ayw!%^V8h#O_+lI0X~TUse6tN-V#7~Ap0>bg3!JvVX$zdTz-bHo@3p{D^^%XZ z@Zl`Y$lTY2&zU2!VA|NA7T%M!n-ywo_VNZr8JoTmKh;Z%6_T%|kocQpV`DX&8BYtw z_<3vc<}{E zo;D=nGm|_m^x~H#d0ODb&q?x^5TBOhFD3rSXNmGViGMT6(*iDjAj#9hExs$s(}FGj zizH7AwfLh+o)&2Fhmt%k%;NVZd0LRg14*71V)3;}o)%#744TH*_mJZ-SVXC`@C zn8hzk^0Xj}pOfTi<0YP!Bu@*d_<|%)8%FV&NuCx`@yn7t zEuiA(Bzamm#nY1feBzIMk|=*M@oy%1S|G&_B>1uE-?~FlYSc@y;GzCuZ2Bd2p~$ z|C+?Fm-t4BuaWrMC4QB}FOm2XiN9Xrza;T9B>oDCzeM8Cm-xvNKSAP8tdr_r;@_9} zcO?EbiGM}nUzGU06925k?~wSPOZ<-{{t=1)mc&0G@%Ksm*Cc+u#5YQOjl|zB@v9_$ ziNu#k{Phz5C5fLQ@mEOvB@%yrg4d$+ejUKPBbxaOB1NOY^Dq@TQDaR-CXNlOm$svK zQFe0*d7a76rY{e)yc3!}qV>H$U+Wu9*BpDb{U?G`p84@oJS{&w(e&6xK-7_$f+nOTj|e{bgJA?LUaaTDoN{P+e0^86658H=(t zqtzLIox04L8S14Sl;y;H$qH}pCg`cwi{iZy6Eey8B0MMFl{y^B6l>vrr`9(%A>Ir* zDL%prMYwkS^?2#{99i=U(?M`__Ei{7DfCeuYD*01Q`uZM zx>mW$T`Rr%rz^C34)>s5G{cjvZ)rxoYI;N?Vt8`!SZqBy@mOd*=Hf9QkJXxyF+G=} z>YjmuSZO4tcASlgtrqokY5Lvmo`PeZfqu?W8Am61$%e$YYnYvbW z(40-xYk0PKtNy^ks8Ik(~R<7x4P8Ss#rm^^xL{M9e2@gP4Cl()Y3lP z3aDcF)Ev9Cq9gi#O)u~DR=uJwc~MLE^jNxjko6HgO8ULwJvrvhe?>xJPp1RvcWOn< z9%=`*C}TTSkjuDrT81lnqtj)$r=1-+rbdP_Q*{iId9uU1$sQ-$XD>2456m(}SZR7T*sGQcj;lA%-yRjW;30u&UZBmL8#m)g2`c%KML~ z3_-OcOmwXpIfnQKld$q)rI)vhJ96GYoLtlj%iDznm)TgW5XXn&a{+pdUrp8^FUil_rRf7&pE+N13|P9g{iEnV&|!{FfOcBcjZfKYbTB=dQH-85A^0j~l$lFp z(XEd_LElNZO#!;ngn}*zCfmE!8=x0RHvIT*_}^UoGRdYHbL-WPpP?+USmb4(mO&Rp zr{?N|edeW(!TqC_S>umE>)aN#<9nd-pFq^Dk3z!j7~MaLv{A_T>p;0V<1aCZpHYp( z>nP_o)939<*z+(;lceM#OUhw@7-Y@!KN6Yb`8pfQ6Z3sO9_A+c{|b0}qW?$Buyx7F z{@AO3=2}^*zkreFC`O*u<2qQ)D9P65Oqu~rKBF~T?RbnDoROJHs-v?{V1-0|{?9)o z$M9qwYkvaa5c@U=01O|oP1m3jHltIawr+LZYUDWD6gE3n`}C1$Sdj)6MWPm_pB(hLWotw@4Z2_z3mo(?^Z+?0yfK5(CseG@A)NJ=9gIzaJiU z^u0Ny)AMbNf_=kNC+@ zk$u54+wcCi63mDk2+i^ui_7|pY4b*L>HFP!>r`FKLSC}Mp2r-*Wg@gM~-+P}ptA0wo^$qEY%7hR1EuWn)^^0WCUpxfVTpP{Y^+v{&o< zc!FbD7Gv2X<vxZa*Q-$U-GpRe~=Eh$F zYS|s*);`p1JRg~(c@N~KTXIj$t&KmCkdyQtdP)XfG?$?;Z2wNQK`mNJvw)bZ+!rnF z^+i41u9a*as2@ig%f+q<+GTC^_=ykPxa$^#^m{f_c|fTqFwS{;$!WlMGrr$L11g1Y zBU*;Qo-z!82T`jx-A+zQ^Aw-a&~3H5(#W5KIY_n-n>RlFFKD~wATk_@xzsIt*_d&pd*?b=2)Mz62P^p&7=R7o;zH9Z%r-L zO?qzkOnk$wA1TwU$&C3RJQ`ysn>dB{IQ88c+!2%9-2Tj|`x8HGAz2QR10T-^6NdTeCELcw~>9?T%U`X1Ef3COd$+yZTo z=qZi7rFKx3(JHeRM>DFmXvVI{K{aweVS1mIw?F(wR&dJIH(TwtXfQaHjcWvicjaGw z^9Z`$&yu(Q5B1)z`FSeHFwG4NyBq zQ8C-ewYmm3oZ+BV|LGSY*&IsqqeEZExKMEL(0%5&k*ICGm2AJ!)li^Cx0HcUD`pcn zUo=8`sV(1gco21=={tweQE0~JU%Qbws{gxl6~$inSkh?G$cH4RZ)FRj{zx{oz)Yy^ zNDhDOj~s>w2c5}qN|2-Z$w!(`a+GGC^w=L6;R^a$YJ{ONF_b9jBuer`DLJB~iYR4` zyzXJLe|S$ZbtF9)12lt0)r_5#6)dv45mAry;3spn??FbmT05T6XkdlaS8`X|V^+b& z)C;U<%C=MVVs*z}{R90--*9%{d)b|bI|nBrw_`fGqljhD)@<`2GSVLzfH--*+t^8u zK7(Z#6+(tXr@$;~Y$4lV8g512$!hIJ*GltU^zg{?AY!_1aouKqnVgI=L%*HxHnxxv z3Sw>@I}bZag$K)pEwR2gr=mBS(l?y$n)ve5EcJ=QdgP}NCSN@l%op7ZgzT+YITqFNDThain%^HmG<0s8+?kZtUkQU6M0LI z-o*k5Rv+%mdR~nTQ6CWANtKK|JP(d)YXNd*FmGXF$N`!W8e6H}-TL+p5KqBDkA5ON zkfBGqzzW~dw>C4bHT%%|8Vr<)rl1-BOj7}Ode0t^qiPe|ckmSb1&`ZkIMIx4)D?SF z-)HXh?ifRu>#2D=n~_~l(K}d7Z}zB5KlFxoJJh^TyB6M^<4#{Z;!a;N>Mh!>hVMe| zjfEM;bv}J-FY;k*p}b-LBnIM%Ry&-=!n57_mKVUf`aYfDiPon%%^mL&_t^xrB?^G! zlXxWNGnf*6m)db1GNAXn4OVosoLZoOiF^t+c2clekCgFDW;M(3jQ+ok`hPYqY)I~-p+B;E5m-fuZ%2T!<#UwB z1Ho);R7P)u%4n$D{M6FNbZ6UifA|h!u&T$jVhi~P`Wcq}=)9j?20uHOoNN5X$2z<> zm8KV)X>1#UuDH%7oKy~$_lJQY?>j9|L<5PT6;1lqwThy%e8O1dw?5?9AcGVBV*Cgsb}W zoogrw#v81M?=!P8LC_=QwX{o=VK5!W7V6&I(fSEaV>_v0J4nnAqQME+PntE&)pufo z+4Z*7^DNTfdm47O2@&!G-U$rDUTgd7RYWp%!0l$E*Do3C-F*XF8uTbnsv z?7`@*mv43*e_hSHtzE-*lb0r%7zN)%?$jNguVW?K{&Bi`-vRU+b2HTYKE{AH_YCa& zfm)*zO}*X%w>R=t7{!4e4nDJ!_7{);C-o!RE@Q=1S2Q?J!Kx`QUi6B!5vMNsy&k1X zrVX$%^!3J0;-a%6JBcDz{ob8nFqV1HF8oe1>Q0tT< zpB`P!$j{0^-0F^%O3bV zqzg>^9Ws-;Bi9{W=D^$np6N|PheKhdRR`23M@y^rxqd^_q*BM5rH(gTdAr@}lOrDW z$wP~xzna}n(e;m9eSgmKI6iXghtwUfyE=2AF%2TSJ<*Or5^?MOeSgVvJJ6T02BCif zIp~SGIxoVyy~w3L`AJE%cZc4o_#*Kk5=??=oj(dK{3lGIzhI@gGmL= z8Qkel?P27}7)Y{1{C*Eu)+c&IpBR4^WyNBu10ht2nXle}Vp@Y#boRerOjx15We6#m zjl*z3_UO`IiJvt}rMJer$6iO#_Z1w#UICWt>ktczj^D%Z@uwh_^hdbX2jx&1W&OX| z@P_45gVd>1Z9hzQvStFFf>^;mHa=*5?@TaPBIWqqnD_H_9rXN!>A@JELt($czA5ZW zQQQd=zFPQqrY1Xg8r@yB)%6GwbrR#2lY*F_@Z;ud#T65sN75P z>W=w&0|@y*eR4m@=%VN|SGFVEqkrn^JB*I&Q=iorxb^?)oDc7r522FiV_zmAxBf2c zy58m8(WMBVgYf7x7f`VNao>Acj*rzHuemxeR(G7QJ~3t2(;W0*DUCT;Y1P4n>W-D4 zSD8^H?l{o*MizScV^FYX;(jph zi67vnOMk&NagSTSGJX-O+jdF^{Sj3kh80$ChE;FtF`u;R4eepyBAdTFnPc~t+yBI( z4nafwGi+)5^yB7tfyJMOt6?khdTIb~A;4-+dOvSRR{-aJ_Dl4PdcU=&XHF*hUqRk{ z`H$p&*7t<8f05W{ET?sNCgmc0ILE#tVWPqP{55J$!JBD2&Ir9_z7H*Uy|o;rI2WbR z@R9+&w3*z5*}z^<@3yzk%vVbw8J(SW0V}Dw5jv9LG^b_#v~eDjGXh!kPWrq^PnO>s?st?Hy&GJN87=iS z*B}n2lc9H^2s@{vTHkPnmcAfIeX4v%QCU{#_ZSqhABw%+c@N>UMU>!a_=go)(|4Ia zMR{D|=N#^$hRtfE5vGB34|=!XmSGX{K9y+v8=1GL5aB(VrrWnUHRHS+JY;37I?g}z z#Y8`utdEO%eT-rpruyiHcI=luV%2Bn8w5vZpLrhbu2Fb9!Vh6dd9@>W1JBiL^t%4E8=yUQz>7hCwvw5H0VVaHi*5^outI8dOu@Iz5ylJlxLYw7fMi==0>;M~q+s-1DELNFfe#AY#?S6T&Crsk<8nx& zPe1ep?q}*#o*n4!)sEl7KWW7ztHQ>`fcI(H?OJN*zPcLC-x(kJCcj?c0 z!@0=b2}+xlbTTUjYXSR8k%hy^f@WkkEFeY9(L&3(zZMV{oqh8;6jW#)fF$N0<6FyR zq%ORtR?`RVF9k49u=(jP-E(q7?<1AhU6!hUhN?rqWc@?3`M!j7(0o5(CfmbozGpvw zMp6F5+(!Iti>L5z;(si7G)a{9eqhXCj?Z#;?TtAT|Uw+lLUXJMp+4)~7Y|BaUsKJ=8?MGM}J*|Wk)l;H9V18!3`?e-$813L~ z?A6%oc*|pNCp1l)j&hQdm0Qjd!zVBNqZ54UK!4NOe2EGco%`fu*gf_CR8)twwf29ollPZ6Koe z0p~qP;)!{5%gOWTHFGXv^QdAbSZJC^3iI%8-i|IL7~>#5>7e?3-U_|f(nBkfq2H4a zWqyFq;2?JcmwS}SF~3LPTUOwtvn(YMEAT5c5u1qTcs@PN$CK^bq=bJw`w>lYqVv8; zIl=d%d;*_q_X@l$H@^>Sp{v2WXLAqy3o+(V9{}q;4$WX+!5r4i!!u?H(_w0QT`W3+ zrQ}L5pHH{m8jJ5*=ly^tzR}W`>D4`2;tOUE6d0v18|8!8rwzRTz0D|=`QVGm+0q}V zF4#opb}BJCfge(+HCdv@+n>1vYUwH%GuN@)&GuNLG~>d|J%9*!y$*|hnX6cnKxT4e ziBKB65#QfJA-UBwn9^rldoO+~1qmbmIgo}X)5+sA@JxW_ldVclz164E2@D+RADt4g#oc3OHMu z{Z(}}b^hwFIH$KL{#LL-f3>s4I%~o@r~-dTKR3@wXFT9wg{60G+_-e(#;>gN2kF2A zB^X?*EMK(1rR3Jt<k>T97pPeq+PEttF{)c%t z>)072A`4ZhwMw*%fRm16Nr<9q>Zx85VoeRrO)YgnKlfiMNke60n-jSRwj{(XA7;%* z#9Xmzk+Zs~iaBaRu8AEDtGcr4!RG2WrIKyR!nK&CfPNhbz5;iovLqmG>fRE^$%fmKa`K&Tm71ki*QP(yy6Fo!r;2q{&O zd6Q{0H8Z~>$r}F#r)UvquXF~FGogy4k{s*jdGDuG*R8K3Q#;qTIXC(PO^LDw{53f2 zh|Yznp|fzD)&8}ibtpSakr&+UDOr(-z!C{mHm*aL)#|Sbk>$`X&?sAjyz%0<))S?w z;pgZ;F^)%qU8uTOlq^|^ZUVhBYn-C*SExghAkjoHT-9wvj7oI>evD65N%K(u=0yJz zN;X9pH&|C?ldWnB)mJ;I<3cWAU@O0gZh#Lj=q+gMyTh+gi>z&Gx}ybdyxz|uuJxlg zL%*U}#&Nc^AvdkOR}^)E_*5mZB(Gi^?Sg}bsQct6t5}_blNFVjT(MdoS!`{cHU3eD zLFeDBS+UZ!d}YbfB`dE)zWpcx@3)jSrvz7cZ}yxdxez1Mijz>LnSxFV@hn-m)a_le z=%j!J3s#>R<5^c?d&kClaDTLCY-|&!^qlJUq>#x6{sr7)j`ArmIGMu9+^f1SfEfy0 z=o)7|JTQdb$BF3z^CUhXw9ptr^_-kL&^SOH4C^}YY_R5o)`SKQ>rA%R(1V!Iv&3l{}kXpC{@KLhSzYcogV%Bi& z+)ztHsMTwb3s|kvv&3D(8zu7VOg22;9V*ENSBG<+==?Bhmi9Ksr@^*%REy3K{Z(!) z9`dASr{GjBR^Aq8E*Nn3in-6Fw;V5=-#*3=SQQ5C3b4mxu& ziU#Fy(GQ$5U2aQCPspXxCq(~-9JhN3x<2wSFQcqeB>SVHYtWMh{j8UyWUU6dU}^ah zYB~#+p43uk5`{Wu7EcTYq*}~GSo>~Km>hGY7W7hl&^U!0l3c7P?RYEKzJSt4YuQ9p zT#k#==ez)hUTHahg*|Z4vfi<=Z0ts_0nG(1-ihCRAs%!kXgg>vXg4T*e;)(g3_1e( z7-;sh)-TqVfzt09w1Xa|aL{bL%qv4%F9vM~T?wiTjE&Lz#NmBoW4{88{dR0@n8NYx zNH%uf*ZgU0jJ|hhe;t2z0d(ZQ#>O57Rq(C!GoViV%EV#fanYaFqRX*yx#DQec3gb+ z8CjIKX}~^*JO7tsWBD0)n4DcQIp+rTtPNT1%KVFpuDWj8Wk6Yce9oa1K83Ui;1}t= z6?Z;xC&lL%$pmqa{$^|pFK5|BSSRj`XU4|Zt3o^zM(+xS?w{ZepOJPC>2N~_$Cue)GgpNtq~FNIy=Rf`sqm#C_}DX)Sz)Joo9?S7knRPf z+lku^`C5Di@kcx-Eq6yUw-<7Mj)rzCC2uTQwHNCzt5^<=Lgd|kuDJ~maep}rVD=vs);E5E;C)6D7if02^Oqu<^lNVid{{d7mEe4 z&gE*A=B<_-ElcRi=ZeJo{0s|L@Jl%C%DT*=0&mC1=5&dCcj7Brx+YqL?N`vFNSDLP zCu3H5gk4W?zL@L7{s$|s2p{2m7rqpy>#v-rFEjsdT+RP-YOVRazKc06<8%$D&78J# zx|!2%PPcIy<8+YIVNORlRq&@Y=*s5Q$!R{P#hjLLx`xwcPTM)%%xO2L+c=GJI>_lT zrz4yyGkN-)Iyuefw3yQ}PSp>~bQ`BJP6s(1=5&Np1Iy5Io-x-jMG6*hdCYLRGG!o=hVq*KBvW;T2lWHes=%QX^3;g#kt|) zoN#e2xHtz~ock?n6YWgKWnP>QE^xF{b`5t6VDp_%Uc#LiCrINx)@&PNX`)|lii7DcI@-J{+oJ-E9jfyyr{Bj;H&LN-1d2#;ubk2)&$FJbLIB)z)&L_?p=e#&y zTuh_Hx#D74BhC{q=JMhkaTn*s`QghrFU}2L&UtZO_zKR8bHZ10UYrkJ&UtYz_$tne z^T6>3{n#bW0bk8|asKxj&Wm%uD>*OD`(Dd=an5%Y=X-elHgjH_>)p5k;=JrF zoEPV0e~a_teC%&?UYv{F#d&ca_IEh1Zm=G{%XxABwOD?LbFb;0BwgaXYrbq##5vcG zSiy=o-@2Rg;#}(=a2{VMvFlOJi*u}h$oX&Z@W(hW&aK|Yd2wF#zj0oiQ~e9hi}R^} z$$4=u^{+TD&ZFMWd2tT)4$h17r=Q}yICr|2^WwbeUvplZGyOE@#re{lO_1crmNTlF z+wcKNV=#t_UR6R@7F5g9I|A%vg)>*k;h@FUT&% zL=LTNu4}>reQ{$YUco+su|&mlBJYVWC=;gpKYDlXpG_+o!X&@L(*E}B0$aEtWC_)6_E9k+-t_Im^s`#TU}7wNEHw26WRS|a~q|3uJ7 zxv>3K3N77m4)c@>9P+@fTRp6tVv# zsMxQf_!r=o<5RyyHlh5nD}Ou{`*Iv*X^Cf|zrk&f@8t0XW#6dSB4qPtL1R+OaWJ~4R*LI@A7JpGUDAfDy4{u{L2t#JSV diff --git a/.flatpak-builder/cache/objects/27/05bb36beba9b76e295b58cde69f6fac5220908bc227fd61bbc8d12e6aeced2.file b/.flatpak-builder/cache/objects/27/05bb36beba9b76e295b58cde69f6fac5220908bc227fd61bbc8d12e6aeced2.file deleted file mode 100644 index 1c5f098ce8a47e056c3d122a4d144308165bd2f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7908 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 Iz?;(dKb**n@Bjb+ diff --git a/.flatpak-builder/cache/objects/27/c5a567b8bfa9b7721c5668a616108119f908e3dd7076ef2129a24bfc9bb7a4.file b/.flatpak-builder/cache/objects/27/c5a567b8bfa9b7721c5668a616108119f908e3dd7076ef2129a24bfc9bb7a4.file deleted file mode 100644 index 929041772bff0dee2ab73b6f8eb12b7872e69382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1261 zcmaJ=TWb?R6rRcEvPlzrp|wF!N2A!qnoueTMf4%m)(hKGQ^C9}+w7#-cC)*k-9-Zt z`rt#sAJF;>#9w19eF*zh@TqSLean+)W|LkJoE=WioXec^eP{BcP{>ILp>MeVd+pcv zy+5E|Ebf4X&(}d7A_E!NLTy~fnCl5EQBN3>k+h_CvYy0 zqpbLh31iY2|C*}HM&dnErp|b}sGaMVGO=g`Xh5_r$`P`{GcGKJr zvo1eq0kZ}20#P@s3>ZwIn>e8aF#}kzo?I4s)(j7w5*LUZ#r(-X6>&V1iK6WKNs7 zz+79m^=-<^Zs%$voacY}zr3;rc;lIj8oLr*CUa()l9ung-n{skC)95!qJa7;Oma_{ z68@T!2-ERRVKMNi)^yk>of)RR%~eeVDH4-m7%ay{9)!oo4HOKXRdm;_Smsv6?f5On zUMw#xR6NtCPh7pR3&6YzygcwPRs!F&DuN)u8s5E}mNuG}D5m)VjL~8@p~4t1wEvE=zj0|K1GFn@tvaS-t~PdWlyBp2w|-BlXJc68{pr**MIc5|4@lC1W!ch Ie?qkP7q{DBGXMYp diff --git a/.flatpak-builder/cache/objects/27/e35e90609c5180386a480f57df0a7b7f0b0dbc9e8e7b74b010978cffc49ef8.file b/.flatpak-builder/cache/objects/27/e35e90609c5180386a480f57df0a7b7f0b0dbc9e8e7b74b010978cffc49ef8.file deleted file mode 100644 index 091e2be5db81eb1a1d5916f02ae949f2d066710e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12215 zcmd5?e{2(1o}aPD_W1YD#Ev1vI6x90frL`pl!KZiP-vS_0!?vCy^hBYrj8xP&I0Zj za^0SoAWn6vR5&OVZq;pr+DdfQ)pDmhUGKDe$DZ~ioAar@k&q(Y@&~&6BNbfI=4s&dUIXUUz#F|L%xi!*do93gy;g?u+8CX;j?sJT8H3l(7`+b0z7M#d3b$29DQkuz?l>0Qd(BqI(Gj0;Mv52{Y7%Cr0w zrvEv51vq$JjBJo-YrcnKZKR;}N29TXKM{^a2u)eg>!_-1+n{iXtW=GCR6TDLc9%!7v#LjNOw#GxsP& zXhckixDa_BkqJZy=qiA^D+g2u#!lY10CR=lV11InF|wqZAYdNy{(ESm_t5;V6W2+B z8V)DoanywC;ZxiEV`JMQ;o)s#=MpDl(H$L~o!jE!M6i9#A9xF95Z`wA;7i*M2SVkU zb&Q>RNbipLM~4~z9<~u$>45*Z0muZAek!wm>X|G#wQYj94=F2*)B!oQBW2`C7!r(^ z>c3}%d=?eD_dh@U@B`a`qD~;#sxAa$f1a!WP^!uHX1-XsT`ER;9a!`7_?R# z$r0IduH?y(9Qi5K{k&5DFJx%R!~iQQ>%WgTEZ+W6CU~|@#p7rsbbbJW_Z#J5-5~c%`}2Q zp}ZQNI7@o9Fqw6Nw(2w_ThY02h2Y4$#vPJL1Y}^gG4bTs>*U?wz3fAeDq|nUDv32^Na6{MT@i*2>Z^$Jgn6+yP9Ys{FL7cjrF;T? zs(ySM{~uZi$vI*X2ssr3%ggVh!|toBIvjk>;u~G$q^k`zDmwvc=oZT@a?%Hd5tM{~MGLG=beZc3jr zq>L$3%AB&KtSK93X5=9mXXLD$Aqnq*({n}yuADVQF>*!@aYKmW)Ya`koH&J$8wXB{ z-{_w)BDApx+L8v)CtQ9}I)LP0(Rpn%v%BCS$Rj(t1d0v%89@!=!}qf1z`-6tJ9sXd z@Sp8t*%&J*;^SjMR-k>pa5S9o`2=|)77!GyKROa*pGJ+Ce36)+@r|)DD3}O?tf#`! zP)yK^>7&5}8xF+FQP2lQ{bO;#Am&!2kUAJ09}Tkp1gJA3k#l1w+v)`>9*l%=C*p7w zpyq@Ff_yYSA}9i}aexytEKrGaV?jYx?nhPbfv&VI3!DVi=&YbP8xJR;{d4$1MS`IO z%p^Q=5*}y5OyZ=V^v451Xja7pMMmRK!0?C15rnCIzCgqukNbS_dYHItxiBFr3sjcYqk73jvhCTn`%l>_e|$atm>O&^*vP8)eeQEU3(;B9SV zPTN?txcQztmc~o~l#PPLozuDR()vl&W!1N|<2LQc)6N3z%+b!}8?x5%)MfgPxjsEU zwRU>#0wGfmkRs(hcdYek_R5*}&ty(dC8v{9d#CsEy>}X2S<7ekkL`2jkDQ-4XMD51 zF9SE+ziRnK%gyy)ZT@=m_1G7&zm0#>^-sJ0Vb`tBzwiEa_g`K3n+v(de!lne3+bbi z{e1tt#RlD~=53B|ZEd%0ZF$?4f^7>Vspl>A-&!`@wrt2-HWe(JcvZ2SkR8ff+6$I; zNV3|$wQjm?-ITYs7Obs2{Ra(UcV+2(eOsZvZGkYWEtpL1=l7*$MWdNNzhEQk)@Jri zzxbV1ZMGC`4fy9MGtQ!IP0_Y)K}poF$#~L-iggW{UD;zZd*}LY^j?4IW=qbtuUJ=~ zAu~I(8*{c+D2^IiP%GS)G&QZsbWIr^EHsom#>xO32LA}V6_%832lB8tF+LUvzFyYZ zu~M|vwWuj!Rj8yZt(1O3q8cHS2+)zdzW@wUjZVQ+3>;Y{PoPXnmXfECJgA^bo!x}z(OjGyvJ78OH{ZzPxyt0wCuXSk9cflBc)AQJ>^DA$JB zvvcy_ZPCuR5k(K9+%{f}sK_5Dpa3JwI-c4Iw z_~GKP0xq#W(2C-{Q-n3SsJ*DWLWGIbimG*@N|Tdf*&DDME@{#Jx}=j4le$Um^1JFW z`-9@Oye=eTWbe|F-BzRJ_10)@u!{lz@V?pvJ+H7c%ViL9R`0%36}?buHju4T}!(xtPh)*n}F;gMSZ>iZ7Kr(~CZ zg5&|7DvOpBcy#<(G}Y^rAnVvJkUmjYI0;E{v`t*D2@#JUYIY-=H4qye+mqZbInp({ zOULd=EZ~pC_W)C_!K3z$0s+X*>4wDLHy%E~2h#2OQ*oSP^{aMS$ zEpzKX+Wg7pne(&f=i+nm8(qKJ^^09MJHP7wy8HTtFD~Ttdn@f=9KohPh^{bnA{dY+ zcKFBu*w9B0_6>^D^gs^#6O=6r#{_z?ukS@)&#@!efNj%bnI~u#RWO!8u7Ch8r$X1=NU+J&nZzC53A+EZxSgT$na-=FTuSm!|`T9*n%kg59D$jUnc z=3nY={q(nuziR|GuNx}phIq0fIZ5@7qR#N%flCL{o=kmq{fskj+wk+@Pu|Mwx(d3k zoURLm=zC`_ok_>j@l4mXT~~KyJ7>CQyQeNpU&tF<3dRA* ze6~Bc+4H4)?&yuq>s!9qGPmU$lJ75WdWt{v0h`$XzNfdR-_GlrbGqhvV?&N^z^nOi z2X>H%x&Zh*N@~EPxDzKN=NH*FSaKtq9i86QN^Mam00~N-sz`T`OL7sX8QEJnHBGXL zYKbf(IEs_4AZg`Nx$vkMNWWrARc*7c*lG<1NLytTNUEpkC)SesiM6D8Vl8Q(SW7yv z5o!F!^qiK{AsaGffHhSj3li*5HQ)=RGs;knaYr~%|OSi~m`H|%+o z_A(-`A~J-?Yls|2#ES?5VD=ayuLFrAr$-e)VOGSbUdTx{EXAmjgWv;H+W~S9!_y1o zA(B^>0qX61({qKU=Oh5-m|h23y3Ue*b#fr9xUJoo*KWL9=gjPYKla+0t7o#OXOgqY znZ2`n^L1Mabz2q)T952&MAPIQdqc*3t>tP9;L_&V%~R*6&(F#8_AP1Zj>B0EMl*(4 z!<;qm*qT;6BBue2(rX8<9>{uT4$U5#SvR|Gt~uY(o>ty*uFV{|Hgt6;`^t=W);rTN z+cCEz@9apcijKxCHKR)_ijH+zd*0CsoT)yo%qTMBSq7}%oi{gq({igbXMZ_w>Mxl3 zbNIJlMicmh1DVT@n5!CqdVxSRO&0CWr2w0zijFlIxn$VJStAz_F_dunFe>^7KOqboC5>#Im>{>V9Z=j^ZMO+y9KP!9j*jrF`i z)X30QeQ3r&j&IjGFqInTNJ+vl{g1GnF4`{EAp<=NiA%#{j4K;9uIfNVuA8*2&bZ>J zYQYV+Bw+L{I^e5Z>Nj5~19$`~c))SQY_FFH5CAW|;x-mi7Kf>F1^+p8^^(pEbmB)#bvRZ0)0nv9`S zdQiO#kA4p)7!bH5XIvaFLon* z(42`ggTq+MSvYHTdyIzD1AOQ>lXMS!3U<@yi{`Loe*p9cIRltj+I}qDllCDt79DYc zQ+7DWx?&+$$*n5UQ;~-O+nFx`Q?WB$KgP}kOK<%k+#KUkzyo8*C^Rp%=vd@@NwzPQ z@}*%eXUE+_t!x2;>^RGA@s~ZF-T{9#F3?Ig76yNsIkWG;(Ab|L@?_?VjQ`4f?I7#W zZ_Wd^Ur&sNjAJMg`Tt zAig&c6#xwDt*9{?h@cL!u~F=PiEL zp4vLSHK$uQU*53d*8H;XM(g!~F9sl%x9l!hc7qaAUSe@Ee_40q^jD6r9T3agy9@Si zUI%8i%?Wo5-8@~iHi*o8-TG`RXf3>^NE_cXTr#ASdD>l|-8tG_Hk*@qqq|^q^VD6# zn#>CY!$w|SG=g`(sI@K-q}pDz*7Lo{->*WK3}=yJbAeE(4Vdtr;u?3hbGAD>oIRZ# zp4~I~65p5JS+qJcote{Mh>vHUEm${B_9BzJsI$J;f2seDsczbsm1l!<$FgtUIC^va zP0!8duaAGD_$F~{@YZ1Nl~;f3{hc>&daYo3?K`G?TVB1_Xxvv7xk;ga9xVLq)*8J!}XK8)nNGQYo@4_eD$?gUo)jlDOO*b zL?(_L8LII85F8-DM{MYeu_Ro5q*M$sLRRZFa1C1H3dQAUUdQV}YeCva1tFou8WVMi z_Mw)PmP?Sn#yFNbV8Nh0p3&0mp6Wa_T=wZA&iCR#H!fZU@3&bJ<4L8do zS4w1KXG)2PQ%B3wW?w-yP35SsgpnBF1Y=Ed)yqX@e6_(`Mz;Nso^-DKntu=Z@wZFR zRunzC|F-S{YLA}_XP(bv-g9qS1H#vA?9F%P0*9{(JpG)=| zm!_{>@tdtAP&iXNAqS2VK13Aoc=xf-h^gonbn$wceG{e1@KrT?s)~PGERDT0h!;y- zs49V+CT%+O6$tvU488)<_CUOVS$hmcfG>7KuF2N{dh}*Pe33Ed|rVUsRT)2#(d O^LIG&`xT1d75QJ()Lu{k diff --git a/.flatpak-builder/cache/objects/28/4df20a8ed855ea6132c4b167149d16a41e04a3d79e434a91a33c0dac59d256.file b/.flatpak-builder/cache/objects/28/4df20a8ed855ea6132c4b167149d16a41e04a3d79e434a91a33c0dac59d256.file deleted file mode 100644 index 822f326ff58bf124b5380b66ddde2692ea0bbacf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1203 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 diff --git a/.flatpak-builder/cache/objects/2a/e9286f5fa157f6af95495a605afa4f22c5871f78e0153f40ce2ed06964baca.file b/.flatpak-builder/cache/objects/2a/e9286f5fa157f6af95495a605afa4f22c5871f78e0153f40ce2ed06964baca.file deleted file mode 100644 index 5110b6c1bf656d1a3b176cd5a230b675ed8b47f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12508 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 w6fo!9u diff --git a/.flatpak-builder/cache/objects/2b/4efc9a738a849538f560c5d2fea06547d07d0573a1b4ce38990a0d26cca98c.dirtree b/.flatpak-builder/cache/objects/2b/4efc9a738a849538f560c5d2fea06547d07d0573a1b4ce38990a0d26cca98c.dirtree deleted file mode 100644 index c9ad1f4c36f7f1dcc9fc0823d5943f154209f80b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74 zcmV-Q0JZ;fXkl_?0C gXY;lL<%P%Y?zVOMq!QKabM`5S>kDjDh$aR|0LULFA^-pY diff --git a/.flatpak-builder/cache/objects/2b/79297f72252bdd3638b51c47079da1ea58efaefbdbe97ffcee8b10d61010b2.file b/.flatpak-builder/cache/objects/2b/79297f72252bdd3638b51c47079da1ea58efaefbdbe97ffcee8b10d61010b2.file deleted file mode 100644 index bfb11ddc70ec914923799a7764e5b1a85a5aec3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1450 zcmV;b1y%YViwFP!000001Kn6%bJI8!edkwb%tP538YgX`StborU}0d`fnj0xv7^|s zEh<|cNlqJn{hlj1j?=g$yJeVR-y-Si=zg60;mn?2mx?Wgu~JuO(PT7^n5Yt+$|^sL z8kZeTqv!JnvqYD*u0-YRw($G`W1B{_uD-KGfz=aVN|yz9|vzLFL5Anp6!tgf)LzaL2BsD_GemCu=3x`CC@%R45Ci zp5(4x{nOWiyT*vEJB?cZ#6rpWXRa=p)0>yVGfY;@6@pp#f+e~l?|YBVVqDrn_}D1L zc$G5T6Rrcuj4nL{!qLApi#IAj$5+xOip$dbsJH*Qke0PhWB6HV$9R@WCE?GM!9g6) zdM5=BJZ5hXN-qYB!3!%FuqM+6x~*6WiCkE+bfp^uU6%+1!>QGoyW$2`^2P#rv0|pF zDi9HNr-J2jDJt3}m|)weQ*{>aL=Z7u3Z-jdm`u+ir_vDsQf;EnI!~~7;G$Wvzj)aQ z#r{YeZs5F6`YX3v6pTB(oA?*s$GIUJ02FVkq~PS9?ZlC3G>|5v_839zF0RuG%xEzZ zo)jXD5RudsXVKG>h!sNSh4a6MVCyPJ1}2@~_6B1%;R;em_k^7sO*go-_`z`hSx@V9 zayfKq>q28xD_`hR)S!1XFPy9GvpCL?7tLY>g!o-Rh}Q_Xwga$ea%XsQDa;-av9z|K zqB4Y(>Z&cg12{e{wXti!J_PEu$hDEec4^XXt>#}G(%!9RaksN0@+uI$^fmByF{-RL z&%1T^HkI?GOna&TMBiK0D69?_2n6#v%!%ex~ z=ssZ1fd1!O{Q`|-snwFo>5UfiGc7y%A(s8gE1r8xe!2n2dl}H*S<`W0(3_$3CKE6FaNx4BOdpORH7N^rK5TwzT zYBPiRf!kizwHsYkq|Os<2Ep;@gyu$v;Q?o54X>U~p8P&O8IQ;P#2Of~LYB{8$eewt zQ>1@y_y`qE^_OALIZso}2Yx6h;2ZBBNm1!fMBBoF4n`z8ucS|hM;KO?JTU0DyRQ0d zQL+*=1(mfMmVGU+A#15#*pen9lyW;P`bJd3aK$t{QOa)v)7lU~~$eM@#sA4_b32c07+g5qiypz*~X+ zxpX|hrRn7K>AqZ|NLW7yXS-wft(^MQSSvXiKT^S}P%$5Q*I5>O1egploD5L9L&gUqc@#aOb6SywUT?ow6S)wPGku zSM0#@B?fMoNi%t9bO-FJz@QDnFrK&uTwb*jo?8g+|Anl__b2Po=xB$mPft#!`;yfo zuoq1Zc3khr)X$oOMtITs4=IpKa6`>-Aqq)fe?E%0)SmYmqi`sCOiADnOB<@Zgx~}3 zV@)eKjw~GpdI@HekpDI%O1JL@%3HsGRcN*I+4(CI2C=$7VJ7z`%!Iw-jx*#gMF7OP zNgMiV4`nBnX?5V3Pjm7eCc;e89o5#zg#O~dC%(fNzIL#ohKj3bm$Xez#)rTE_P_Ex zO?MysMdCNPD}LQ_J+i@D4j(cXCZtCQs^-QXP7ub}|M?Yn|9;IM^cH~l2l4muE?g4; E0A4!GPyhe` diff --git a/.flatpak-builder/cache/objects/2c/a541b041a8bec25da3696d61abaedac39819d424d7ff96290b390d4cfdd3d5.file b/.flatpak-builder/cache/objects/2c/a541b041a8bec25da3696d61abaedac39819d424d7ff96290b390d4cfdd3d5.file deleted file mode 100644 index 10b2cc6..0000000 --- a/.flatpak-builder/cache/objects/2c/a541b041a8bec25da3696d61abaedac39819d424d7ff96290b390d4cfdd3d5.file +++ /dev/null @@ -1,284 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Tk display interface -# -# History: -# 96-04-08 fl Created -# 96-09-06 fl Added getimage method -# 96-11-01 fl Rewritten, removed image attribute and crop method -# 97-05-09 fl Use PyImagingPaste method instead of image type -# 97-05-12 fl Minor tweaks to match the IFUNC95 interface -# 97-05-17 fl Support the "pilbitmap" booster patch -# 97-06-05 fl Added file= and data= argument to image constructors -# 98-03-09 fl Added width and height methods to Image classes -# 98-07-02 fl Use default mode for "P" images without palette attribute -# 98-07-02 fl Explicitly destroy Tkinter image objects -# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) -# 99-07-26 fl Automatically hook into Tkinter (if possible) -# 99-08-15 fl Hook uses _imagingtk instead of _imaging -# -# Copyright (c) 1997-1999 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import tkinter -from io import BytesIO - -from . import Image - -# -------------------------------------------------------------------- -# Check for Tkinter interface hooks - -_pilbitmap_ok = None - - -def _pilbitmap_check(): - global _pilbitmap_ok - if _pilbitmap_ok is None: - try: - im = Image.new("1", (1, 1)) - tkinter.BitmapImage(data=f"PIL:{im.im.id}") - _pilbitmap_ok = 1 - except tkinter.TclError: - _pilbitmap_ok = 0 - return _pilbitmap_ok - - -def _get_image_from_kw(kw): - source = None - if "file" in kw: - source = kw.pop("file") - elif "data" in kw: - source = BytesIO(kw.pop("data")) - if source: - return Image.open(source) - - -def _pyimagingtkcall(command, photo, id): - tk = photo.tk - try: - tk.call(command, photo, id) - except tkinter.TclError: - # activate Tkinter hook - # may raise an error if it cannot attach to Tkinter - from . import _imagingtk - - _imagingtk.tkinit(tk.interpaddr()) - tk.call(command, photo, id) - - -# -------------------------------------------------------------------- -# PhotoImage - - -class PhotoImage: - """ - A Tkinter-compatible photo image. This can be used - everywhere Tkinter expects an image object. If the image is an RGBA - image, pixels having alpha 0 are treated as transparent. - - The constructor takes either a PIL image, or a mode and a size. - Alternatively, you can use the ``file`` or ``data`` options to initialize - the photo image object. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. - :param size: If the first argument is a mode string, this defines the size - of the image. - :keyword file: A filename to load the image from (using - ``Image.open(file)``). - :keyword data: An 8-bit string containing image data (as loaded from an - image file). - """ - - def __init__(self, image=None, size=None, **kw): - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - if hasattr(image, "mode") and hasattr(image, "size"): - # got an image instead of a mode - mode = image.mode - if mode == "P": - # palette mapped data - image.apply_transparency() - image.load() - try: - mode = image.palette.mode - except AttributeError: - mode = "RGB" # default - size = image.size - kw["width"], kw["height"] = size - else: - mode = image - image = None - - if mode not in ["1", "L", "RGB", "RGBA"]: - mode = Image.getmodebase(mode) - - self.__mode = mode - self.__size = size - self.__photo = tkinter.PhotoImage(**kw) - self.tk = self.__photo.tk - if image: - self.paste(image) - - def __del__(self): - name = self.__photo.name - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def __str__(self): - """ - Get the Tkinter photo image identifier. This method is automatically - called by Tkinter whenever a PhotoImage object is passed to a Tkinter - method. - - :return: A Tkinter photo image identifier (a string). - """ - return str(self.__photo) - - def width(self): - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self): - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def paste(self, im): - """ - Paste a PIL image into the photo image. Note that this can - be very slow if the photo image is displayed. - - :param im: A PIL image. The size must match the target region. If the - mode does not match, the image is converted to the mode of - the bitmap image. - """ - # convert to blittable - im.load() - image = im.im - if image.isblock() and im.mode == self.__mode: - block = image - else: - block = image.new_block(self.__mode, im.size) - image.convert2(block, image) # convert directly between buffers - - _pyimagingtkcall("PyImagingPhoto", self.__photo, block.id) - - -# -------------------------------------------------------------------- -# BitmapImage - - -class BitmapImage: - """ - A Tkinter-compatible bitmap image. This can be used everywhere Tkinter - expects an image object. - - The given image must have mode "1". Pixels having value 0 are treated as - transparent. Options, if any, are passed on to Tkinter. The most commonly - used option is ``foreground``, which is used to specify the color for the - non-transparent parts. See the Tkinter documentation for information on - how to specify colours. - - :param image: A PIL image. - """ - - def __init__(self, image=None, **kw): - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - self.__mode = image.mode - self.__size = image.size - - if _pilbitmap_check(): - # fast way (requires the pilbitmap booster patch) - image.load() - kw["data"] = f"PIL:{image.im.id}" - self.__im = image # must keep a reference - else: - # slow but safe way - kw["data"] = image.tobitmap() - self.__photo = tkinter.BitmapImage(**kw) - - def __del__(self): - name = self.__photo.name - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def width(self): - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self): - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def __str__(self): - """ - Get the Tkinter bitmap image identifier. This method is automatically - called by Tkinter whenever a BitmapImage object is passed to a Tkinter - method. - - :return: A Tkinter bitmap image identifier (a string). - """ - return str(self.__photo) - - -def getimage(photo): - """Copies the contents of a PhotoImage to a PIL image memory.""" - im = Image.new("RGBA", (photo.width(), photo.height())) - block = im.im - - _pyimagingtkcall("PyImagingPhotoGet", photo, block.id) - - return im - - -def _show(image, title): - """Helper for the Image.show method.""" - - class UI(tkinter.Label): - def __init__(self, master, im): - if im.mode == "1": - self.image = BitmapImage(im, foreground="white", master=master) - else: - self.image = PhotoImage(im, master=master) - super().__init__(master, image=self.image, bg="black", bd=0) - - if not tkinter._default_root: - msg = "tkinter not initialized" - raise OSError(msg) - top = tkinter.Toplevel() - if title: - top.title(title) - UI(top, image).pack() diff --git a/.flatpak-builder/cache/objects/2c/c64fea07bcf2a59c1555463787963de0f558e4fa845db6e738137019baf341.file b/.flatpak-builder/cache/objects/2c/c64fea07bcf2a59c1555463787963de0f558e4fa845db6e738137019baf341.file deleted file mode 100644 index 076f3c1cdcfb3621fa95066472ba150284ab7fd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5116 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 PqxEl;@%LA7HDCV?r@f(l diff --git a/.flatpak-builder/cache/objects/2d/14e519813cff8bb6c178261d0a76572c7139902e60d1d0d0770050a418b08f.file b/.flatpak-builder/cache/objects/2d/14e519813cff8bb6c178261d0a76572c7139902e60d1d0d0770050a418b08f.file deleted file mode 100644 index c169f4194c610b7b24d21845817059e2cb788816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7271 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 Mn_9=gxhDL70bWXvp#T5? diff --git a/.flatpak-builder/cache/objects/2d/82e09a8fc6d09fbea8d1779d98163487b655c777d4064c294f2359a9a0fefc.file b/.flatpak-builder/cache/objects/2d/82e09a8fc6d09fbea8d1779d98163487b655c777d4064c294f2359a9a0fefc.file deleted file mode 100644 index 60f3ec2..0000000 --- a/.flatpak-builder/cache/objects/2d/82e09a8fc6d09fbea8d1779d98163487b655c777d4064c294f2359a9a0fefc.file +++ /dev/null @@ -1,74 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# BUFR stub adapter -# -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler): - """ - Install application-specific BUFR image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix): - return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" - - -class BufrStubImageFile(ImageFile.StubImageFile): - format = "BUFR" - format_description = "BUFR" - - def _open(self): - offset = self.fp.tell() - - if not _accept(self.fp.read(4)): - msg = "Not a BUFR file" - raise SyntaxError(msg) - - self.fp.seek(offset) - - # make something up - self._mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - msg = "BUFR save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) -Image.register_save(BufrStubImageFile.format, _save) - -Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/.flatpak-builder/cache/objects/2d/aa2e47452be85c8b58e190aa7f144a7c85c425b8fdccf13e635ff68c2f92b1.file b/.flatpak-builder/cache/objects/2d/aa2e47452be85c8b58e190aa7f144a7c85c425b8fdccf13e635ff68c2f92b1.file deleted file mode 100644 index aef0bcb..0000000 --- a/.flatpak-builder/cache/objects/2d/aa2e47452be85c8b58e190aa7f144a7c85c425b8fdccf13e635ff68c2f92b1.file +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.43.0) -Root-Is-Purelib: false -Tag: cp311-cp311-linux_x86_64 - diff --git a/.flatpak-builder/cache/objects/2e/7f08fe9d8d1fc9b1925226721a0fed94ee43f25d68d1e49e3e4a7d65189702.dirtree b/.flatpak-builder/cache/objects/2e/7f08fe9d8d1fc9b1925226721a0fed94ee43f25d68d1e49e3e4a7d65189702.dirtree deleted file mode 100644 index 47194bedd867799f7c25a746dd9cbe1e63a4ae93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmV-P0Ji^OaBy<~1}&(8$O5F?plP5wwO5#~=drKy;H{Ig%W}eLCXD@*L~0K48+^fM f^R@%!g~#shwsrcX64mT;_9=+#3v5(~B?U(SqPQl| diff --git a/.flatpak-builder/cache/objects/2e/8156e91555b4d389e70f25f56650a1cec90fd8b125f56a095811af9ba9a86c.file b/.flatpak-builder/cache/objects/2e/8156e91555b4d389e70f25f56650a1cec90fd8b125f56a095811af9ba9a86c.file deleted file mode 100644 index 0fd0c3c5cc91ef37e1db15dbeef43ece13dc4930..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6250 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 diff --git a/.flatpak-builder/cache/objects/31/dc0e1a59c92c2ce56ecd220e8f8595b032a7f9f525ad88cd36512344ca0830.file b/.flatpak-builder/cache/objects/31/dc0e1a59c92c2ce56ecd220e8f8595b032a7f9f525ad88cd36512344ca0830.file deleted file mode 100644 index 1f37c02..0000000 --- a/.flatpak-builder/cache/objects/31/dc0e1a59c92c2ce56ecd220e8f8595b032a7f9f525ad88cd36512344ca0830.file +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.40.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.flatpak-builder/cache/objects/32/f107a7dc3c76579902dff8e6e84d9f991119c84e58d828bf9f9742d2137987.file b/.flatpak-builder/cache/objects/32/f107a7dc3c76579902dff8e6e84d9f991119c84e58d828bf9f9742d2137987.file deleted file mode 100644 index 65409e2..0000000 --- a/.flatpak-builder/cache/objects/32/f107a7dc3c76579902dff8e6e84d9f991119c84e58d828bf9f9742d2137987.file +++ /dev/null @@ -1,74 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# HDF5 stub adapter -# -# Copyright (c) 2000-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler): - """ - Install application-specific HDF5 image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix): - return prefix[:8] == b"\x89HDF\r\n\x1a\n" - - -class HDF5StubImageFile(ImageFile.StubImageFile): - format = "HDF5" - format_description = "HDF5" - - def _open(self): - offset = self.fp.tell() - - if not _accept(self.fp.read(8)): - msg = "Not an HDF file" - raise SyntaxError(msg) - - self.fp.seek(offset) - - # make something up - self._mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - msg = "HDF5 save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) -Image.register_save(HDF5StubImageFile.format, _save) - -Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/.flatpak-builder/cache/objects/34/1ea6141f16419f5eb0ab4e0210243f7d17ab73e287b27dbfbc309f8a1ead93.file b/.flatpak-builder/cache/objects/34/1ea6141f16419f5eb0ab4e0210243f7d17ab73e287b27dbfbc309f8a1ead93.file deleted file mode 100644 index 1777f1f..0000000 --- a/.flatpak-builder/cache/objects/34/1ea6141f16419f5eb0ab4e0210243f7d17ab73e287b27dbfbc309f8a1ead93.file +++ /dev/null @@ -1,303 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PDF (Acrobat) file handling -# -# History: -# 1996-07-16 fl Created -# 1997-01-18 fl Fixed header -# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. -# 2004-02-24 fl Fixes for 1 and P images. -# -# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. -# Copyright (c) 1996-1997 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -## -# Image plugin for PDF images (output only). -## -from __future__ import annotations - -import io -import math -import os -import time - -from . import Image, ImageFile, ImageSequence, PdfParser, __version__, features - -# -# -------------------------------------------------------------------- - -# object ids: -# 1. catalogue -# 2. pages -# 3. image -# 4. page -# 5. page contents - - -def _save_all(im, fp, filename): - _save(im, fp, filename, save_all=True) - - -## -# (Internal) Image save plugin for the PDF format. - - -def _write_image(im, filename, existing_pdf, image_refs): - # FIXME: Should replace ASCIIHexDecode with RunLengthDecode - # (packbits) or LZWDecode (tiff/lzw compression). Note that - # PDF 1.2 also supports Flatedecode (zip compression). - - params = None - decode = None - - # - # Get image characteristics - - width, height = im.size - - dict_obj = {"BitsPerComponent": 8} - if im.mode == "1": - if features.check("libtiff"): - filter = "CCITTFaxDecode" - dict_obj["BitsPerComponent"] = 1 - params = PdfParser.PdfArray( - [ - PdfParser.PdfDict( - { - "K": -1, - "BlackIs1": True, - "Columns": width, - "Rows": height, - } - ) - ] - ) - else: - filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "L": - filter = "DCTDecode" - # params = f"<< /Predictor 15 /Columns {width-2} >>" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "LA": - filter = "JPXDecode" - # params = f"<< /Predictor 15 /Columns {width-2} >>" - procset = "ImageB" # grayscale - dict_obj["SMaskInData"] = 1 - elif im.mode == "P": - filter = "ASCIIHexDecode" - palette = im.getpalette() - dict_obj["ColorSpace"] = [ - PdfParser.PdfName("Indexed"), - PdfParser.PdfName("DeviceRGB"), - len(palette) // 3 - 1, - PdfParser.PdfBinary(palette), - ] - procset = "ImageI" # indexed color - - if "transparency" in im.info: - smask = im.convert("LA").getchannel("A") - smask.encoderinfo = {} - - image_ref = _write_image(smask, filename, existing_pdf, image_refs)[0] - dict_obj["SMask"] = image_ref - elif im.mode == "RGB": - filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceRGB") - procset = "ImageC" # color images - elif im.mode == "RGBA": - filter = "JPXDecode" - procset = "ImageC" # color images - dict_obj["SMaskInData"] = 1 - elif im.mode == "CMYK": - filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceCMYK") - procset = "ImageC" # color images - decode = [1, 0, 1, 0, 1, 0, 1, 0] - else: - msg = f"cannot save mode {im.mode}" - raise ValueError(msg) - - # - # image - - op = io.BytesIO() - - if filter == "ASCIIHexDecode": - ImageFile._save(im, op, [("hex", (0, 0) + im.size, 0, im.mode)]) - elif filter == "CCITTFaxDecode": - im.save( - op, - "TIFF", - compression="group4", - # use a single strip - strip_size=math.ceil(width / 8) * height, - ) - elif filter == "DCTDecode": - Image.SAVE["JPEG"](im, op, filename) - elif filter == "JPXDecode": - del dict_obj["BitsPerComponent"] - Image.SAVE["JPEG2000"](im, op, filename) - else: - msg = f"unsupported PDF filter ({filter})" - raise ValueError(msg) - - stream = op.getvalue() - if filter == "CCITTFaxDecode": - stream = stream[8:] - filter = PdfParser.PdfArray([PdfParser.PdfName(filter)]) - else: - filter = PdfParser.PdfName(filter) - - image_ref = image_refs.pop(0) - existing_pdf.write_obj( - image_ref, - stream=stream, - Type=PdfParser.PdfName("XObject"), - Subtype=PdfParser.PdfName("Image"), - Width=width, # * 72.0 / x_resolution, - Height=height, # * 72.0 / y_resolution, - Filter=filter, - Decode=decode, - DecodeParms=params, - **dict_obj, - ) - - return image_ref, procset - - -def _save(im, fp, filename, save_all=False): - is_appending = im.encoderinfo.get("append", False) - if is_appending: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b") - else: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b") - - dpi = im.encoderinfo.get("dpi") - if dpi: - x_resolution = dpi[0] - y_resolution = dpi[1] - else: - x_resolution = y_resolution = im.encoderinfo.get("resolution", 72.0) - - info = { - "title": ( - None if is_appending else os.path.splitext(os.path.basename(filename))[0] - ), - "author": None, - "subject": None, - "keywords": None, - "creator": None, - "producer": None, - "creationDate": None if is_appending else time.gmtime(), - "modDate": None if is_appending else time.gmtime(), - } - for k, default in info.items(): - v = im.encoderinfo.get(k) if k in im.encoderinfo else default - if v: - existing_pdf.info[k[0].upper() + k[1:]] = v - - # - # make sure image data is available - im.load() - - existing_pdf.start_writing() - existing_pdf.write_header() - existing_pdf.write_comment(f"created by Pillow {__version__} PDF driver") - - # - # pages - ims = [im] - if save_all: - append_images = im.encoderinfo.get("append_images", []) - for append_im in append_images: - append_im.encoderinfo = im.encoderinfo.copy() - ims.append(append_im) - number_of_pages = 0 - image_refs = [] - page_refs = [] - contents_refs = [] - for im in ims: - im_number_of_pages = 1 - if save_all: - try: - im_number_of_pages = im.n_frames - except AttributeError: - # Image format does not have n_frames. - # It is a single frame image - pass - number_of_pages += im_number_of_pages - for i in range(im_number_of_pages): - image_refs.append(existing_pdf.next_object_id(0)) - if im.mode == "P" and "transparency" in im.info: - image_refs.append(existing_pdf.next_object_id(0)) - - page_refs.append(existing_pdf.next_object_id(0)) - contents_refs.append(existing_pdf.next_object_id(0)) - existing_pdf.pages.append(page_refs[-1]) - - # - # catalog and list of pages - existing_pdf.write_catalog() - - page_number = 0 - for im_sequence in ims: - im_pages = ImageSequence.Iterator(im_sequence) if save_all else [im_sequence] - for im in im_pages: - image_ref, procset = _write_image(im, filename, existing_pdf, image_refs) - - # - # page - - existing_pdf.write_page( - page_refs[page_number], - Resources=PdfParser.PdfDict( - ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], - XObject=PdfParser.PdfDict(image=image_ref), - ), - MediaBox=[ - 0, - 0, - im.width * 72.0 / x_resolution, - im.height * 72.0 / y_resolution, - ], - Contents=contents_refs[page_number], - ) - - # - # page contents - - page_contents = b"q %f 0 0 %f 0 0 cm /image Do Q\n" % ( - im.width * 72.0 / x_resolution, - im.height * 72.0 / y_resolution, - ) - - existing_pdf.write_obj(contents_refs[page_number], stream=page_contents) - - page_number += 1 - - # - # trailer - existing_pdf.write_xref_and_trailer() - if hasattr(fp, "flush"): - fp.flush() - existing_pdf.close() - - -# -# -------------------------------------------------------------------- - - -Image.register_save("PDF", _save) -Image.register_save_all("PDF", _save_all) - -Image.register_extension("PDF", ".pdf") - -Image.register_mime("PDF", "application/pdf") diff --git a/.flatpak-builder/cache/objects/34/59c72d977e79d02bf1415d7da27b5a326ccae883a9d990c4749b682a605351.file b/.flatpak-builder/cache/objects/34/59c72d977e79d02bf1415d7da27b5a326ccae883a9d990c4749b682a605351.file deleted file mode 100644 index f886835..0000000 --- a/.flatpak-builder/cache/objects/34/59c72d977e79d02bf1415d7da27b5a326ccae883a9d990c4749b682a605351.file +++ /dev/null @@ -1,5 +0,0 @@ -[Runtime] -name=com.jeffser.Alpaca.Debug - -[ExtensionOf] -ref=app/com.jeffser.Alpaca/x86_64/master diff --git a/.flatpak-builder/cache/objects/34/b5ddd7c1f3596352ea3c3ebbe176f3aa43104f1fd9036095e9b8bfad151d77.dirtree b/.flatpak-builder/cache/objects/34/b5ddd7c1f3596352ea3c3ebbe176f3aa43104f1fd9036095e9b8bfad151d77.dirtree deleted file mode 100644 index f5cf03b0828f70507d8eef51ab393c1fa0dd5738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmV-;0f+uyUukY>bYEXCaCrbZ;WwAPih+7|S;?GdxjwCAL+cid{WIBLNH@U!SiY&=2CpEh8wnOe3HJJ9Pi+omZF6IC zX>fF9ZeM0)bYo~=cW-iQWpXZRa{ve3O!v4yLIdMVh0e7-#z6kytRrDhldQq^y_7^M zKB^mLWpra`E^v7OB|nx72vNLZ#zfyT>fap?5eTvcROv5SbKHoJ@8JaS336p|b!BsO zE^v7OT%I~iXkFSBb;YQrEeRDu0!yql5mw;U+|`YloNGG03vy+1aBpsNWiD`e0Eex_ z((6G@LyPdm&8zHcgfd)4LLFd#jGr(1p4Nkq7Yr=`TmYB=!T|078v$QmaCu{4V`ybx zUjSv0sd-EJki|IQp4K@F0o8{%&3DY^S5D=Cv$}`jVhu!U4)Gg&!DsWf1LcLs?(VjA W`lJ%o>~r=hi0cb%RER7LPA36xOseq! diff --git a/.flatpak-builder/cache/objects/34/cf2848d2c473468cb0b4eb9267abef0ea822778f581cdaa6a42b5de0d8688e.file b/.flatpak-builder/cache/objects/34/cf2848d2c473468cb0b4eb9267abef0ea822778f581cdaa6a42b5de0d8688e.file deleted file mode 100644 index 76bec7a5a11b320ddcf496a2ff14f98833e310f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10587 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 RLJ*Lu3q^se50EtH{{h?l4`KiS diff --git a/.flatpak-builder/cache/objects/35/53ba8f07c0ff0dc51e0cff9287a3f1527f006db8669283e24fb38205c0be4f.file b/.flatpak-builder/cache/objects/35/53ba8f07c0ff0dc51e0cff9287a3f1527f006db8669283e24fb38205c0be4f.file deleted file mode 100644 index 0444828..0000000 --- a/.flatpak-builder/cache/objects/35/53ba8f07c0ff0dc51e0cff9287a3f1527f006db8669283e24fb38205c0be4f.file +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/.flatpak-builder/cache/objects/35/e97d77b7a3cfd1ed980830d402905148c6ccfc0d3429a0996ae3e2a7b5e8fd.dirtree b/.flatpak-builder/cache/objects/35/e97d77b7a3cfd1ed980830d402905148c6ccfc0d3429a0996ae3e2a7b5e8fd.dirtree deleted file mode 100644 index 028072746069f5d51840162d6bcefbc8f50f5286..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 683 zcma!#&&&(|5r|KVtf;D@r0A|!;K@(+nt?u-2nIXp$FB}HH-w64mrT>fQh@JlEAR|oCe+4MxeRqnVwRnn>B zhq&&|4@#WH#W~6foU=xH`rE%=~qA@$<}O8J@o0!MlI)Y?p<%l$ykV+DeKN z^MGzI0{e5NjQ8qqr`7WRgnj&~bH#N^s^FGS=R)3Swbn&iYZvMr6DY~dP0cR_t6g)^ z;+~-Vy_j=NmiJsEwoC2RdfO*5r|8tf)|e1sTd!vB(xMztaIAMdonaPe5@36=CeL;I z7nYR=q7;^TMfb>>Japmvtk%O`T9OG?xF$(COz+ox$>u-*8qeNdq41zf?UaCZ+cKvk z6Qd`GN0xJxCuV|ePP>r3isM^|V&$0vugUNFR~tX&e{u5vuHDDo;=hDWd6dne%MioR z#;}RuJ_9GC5o0FfEXHGu?-<3I9GK$c3o4TnlQUA|;~74#oBnW%-{IA-p6|T-CnEX~ z%Nu8gEwfrRWPcvjzx(_AJeMrKkJ2><(?4%xe%gBc-Mek2zm^DHeN+5Rv*R^)PDqCi Ik6#oM070ZVRR910 diff --git a/.flatpak-builder/cache/objects/35/eeb7a3cc6b86bdd0e0ea12ec7cfc1e6f7415a3da1fde410a7f98e38f36e5c9.file b/.flatpak-builder/cache/objects/35/eeb7a3cc6b86bdd0e0ea12ec7cfc1e6f7415a3da1fde410a7f98e38f36e5c9.file deleted file mode 100644 index 589546d..0000000 --- a/.flatpak-builder/cache/objects/35/eeb7a3cc6b86bdd0e0ea12ec7cfc1e6f7415a3da1fde410a7f98e38f36e5c9.file +++ /dev/null @@ -1,153 +0,0 @@ - - - com.jeffser.Alpaca - CC0-1.0 - GPL-3.0-or-later - com.jeffser.Alpaca.desktop - Alpaca -

An Ollama client - -

Chat with multiple AI models

-

An Ollama client

-

Features

-
    -
  • Talk to multiple models in the same conversation
  • -
  • Pull and delete models from the app
  • -
-

Disclaimer

-

Отказ от ответственности

-

This project is not affiliated at all with Ollama, I'm not responsible for any damages to your device or software caused by running code given by any models.

-
- - Jeffry Samuel Eduarte Rojas - - - alpaca - - com.jeffser.Alpaca - - Utility - Development - Chat - - - #8cdef5 - #0f2b78 - - - - https://jeffser.com/images/alpaca/screenie1.png - Welcome dialog - - - https://jeffser.com/images/alpaca/screenie2.png - A conversation involving multiple models - - - https://jeffser.com/images/alpaca/screenie3.png - Managing models - - - - https://github.com/Jeffser/Alpaca/issues - https://github.com/Jeffser/Alpaca - https://github.com/sponsors/Jeffser - - - https://github.com/Jeffser/Alpaca/releases/tag/0.4.0 - -

Big Update

-
    -
  • Added code highlighting
  • -
  • Added image recognition (llava model)
  • -
  • Added multiline prompt
  • -
  • Fixed some small bugs
  • -
  • General optimization
  • -
-

- Please report any errors to the issues page, thank you. -

-
-
- - https://github.com/Jeffser/Alpaca/releases/tag/0.3.0 - -

Fixes and features

-
    -
  • Russian translation (thanks github/alexkdeveloper)
  • -
  • Fixed: Cannot close app on first setup
  • -
  • Fixed: Brand colors for Flathub
  • -
  • Fixed: App description
  • -
  • Fixed: Only show 'save changes dialog' when you actually change the url
  • -
-

- Please report any errors to the issues page, thank you. -

-
-
- - https://github.com/Jeffser/Alpaca/releases/tag/0.2.2 - -

0.2.2 Bug fixes

-
    -
  • Toast messages appearing behind dialogs
  • -
  • Local model list not updating when changing servers
  • -
  • Closing the setup dialog closes the whole app
  • -
-

- Please report any errors to the issues page, thank you. -

-
-
- - https://github.com/Jeffser/Alpaca/releases/tag/0.2.1 - -

0.2.1 Data saving fix

-

The app didn't save the config files and chat history to the right directory, this is now fixed

-

- Please report any errors to the issues page, thank you. -

-
-
- - https://github.com/Jeffser/Alpaca/releases/tag/0.2.0 - -

0.2.0

-

Big Update

-

New Features

-
    -
  • Restore chat after closing the app
  • -
  • A button to clear the chat
  • -
  • Fixed multiple bugs involving how messages are shown
  • -
  • Added welcome dialog
  • -
  • More stability
  • -
-

- Please report any errors to the issues page, thank you. -

-
-
- - https://github.com/Jeffser/Alpaca/releases/tag/0.1.2 - -

0.1.2 Quick fixes

-

This release fixes some metadata needed to have a proper Flatpak application

-
-
- - https://github.com/Jeffser/Alpaca/releases/tag/0.1.1 - -

0.1.1 Stable Release

-

This is the first public version of Alpaca

-

Features

-
    -
  • Talk to multiple models in the same conversation
  • -
  • Pull and delete models from the app
  • -
-

- Please report any errors to the issues page, thank you. -

-
-
-
- diff --git a/.flatpak-builder/cache/objects/36/226c35e3f1d789bfc67b5d39d2c9b294ff789e85ecdaf8c83cc4960daeacfe.file b/.flatpak-builder/cache/objects/36/226c35e3f1d789bfc67b5d39d2c9b294ff789e85ecdaf8c83cc4960daeacfe.file deleted file mode 100644 index 1a186810a02f507bc600ecd14ec027baa5dc25eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2317 zcma)7&1)M+6rb4-eOOW~S&3x3G?l-jxVGyijYH}N9GZqgF>!4Q5eds$yK)q-SIX=< zk050XF%?Wu=C{sOu9AQlXUo_ter4@Z7f3QkI(y0oQ*%b{1@=`!Py+%KM%|%l8}TIw1i_ABZ-k%g;`=_EJh5v zf+TJoN&FKAp%?JkBgRRNSrm2d(Ple*HMh8o5dUw55^s)=c=g4x-Nf}ROHnWN+UN#RZ?UUNu)?*PA1|) zN*&Sk70{$@Y$O3NZPaAHy>cmD_ZN1g5korg{vb#pV!V#@noFR8sGq>>MP2eGdIHiH zRAmhV33Z(t8MxGJ`w(h2~a+v@N4SaPky`V!y3G`QASj>eYdAR_KM?3CrRj;u55QoH()?rp5^N5qRM z2E3*i!;!%hcMYlBU6f(3p}Sae8+@F}FpE~6h(l_taTinuBXvS=Z`d;&t=_ljoUOW5 zSk|IS7XNp*Nkno)Ldf;K?{1P<8`xOfTlJ`Tc{J5O|*av zbi-a4JPlJMb8oOfI7;U%;+a3PHME!k;vP#V`4fzrX=Ub(kuGSlzL`#e0)qx z>hefhj4z4{vNm@0>u<)IT7ERW^0sYKNosmLwUoZNda79`2uU@m3&QB6l8TFpb`h9E zWH;=nodmLm%HebNTM~b4v zurRX`dJwYbK#8B4rj^+HmvVF(b(=g9)dksf*6t3|MPyM@lB#U7imaNR*%eh6GnWZT z5tG-_N>Vr5z7v&Y*%A@j4<>gjl~lnNr^!mfWD;o;YbLv-EtvQY@lgaOCWhI(Mvrgg za9GiruERR69)DkT>5ZX{LtWNT#j511&t3&VPB}?KT&D-7di?(g^v7kk-L}8Wh?&9o%W8x_>Xt;cZ%#iBWF}X zrwZ&&sHfDo6&lK{^4!^aBix~aK7%!N0AM0AyAkq z+%EPMdk%JjA660L>u!)rSNDd4A}XC-1$O}h6rL&%po4>hstfr+mji#OPsJdm_OsL5 zUz&M1@Oa==@3Wcb11|?2j{Mg9dghmbUkA2&CkosHZ*gX$y*dOjS5KqP4>mLRGbQe^ zcPl)y9Uh_i$ibs^Ko`sW>DTc-A=qdfI4v8*o> z@Qy$lAv3~!QWeRHbug@LkNES}HEG9lk$egZXy&vVK&mXpxOx)dzB1} S5e&Y)Oa7*^f8L|8oc<3bvJo-> diff --git a/.flatpak-builder/cache/objects/36/85548dad317da9da95337135068cd8d8568e950b9e13d1fe48d367e6b93344.file b/.flatpak-builder/cache/objects/36/85548dad317da9da95337135068cd8d8568e950b9e13d1fe48d367e6b93344.file deleted file mode 100644 index bd58ff1..0000000 --- a/.flatpak-builder/cache/objects/36/85548dad317da9da95337135068cd8d8568e950b9e13d1fe48d367e6b93344.file +++ /dev/null @@ -1,1186 +0,0 @@ -from __future__ import annotations - -import errno -import logging -import queue -import sys -import typing -import warnings -import weakref -from socket import timeout as SocketTimeout -from types import TracebackType - -from ._base_connection import _TYPE_BODY -from ._collections import HTTPHeaderDict -from ._request_methods import RequestMethods -from .connection import ( - BaseSSLError, - BrokenPipeError, - DummyConnection, - HTTPConnection, - HTTPException, - HTTPSConnection, - ProxyConfig, - _wrap_proxy_error, -) -from .connection import port_by_scheme as port_by_scheme -from .exceptions import ( - ClosedPoolError, - EmptyPoolError, - FullPoolError, - HostChangedError, - InsecureRequestWarning, - LocationValueError, - MaxRetryError, - NewConnectionError, - ProtocolError, - ProxyError, - ReadTimeoutError, - SSLError, - TimeoutError, -) -from .response import BaseHTTPResponse -from .util.connection import is_connection_dropped -from .util.proxy import connection_requires_http_tunnel -from .util.request import _TYPE_BODY_POSITION, set_file_position -from .util.retry import Retry -from .util.ssl_match_hostname import CertificateError -from .util.timeout import _DEFAULT_TIMEOUT, _TYPE_DEFAULT, Timeout -from .util.url import Url, _encode_target -from .util.url import _normalize_host as normalize_host -from .util.url import parse_url -from .util.util import to_str - -if typing.TYPE_CHECKING: - import ssl - from typing import Literal - - from ._base_connection import BaseHTTPConnection, BaseHTTPSConnection - -log = logging.getLogger(__name__) - -_TYPE_TIMEOUT = typing.Union[Timeout, float, _TYPE_DEFAULT, None] - -_SelfT = typing.TypeVar("_SelfT") - - -# Pool objects -class ConnectionPool: - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - - .. note:: - ConnectionPool.urlopen() does not normalize or percent-encode target URIs - which is useful if your target server doesn't support percent-encoded - target URIs. - """ - - scheme: str | None = None - QueueCls = queue.LifoQueue - - def __init__(self, host: str, port: int | None = None) -> None: - if not host: - raise LocationValueError("No host specified.") - - self.host = _normalize_host(host, scheme=self.scheme) - self.port = port - - # This property uses 'normalize_host()' (not '_normalize_host()') - # to avoid removing square braces around IPv6 addresses. - # This value is sent to `HTTPConnection.set_tunnel()` if called - # because square braces are required for HTTP CONNECT tunneling. - self._tunnel_host = normalize_host(host, scheme=self.scheme).lower() - - def __str__(self) -> str: - return f"{type(self).__name__}(host={self.host!r}, port={self.port!r})" - - def __enter__(self: _SelfT) -> _SelfT: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> Literal[False]: - self.close() - # Return False to re-raise any potential exceptions - return False - - def close(self) -> None: - """ - Close all pooled connections and disable the pool. - """ - - -# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} - - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`http.client.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`http.client.HTTPConnection`. - - :param timeout: - Socket timeout in seconds for each individual connection. This can - be a float or integer, which sets the timeout for the HTTP request, - or an instance of :class:`urllib3.util.Timeout` which gives you more - fine-grained control over request timeouts. After the constructor has - been parsed, this is always a `urllib3.util.Timeout` object. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to False, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param retries: - Retry configuration to use by default with requests in this pool. - - :param _proxy: - Parsed proxy URL, should not be used directly, instead, see - :class:`urllib3.ProxyManager` - - :param _proxy_headers: - A dictionary with proxy headers, should not be used directly, - instead, see :class:`urllib3.ProxyManager` - - :param \\**conn_kw: - Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, - :class:`urllib3.connection.HTTPSConnection` instances. - """ - - scheme = "http" - ConnectionCls: ( - type[BaseHTTPConnection] | type[BaseHTTPSConnection] - ) = HTTPConnection - - def __init__( - self, - host: str, - port: int | None = None, - timeout: _TYPE_TIMEOUT | None = _DEFAULT_TIMEOUT, - maxsize: int = 1, - block: bool = False, - headers: typing.Mapping[str, str] | None = None, - retries: Retry | bool | int | None = None, - _proxy: Url | None = None, - _proxy_headers: typing.Mapping[str, str] | None = None, - _proxy_config: ProxyConfig | None = None, - **conn_kw: typing.Any, - ): - ConnectionPool.__init__(self, host, port) - RequestMethods.__init__(self, headers) - - if not isinstance(timeout, Timeout): - timeout = Timeout.from_float(timeout) - - if retries is None: - retries = Retry.DEFAULT - - self.timeout = timeout - self.retries = retries - - self.pool: queue.LifoQueue[typing.Any] | None = self.QueueCls(maxsize) - self.block = block - - self.proxy = _proxy - self.proxy_headers = _proxy_headers or {} - self.proxy_config = _proxy_config - - # Fill the queue up so that doing get() on it will block properly - for _ in range(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - self.conn_kw = conn_kw - - if self.proxy: - # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. - # We cannot know if the user has added default socket options, so we cannot replace the - # list. - self.conn_kw.setdefault("socket_options", []) - - self.conn_kw["proxy"] = self.proxy - self.conn_kw["proxy_config"] = self.proxy_config - - # Do not pass 'self' as callback to 'finalize'. - # Then the 'finalize' would keep an endless living (leak) to self. - # By just passing a reference to the pool allows the garbage collector - # to free self if nobody else has a reference to it. - pool = self.pool - - # Close all the HTTPConnections in the pool before the - # HTTPConnectionPool object is garbage collected. - weakref.finalize(self, _close_pool_connections, pool) - - def _new_conn(self) -> BaseHTTPConnection: - """ - Return a fresh :class:`HTTPConnection`. - """ - self.num_connections += 1 - log.debug( - "Starting new HTTP connection (%d): %s:%s", - self.num_connections, - self.host, - self.port or "80", - ) - - conn = self.ConnectionCls( - host=self.host, - port=self.port, - timeout=self.timeout.connect_timeout, - **self.conn_kw, - ) - return conn - - def _get_conn(self, timeout: float | None = None) -> BaseHTTPConnection: - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - - if self.pool is None: - raise ClosedPoolError(self, "Pool is closed.") - - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - except AttributeError: # self.pool is None - raise ClosedPoolError(self, "Pool is closed.") from None # Defensive: - - except queue.Empty: - if self.block: - raise EmptyPoolError( - self, - "Pool is empty and a new connection can't be opened due to blocking mode.", - ) from None - pass # Oh well, we'll create a new connection then - - # If this is a persistent connection, check if it got disconnected - if conn and is_connection_dropped(conn): - log.debug("Resetting dropped connection: %s", self.host) - conn.close() - - return conn or self._new_conn() - - def _put_conn(self, conn: BaseHTTPConnection | None) -> None: - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is closed and discarded - because we exceeded maxsize. If connections are discarded frequently, - then maxsize should be increased. - - If the pool is closed, then the connection will be closed and discarded. - """ - if self.pool is not None: - try: - self.pool.put(conn, block=False) - return # Everything is dandy, done. - except AttributeError: - # self.pool is None. - pass - except queue.Full: - # Connection never got put back into the pool, close it. - if conn: - conn.close() - - if self.block: - # This should never happen if you got the conn from self._get_conn - raise FullPoolError( - self, - "Pool reached maximum size and no more connections are allowed.", - ) from None - - log.warning( - "Connection pool is full, discarding connection: %s. Connection pool size: %s", - self.host, - self.pool.qsize(), - ) - - # Connection never got put back into the pool, close it. - if conn: - conn.close() - - def _validate_conn(self, conn: BaseHTTPConnection) -> None: - """ - Called right before a request is made, after the socket is created. - """ - - def _prepare_proxy(self, conn: BaseHTTPConnection) -> None: - # Nothing to do for HTTP connections. - pass - - def _get_timeout(self, timeout: _TYPE_TIMEOUT) -> Timeout: - """Helper that always returns a :class:`urllib3.util.Timeout`""" - if timeout is _DEFAULT_TIMEOUT: - return self.timeout.clone() - - if isinstance(timeout, Timeout): - return timeout.clone() - else: - # User passed us an int/float. This is for backwards compatibility, - # can be removed later - return Timeout.from_float(timeout) - - def _raise_timeout( - self, - err: BaseSSLError | OSError | SocketTimeout, - url: str, - timeout_value: _TYPE_TIMEOUT | None, - ) -> None: - """Is the error actually a timeout? Will raise a ReadTimeout or pass""" - - if isinstance(err, SocketTimeout): - raise ReadTimeoutError( - self, url, f"Read timed out. (read timeout={timeout_value})" - ) from err - - # See the above comment about EAGAIN in Python 3. - if hasattr(err, "errno") and err.errno in _blocking_errnos: - raise ReadTimeoutError( - self, url, f"Read timed out. (read timeout={timeout_value})" - ) from err - - def _make_request( - self, - conn: BaseHTTPConnection, - method: str, - url: str, - body: _TYPE_BODY | None = None, - headers: typing.Mapping[str, str] | None = None, - retries: Retry | None = None, - timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, - chunked: bool = False, - response_conn: BaseHTTPConnection | None = None, - preload_content: bool = True, - decode_content: bool = True, - enforce_content_length: bool = True, - ) -> BaseHTTPResponse: - """ - Perform a request on a given urllib connection object taken from our - pool. - - :param conn: - a connection from one of our connection pools - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param url: - The URL to perform the request on. - - :param body: - Data to send in the request body, either :class:`str`, :class:`bytes`, - an iterable of :class:`str`/:class:`bytes`, or a file-like object. - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Configure the number of retries to allow before raising a - :class:`~urllib3.exceptions.MaxRetryError` exception. - - Pass ``None`` to retry until you receive a response. Pass a - :class:`~urllib3.util.retry.Retry` object for fine-grained control - over different types of retries. - Pass an integer number to retry connection errors that many times, - but no other types of errors. Pass zero to never retry. - - If ``False``, then retries are disabled and any exception is raised - immediately. Also, instead of raising a MaxRetryError on redirects, - the redirect response will be returned. - - :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param chunked: - If True, urllib3 will send the body using chunked transfer - encoding. Otherwise, urllib3 will send the body using the standard - content-length form. Defaults to False. - - :param response_conn: - Set this to ``None`` if you will handle releasing the connection or - set the connection to have the response release it. - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param enforce_content_length: - Enforce content length checking. Body returned by server must match - value of Content-Length header, if present. Otherwise, raise error. - """ - self.num_requests += 1 - - timeout_obj = self._get_timeout(timeout) - timeout_obj.start_connect() - conn.timeout = Timeout.resolve_default_timeout(timeout_obj.connect_timeout) - - try: - # Trigger any extra validation we need to do. - try: - self._validate_conn(conn) - except (SocketTimeout, BaseSSLError) as e: - self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) - raise - - # _validate_conn() starts the connection to an HTTPS proxy - # so we need to wrap errors with 'ProxyError' here too. - except ( - OSError, - NewConnectionError, - TimeoutError, - BaseSSLError, - CertificateError, - SSLError, - ) as e: - new_e: Exception = e - if isinstance(e, (BaseSSLError, CertificateError)): - new_e = SSLError(e) - # If the connection didn't successfully connect to it's proxy - # then there - if isinstance( - new_e, (OSError, NewConnectionError, TimeoutError, SSLError) - ) and (conn and conn.proxy and not conn.has_connected_to_proxy): - new_e = _wrap_proxy_error(new_e, conn.proxy.scheme) - raise new_e - - # conn.request() calls http.client.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. - try: - conn.request( - method, - url, - body=body, - headers=headers, - chunked=chunked, - preload_content=preload_content, - decode_content=decode_content, - enforce_content_length=enforce_content_length, - ) - - # We are swallowing BrokenPipeError (errno.EPIPE) since the server is - # legitimately able to close the connection after sending a valid response. - # With this behaviour, the received response is still readable. - except BrokenPipeError: - pass - except OSError as e: - # MacOS/Linux - # EPROTOTYPE and ECONNRESET are needed on macOS - # https://erickt.github.io/blog/2014/11/19/adventures-in-debugging-a-potential-osx-kernel-bug/ - # Condition changed later to emit ECONNRESET instead of only EPROTOTYPE. - if e.errno != errno.EPROTOTYPE and e.errno != errno.ECONNRESET: - raise - - # Reset the timeout for the recv() on the socket - read_timeout = timeout_obj.read_timeout - - if not conn.is_closed: - # In Python 3 socket.py will catch EAGAIN and return None when you - # try and read into the file pointer created by http.client, which - # instead raises a BadStatusLine exception. Instead of catching - # the exception and assuming all BadStatusLine exceptions are read - # timeouts, check for a zero timeout before making the request. - if read_timeout == 0: - raise ReadTimeoutError( - self, url, f"Read timed out. (read timeout={read_timeout})" - ) - conn.timeout = read_timeout - - # Receive the response from the server - try: - response = conn.getresponse() - except (BaseSSLError, OSError) as e: - self._raise_timeout(err=e, url=url, timeout_value=read_timeout) - raise - - # Set properties that are used by the pooling layer. - response.retries = retries - response._connection = response_conn # type: ignore[attr-defined] - response._pool = self # type: ignore[attr-defined] - - # emscripten connection doesn't have _http_vsn_str - http_version = getattr(conn, "_http_vsn_str", "HTTP/?") - log.debug( - '%s://%s:%s "%s %s %s" %s %s', - self.scheme, - self.host, - self.port, - method, - url, - # HTTP version - http_version, - response.status, - response.length_remaining, - ) - - return response - - def close(self) -> None: - """ - Close all pooled connections and disable the pool. - """ - if self.pool is None: - return - # Disable access to the pool - old_pool, self.pool = self.pool, None - - # Close all the HTTPConnections in the pool. - _close_pool_connections(old_pool) - - def is_same_host(self, url: str) -> bool: - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - if url.startswith("/"): - return True - - # TODO: Add optional support for socket.gethostbyname checking. - scheme, _, host, port, *_ = parse_url(url) - scheme = scheme or "http" - if host is not None: - host = _normalize_host(host, scheme=scheme) - - # Use explicit default port for comparison when none is given - if self.port and not port: - port = port_by_scheme.get(scheme) - elif not self.port and port == port_by_scheme.get(scheme): - port = None - - return (scheme, host, port) == (self.scheme, self.host, self.port) - - def urlopen( # type: ignore[override] - self, - method: str, - url: str, - body: _TYPE_BODY | None = None, - headers: typing.Mapping[str, str] | None = None, - retries: Retry | bool | int | None = None, - redirect: bool = True, - assert_same_host: bool = True, - timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, - pool_timeout: int | None = None, - release_conn: bool | None = None, - chunked: bool = False, - body_pos: _TYPE_BODY_POSITION | None = None, - preload_content: bool = True, - decode_content: bool = True, - **response_kw: typing.Any, - ) -> BaseHTTPResponse: - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method - such as :meth:`request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param url: - The URL to perform the request on. - - :param body: - Data to send in the request body, either :class:`str`, :class:`bytes`, - an iterable of :class:`str`/:class:`bytes`, or a file-like object. - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Configure the number of retries to allow before raising a - :class:`~urllib3.exceptions.MaxRetryError` exception. - - If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a - :class:`~urllib3.util.retry.Retry` object for fine-grained control - over different types of retries. - Pass an integer number to retry connection errors that many times, - but no other types of errors. Pass zero to never retry. - - If ``False``, then retries are disabled and any exception is raised - immediately. Also, instead of raising a MaxRetryError on redirects, - the redirect response will be returned. - - :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. Disabling retries - will disable redirect, too. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When ``False``, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param bool preload_content: - If True, the response's body will be preloaded into memory. - - :param bool decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of ``preload_content`` - which defaults to ``True``. - - :param bool chunked: - If True, urllib3 will send the body using chunked transfer - encoding. Otherwise, urllib3 will send the body using the standard - content-length form. Defaults to False. - - :param int body_pos: - Position to seek to in file-like body in the event of a retry or - redirect. Typically this won't need to be set because urllib3 will - auto-populate the value when needed. - """ - parsed_url = parse_url(url) - destination_scheme = parsed_url.scheme - - if headers is None: - headers = self.headers - - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect, default=self.retries) - - if release_conn is None: - release_conn = preload_content - - # Check host - if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries) - - # Ensure that the URL we're connecting to is properly encoded - if url.startswith("/"): - url = to_str(_encode_target(url)) - else: - url = to_str(parsed_url.url) - - conn = None - - # Track whether `conn` needs to be released before - # returning/raising/recursing. Update this variable if necessary, and - # leave `release_conn` constant throughout the function. That way, if - # the function recurses, the original value of `release_conn` will be - # passed down into the recursive call, and its value will be respected. - # - # See issue #651 [1] for details. - # - # [1] - release_this_conn = release_conn - - http_tunnel_required = connection_requires_http_tunnel( - self.proxy, self.proxy_config, destination_scheme - ) - - # Merge the proxy headers. Only done when not using HTTP CONNECT. We - # have to copy the headers dict so we can safely change it without those - # changes being reflected in anyone else's copy. - if not http_tunnel_required: - headers = headers.copy() # type: ignore[attr-defined] - headers.update(self.proxy_headers) # type: ignore[union-attr] - - # Must keep the exception bound to a separate variable or else Python 3 - # complains about UnboundLocalError. - err = None - - # Keep track of whether we cleanly exited the except block. This - # ensures we do proper cleanup in finally. - clean_exit = False - - # Rewind body position, if needed. Record current position - # for future rewinds in the event of a redirect/retry. - body_pos = set_file_position(body, body_pos) - - try: - # Request a connection from the queue. - timeout_obj = self._get_timeout(timeout) - conn = self._get_conn(timeout=pool_timeout) - - conn.timeout = timeout_obj.connect_timeout # type: ignore[assignment] - - # Is this a closed/new connection that requires CONNECT tunnelling? - if self.proxy is not None and http_tunnel_required and conn.is_closed: - try: - self._prepare_proxy(conn) - except (BaseSSLError, OSError, SocketTimeout) as e: - self._raise_timeout( - err=e, url=self.proxy.url, timeout_value=conn.timeout - ) - raise - - # If we're going to release the connection in ``finally:``, then - # the response doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = conn if not release_conn else None - - # Make the request on the HTTPConnection object - response = self._make_request( - conn, - method, - url, - timeout=timeout_obj, - body=body, - headers=headers, - chunked=chunked, - retries=retries, - response_conn=response_conn, - preload_content=preload_content, - decode_content=decode_content, - **response_kw, - ) - - # Everything went great! - clean_exit = True - - except EmptyPoolError: - # Didn't get a connection from the pool, no need to clean up - clean_exit = True - release_this_conn = False - raise - - except ( - TimeoutError, - HTTPException, - OSError, - ProtocolError, - BaseSSLError, - SSLError, - CertificateError, - ProxyError, - ) as e: - # Discard the connection for these exceptions. It will be - # replaced during the next _get_conn() call. - clean_exit = False - new_e: Exception = e - if isinstance(e, (BaseSSLError, CertificateError)): - new_e = SSLError(e) - if isinstance( - new_e, - ( - OSError, - NewConnectionError, - TimeoutError, - SSLError, - HTTPException, - ), - ) and (conn and conn.proxy and not conn.has_connected_to_proxy): - new_e = _wrap_proxy_error(new_e, conn.proxy.scheme) - elif isinstance(new_e, (OSError, HTTPException)): - new_e = ProtocolError("Connection aborted.", new_e) - - retries = retries.increment( - method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2] - ) - retries.sleep() - - # Keep track of the error for the retry warning. - err = e - - finally: - if not clean_exit: - # We hit some kind of exception, handled or otherwise. We need - # to throw the connection away unless explicitly told not to. - # Close the connection, set the variable to None, and make sure - # we put the None back in the pool to avoid leaking it. - if conn: - conn.close() - conn = None - release_this_conn = True - - if release_this_conn: - # Put the connection back to be reused. If the connection is - # expired then it will be None, which will get replaced with a - # fresh connection during _get_conn. - self._put_conn(conn) - - if not conn: - # Try again - log.warning( - "Retrying (%r) after connection broken by '%r': %s", retries, err, url - ) - return self.urlopen( - method, - url, - body, - headers, - retries, - redirect, - assert_same_host, - timeout=timeout, - pool_timeout=pool_timeout, - release_conn=release_conn, - chunked=chunked, - body_pos=body_pos, - preload_content=preload_content, - decode_content=decode_content, - **response_kw, - ) - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - if response.status == 303: - # Change the method according to RFC 9110, Section 15.4.4. - method = "GET" - # And lose the body not to transfer anything sensitive. - body = None - headers = HTTPHeaderDict(headers)._prepare_for_method_change() - - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - response.drain_conn() - raise - return response - - response.drain_conn() - retries.sleep_for_retry(response) - log.debug("Redirecting %s -> %s", url, redirect_location) - return self.urlopen( - method, - redirect_location, - body, - headers, - retries=retries, - redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, - pool_timeout=pool_timeout, - release_conn=release_conn, - chunked=chunked, - body_pos=body_pos, - preload_content=preload_content, - decode_content=decode_content, - **response_kw, - ) - - # Check if we should retry the HTTP response. - has_retry_after = bool(response.headers.get("Retry-After")) - if retries.is_retry(method, response.status, has_retry_after): - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_status: - response.drain_conn() - raise - return response - - response.drain_conn() - retries.sleep(response) - log.debug("Retry: %s", url) - return self.urlopen( - method, - url, - body, - headers, - retries=retries, - redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, - pool_timeout=pool_timeout, - release_conn=release_conn, - chunked=chunked, - body_pos=body_pos, - preload_content=preload_content, - decode_content=decode_content, - **response_kw, - ) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - :class:`.HTTPSConnection` uses one of ``assert_fingerprint``, - ``assert_hostname`` and ``host`` in this order to verify connections. - If ``assert_hostname`` is False, no verification is done. - - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, - ``ca_cert_dir``, ``ssl_version``, ``key_password`` are only used if :mod:`ssl` - is available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade - the connection socket into an SSL socket. - """ - - scheme = "https" - ConnectionCls: type[BaseHTTPSConnection] = HTTPSConnection - - def __init__( - self, - host: str, - port: int | None = None, - timeout: _TYPE_TIMEOUT | None = _DEFAULT_TIMEOUT, - maxsize: int = 1, - block: bool = False, - headers: typing.Mapping[str, str] | None = None, - retries: Retry | bool | int | None = None, - _proxy: Url | None = None, - _proxy_headers: typing.Mapping[str, str] | None = None, - key_file: str | None = None, - cert_file: str | None = None, - cert_reqs: int | str | None = None, - key_password: str | None = None, - ca_certs: str | None = None, - ssl_version: int | str | None = None, - ssl_minimum_version: ssl.TLSVersion | None = None, - ssl_maximum_version: ssl.TLSVersion | None = None, - assert_hostname: str | Literal[False] | None = None, - assert_fingerprint: str | None = None, - ca_cert_dir: str | None = None, - **conn_kw: typing.Any, - ) -> None: - super().__init__( - host, - port, - timeout, - maxsize, - block, - headers, - retries, - _proxy, - _proxy_headers, - **conn_kw, - ) - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.key_password = key_password - self.ca_certs = ca_certs - self.ca_cert_dir = ca_cert_dir - self.ssl_version = ssl_version - self.ssl_minimum_version = ssl_minimum_version - self.ssl_maximum_version = ssl_maximum_version - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - - def _prepare_proxy(self, conn: HTTPSConnection) -> None: # type: ignore[override] - """Establishes a tunnel connection through HTTP CONNECT.""" - if self.proxy and self.proxy.scheme == "https": - tunnel_scheme = "https" - else: - tunnel_scheme = "http" - - conn.set_tunnel( - scheme=tunnel_scheme, - host=self._tunnel_host, - port=self.port, - headers=self.proxy_headers, - ) - conn.connect() - - def _new_conn(self) -> BaseHTTPSConnection: - """ - Return a fresh :class:`urllib3.connection.HTTPConnection`. - """ - self.num_connections += 1 - log.debug( - "Starting new HTTPS connection (%d): %s:%s", - self.num_connections, - self.host, - self.port or "443", - ) - - if not self.ConnectionCls or self.ConnectionCls is DummyConnection: # type: ignore[comparison-overlap] - raise ImportError( - "Can't connect to HTTPS URL because the SSL module is not available." - ) - - actual_host: str = self.host - actual_port = self.port - if self.proxy is not None and self.proxy.host is not None: - actual_host = self.proxy.host - actual_port = self.proxy.port - - return self.ConnectionCls( - host=actual_host, - port=actual_port, - timeout=self.timeout.connect_timeout, - cert_file=self.cert_file, - key_file=self.key_file, - key_password=self.key_password, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint, - ssl_version=self.ssl_version, - ssl_minimum_version=self.ssl_minimum_version, - ssl_maximum_version=self.ssl_maximum_version, - **self.conn_kw, - ) - - def _validate_conn(self, conn: BaseHTTPConnection) -> None: - """ - Called right before a request is made, after the socket is created. - """ - super()._validate_conn(conn) - - # Force connect early to allow us to validate the connection. - if conn.is_closed: - conn.connect() - - # TODO revise this, see https://github.com/urllib3/urllib3/issues/2791 - if not conn.is_verified and not conn.proxy_is_verified: - warnings.warn( - ( - f"Unverified HTTPS request is being made to host '{conn.host}'. " - "Adding certificate verification is strongly advised. See: " - "https://urllib3.readthedocs.io/en/latest/advanced-usage.html" - "#tls-warnings" - ), - InsecureRequestWarning, - ) - - -def connection_from_url(url: str, **kw: typing.Any) -> HTTPConnectionPool: - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \\**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example:: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, _, host, port, *_ = parse_url(url) - scheme = scheme or "http" - port = port or port_by_scheme.get(scheme, 80) - if scheme == "https": - return HTTPSConnectionPool(host, port=port, **kw) # type: ignore[arg-type] - else: - return HTTPConnectionPool(host, port=port, **kw) # type: ignore[arg-type] - - -@typing.overload -def _normalize_host(host: None, scheme: str | None) -> None: - ... - - -@typing.overload -def _normalize_host(host: str, scheme: str | None) -> str: - ... - - -def _normalize_host(host: str | None, scheme: str | None) -> str | None: - """ - Normalize hosts for comparisons and use with sockets. - """ - - host = normalize_host(host, scheme) - - # httplib doesn't like it when we include brackets in IPv6 addresses - # Specifically, if we include brackets but also pass the port then - # httplib crazily doubles up the square brackets on the Host header. - # Instead, we need to make sure we never pass ``None`` as the port. - # However, for backward compatibility reasons we can't actually - # *assert* that. See http://bugs.python.org/issue28539 - if host and host.startswith("[") and host.endswith("]"): - host = host[1:-1] - return host - - -def _url_from_pool( - pool: HTTPConnectionPool | HTTPSConnectionPool, path: str | None = None -) -> str: - """Returns the URL from a given connection pool. This is mainly used for testing and logging.""" - return Url(scheme=pool.scheme, host=pool.host, port=pool.port, path=path).url - - -def _close_pool_connections(pool: queue.LifoQueue[typing.Any]) -> None: - """Drains a queue of connections and closes each one.""" - try: - while True: - conn = pool.get(block=False) - if conn: - conn.close() - except queue.Empty: - pass # Done. diff --git a/.flatpak-builder/cache/objects/36/e7e6271b66b146f07362ed3af160ca0c55204d0fecd3d3dc1c509404df7867.dirtree b/.flatpak-builder/cache/objects/36/e7e6271b66b146f07362ed3af160ca0c55204d0fecd3d3dc1c509404df7867.dirtree deleted file mode 100644 index 2f0c16c2bb208c5fd93707556835ea4d8cc4e1f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmdN(&n(GI&&w}LW%!hs#G;a?yWV=?v>w6t`2sUiO_Vj-@A0~STCza-&L30m+|-i9 zl*E!mhS}C}PC3eFSuPuVljhj8+n#&n!*!kEGFQT+e=OV}7ypn`CoC;9C$*SiLau?E zisiJjBTs!3(oeB8zutGsvFh#h_l{Z*-r4WG{?#Rm@1u0h!Sv7Dn4h*DfA?-%>8~Y1 zSKkzW)9iT7ofFcb##WYC#L)Kb{-Vl*s*5s@OHV%9dGPbX6XKt@vY)jnYZLr)$o6*v LAyZUXJo+L40GM(o diff --git a/.flatpak-builder/cache/objects/37/0f941c5d91300dc7b8b951b5b6128d7b40c1c1899e68f096c0987cb3a0d496.file b/.flatpak-builder/cache/objects/37/0f941c5d91300dc7b8b951b5b6128d7b40c1c1899e68f096c0987cb3a0d496.file deleted file mode 100644 index 8fbcd65..0000000 --- a/.flatpak-builder/cache/objects/37/0f941c5d91300dc7b8b951b5b6128d7b40c1c1899e68f096c0987cb3a0d496.file +++ /dev/null @@ -1,134 +0,0 @@ -"""Module containing bug report helper(s).""" - -import json -import platform -import ssl -import sys - -import idna -import urllib3 - -from . import __version__ as requests_version - -try: - import charset_normalizer -except ImportError: - charset_normalizer = None - -try: - import chardet -except ImportError: - chardet = None - -try: - from urllib3.contrib import pyopenssl -except ImportError: - pyopenssl = None - OpenSSL = None - cryptography = None -else: - import cryptography - import OpenSSL - - -def _implementation(): - """Return a dict with the Python implementation and version. - - Provide both the name and the version of the Python implementation - currently running. For example, on CPython 3.10.3 it will return - {'name': 'CPython', 'version': '3.10.3'}. - - This function works best on CPython and PyPy: in particular, it probably - doesn't work for Jython or IronPython. Future investigation should be done - to work out the correct shape of the code for those platforms. - """ - implementation = platform.python_implementation() - - if implementation == "CPython": - implementation_version = platform.python_version() - elif implementation == "PyPy": - implementation_version = "{}.{}.{}".format( - sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro, - ) - if sys.pypy_version_info.releaselevel != "final": - implementation_version = "".join( - [implementation_version, sys.pypy_version_info.releaselevel] - ) - elif implementation == "Jython": - implementation_version = platform.python_version() # Complete Guess - elif implementation == "IronPython": - implementation_version = platform.python_version() # Complete Guess - else: - implementation_version = "Unknown" - - return {"name": implementation, "version": implementation_version} - - -def info(): - """Generate information for a bug report.""" - try: - platform_info = { - "system": platform.system(), - "release": platform.release(), - } - except OSError: - platform_info = { - "system": "Unknown", - "release": "Unknown", - } - - implementation_info = _implementation() - urllib3_info = {"version": urllib3.__version__} - charset_normalizer_info = {"version": None} - chardet_info = {"version": None} - if charset_normalizer: - charset_normalizer_info = {"version": charset_normalizer.__version__} - if chardet: - chardet_info = {"version": chardet.__version__} - - pyopenssl_info = { - "version": None, - "openssl_version": "", - } - if OpenSSL: - pyopenssl_info = { - "version": OpenSSL.__version__, - "openssl_version": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}", - } - cryptography_info = { - "version": getattr(cryptography, "__version__", ""), - } - idna_info = { - "version": getattr(idna, "__version__", ""), - } - - system_ssl = ssl.OPENSSL_VERSION_NUMBER - system_ssl_info = {"version": f"{system_ssl:x}" if system_ssl is not None else ""} - - return { - "platform": platform_info, - "implementation": implementation_info, - "system_ssl": system_ssl_info, - "using_pyopenssl": pyopenssl is not None, - "using_charset_normalizer": chardet is None, - "pyOpenSSL": pyopenssl_info, - "urllib3": urllib3_info, - "chardet": chardet_info, - "charset_normalizer": charset_normalizer_info, - "cryptography": cryptography_info, - "idna": idna_info, - "requests": { - "version": requests_version, - }, - } - - -def main(): - """Pretty-print the bug information as JSON.""" - print(json.dumps(info(), sort_keys=True, indent=2)) - - -if __name__ == "__main__": - main() diff --git a/.flatpak-builder/cache/objects/37/50704667777c1e4d1067254c3dfcb2e4489586de98a54fba30392faabee297.file b/.flatpak-builder/cache/objects/37/50704667777c1e4d1067254c3dfcb2e4489586de98a54fba30392faabee297.file deleted file mode 100644 index b338169..0000000 --- a/.flatpak-builder/cache/objects/37/50704667777c1e4d1067254c3dfcb2e4489586de98a54fba30392faabee297.file +++ /dev/null @@ -1 +0,0 @@ -PIL diff --git a/.flatpak-builder/cache/objects/37/788562e56c75583a248baea2e0c4d2f95dfff72cbf2a25789af1aa5f5975d9.dirtree b/.flatpak-builder/cache/objects/37/788562e56c75583a248baea2e0c4d2f95dfff72cbf2a25789af1aa5f5975d9.dirtree deleted file mode 100644 index 14d061adacdae9415473865d2eee17099e48d9ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcma!#&& z3sUoni*rD#XCK@gCR%iK67${UPVr>#4Ij=na6Gupnkw*nzT4jgF?)E6^OLiSK`PVZ z){4|yIB(h_nErVi^V8Pj@7`@I{k25s z>YL(knjNpXb3!_Fcv5qVlZ!G7N>cL}Ot#*=e(-Z-a?mRqyWJ1VKCf~X@Rz^IoG|s} Tj{R#zWy=W}rp@g)yMqA$gY}Fl diff --git a/.flatpak-builder/cache/objects/37/d29f4a795e7ef0171e39371162b33b526c21e3995b09fb4c8e28fb32fd4592.file b/.flatpak-builder/cache/objects/37/d29f4a795e7ef0171e39371162b33b526c21e3995b09fb4c8e28fb32fd4592.file deleted file mode 100644 index 1e0c1c1..0000000 --- a/.flatpak-builder/cache/objects/37/d29f4a795e7ef0171e39371162b33b526c21e3995b09fb4c8e28fb32fd4592.file +++ /dev/null @@ -1,134 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# base class for raster font file parsers -# -# history: -# 1997-06-05 fl created -# 1997-08-19 fl restrict image width -# -# Copyright (c) 1997-1998 by Secret Labs AB -# Copyright (c) 1997-1998 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -from typing import BinaryIO - -from . import Image, _binary - -WIDTH = 800 - - -def puti16( - fp: BinaryIO, values: tuple[int, int, int, int, int, int, int, int, int, int] -) -> None: - """Write network order (big-endian) 16-bit sequence""" - for v in values: - if v < 0: - v += 65536 - fp.write(_binary.o16be(v)) - - -class FontFile: - """Base class for raster font file handlers.""" - - bitmap: Image.Image | None = None - - def __init__(self) -> None: - self.info: dict[bytes, bytes | int] = {} - self.glyph: list[ - tuple[ - tuple[int, int], - tuple[int, int, int, int], - tuple[int, int, int, int], - Image.Image, - ] - | None - ] = [None] * 256 - - def __getitem__(self, ix: int) -> ( - tuple[ - tuple[int, int], - tuple[int, int, int, int], - tuple[int, int, int, int], - Image.Image, - ] - | None - ): - return self.glyph[ix] - - def compile(self) -> None: - """Create metrics and bitmap""" - - if self.bitmap: - return - - # create bitmap large enough to hold all data - h = w = maxwidth = 0 - lines = 1 - for glyph in self.glyph: - if glyph: - d, dst, src, im = glyph - h = max(h, src[3] - src[1]) - w = w + (src[2] - src[0]) - if w > WIDTH: - lines += 1 - w = src[2] - src[0] - maxwidth = max(maxwidth, w) - - xsize = maxwidth - ysize = lines * h - - if xsize == 0 and ysize == 0: - return - - self.ysize = h - - # paste glyphs into bitmap - self.bitmap = Image.new("1", (xsize, ysize)) - self.metrics: list[ - tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]] - | None - ] = [None] * 256 - x = y = 0 - for i in range(256): - glyph = self[i] - if glyph: - d, dst, src, im = glyph - xx = src[2] - src[0] - x0, y0 = x, y - x = x + xx - if x > WIDTH: - x, y = 0, y + h - x0, y0 = x, y - x = xx - s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 - self.bitmap.paste(im.crop(src), s) - self.metrics[i] = d, dst, s - - def save(self, filename: str) -> None: - """Save font""" - - self.compile() - - # font data - if not self.bitmap: - msg = "No bitmap created" - raise ValueError(msg) - self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") - - # font metrics - with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: - fp.write(b"PILfont\n") - fp.write(f";;;;;;{self.ysize};\n".encode("ascii")) # HACK!!! - fp.write(b"DATA\n") - for id in range(256): - m = self.metrics[id] - if not m: - puti16(fp, (0,) * 10) - else: - puti16(fp, m[0] + m[1] + m[2]) diff --git a/.flatpak-builder/cache/objects/37/d6ce2c640d84f8d85f4de6624e553cf2b965ab8f5ef6ddb41b524a8a5cd182.file b/.flatpak-builder/cache/objects/37/d6ce2c640d84f8d85f4de6624e553cf2b965ab8f5ef6ddb41b524a8a5cd182.file deleted file mode 100755 index 96d277b1d95e717fffcf784a694d3c9410d002f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32304 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 half: - break - v.append(j) - return v - - def _getrms(self): - """Get RMS for each layer""" - return [math.sqrt(self.sum2[i] / self.count[i]) for i in self.bands] - - def _getvar(self): - """Get variance for each layer""" - return [ - (self.sum2[i] - (self.sum[i] ** 2.0) / self.count[i]) / self.count[i] - for i in self.bands - ] - - def _getstddev(self): - """Get standard deviation for each layer""" - return [math.sqrt(self.var[i]) for i in self.bands] - - -Global = Stat # compatibility diff --git a/.flatpak-builder/cache/objects/38/88bd6ac611d157cb27b4e05901786ed98aacd686c785107996945b33f25214.file b/.flatpak-builder/cache/objects/38/88bd6ac611d157cb27b4e05901786ed98aacd686c785107996945b33f25214.file deleted file mode 100644 index 77897aa..0000000 --- a/.flatpak-builder/cache/objects/38/88bd6ac611d157cb27b4e05901786ed98aacd686c785107996945b33f25214.file +++ /dev/null @@ -1,615 +0,0 @@ -from functools import lru_cache -from logging import getLogger -from typing import List, Optional - -from .constant import ( - COMMON_SAFE_ASCII_CHARACTERS, - TRACE, - UNICODE_SECONDARY_RANGE_KEYWORD, -) -from .utils import ( - is_accentuated, - is_arabic, - is_arabic_isolated_form, - is_case_variable, - is_cjk, - is_emoticon, - is_hangul, - is_hiragana, - is_katakana, - is_latin, - is_punctuation, - is_separator, - is_symbol, - is_thai, - is_unprintable, - remove_accent, - unicode_range, -) - - -class MessDetectorPlugin: - """ - Base abstract class used for mess detection plugins. - All detectors MUST extend and implement given methods. - """ - - def eligible(self, character: str) -> bool: - """ - Determine if given character should be fed in. - """ - raise NotImplementedError # pragma: nocover - - def feed(self, character: str) -> None: - """ - The main routine to be executed upon character. - Insert the logic in witch the text would be considered chaotic. - """ - raise NotImplementedError # pragma: nocover - - def reset(self) -> None: # pragma: no cover - """ - Permit to reset the plugin to the initial state. - """ - raise NotImplementedError - - @property - def ratio(self) -> float: - """ - Compute the chaos ratio based on what your feed() has seen. - Must NOT be lower than 0.; No restriction gt 0. - """ - raise NotImplementedError # pragma: nocover - - -class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._punctuation_count: int = 0 - self._symbol_count: int = 0 - self._character_count: int = 0 - - self._last_printable_char: Optional[str] = None - self._frenzy_symbol_in_word: bool = False - - def eligible(self, character: str) -> bool: - return character.isprintable() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if ( - character != self._last_printable_char - and character not in COMMON_SAFE_ASCII_CHARACTERS - ): - if is_punctuation(character): - self._punctuation_count += 1 - elif ( - character.isdigit() is False - and is_symbol(character) - and is_emoticon(character) is False - ): - self._symbol_count += 2 - - self._last_printable_char = character - - def reset(self) -> None: # pragma: no cover - self._punctuation_count = 0 - self._character_count = 0 - self._symbol_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - ratio_of_punctuation: float = ( - self._punctuation_count + self._symbol_count - ) / self._character_count - - return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 - - -class TooManyAccentuatedPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._character_count: int = 0 - self._accentuated_count: int = 0 - - def eligible(self, character: str) -> bool: - return character.isalpha() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if is_accentuated(character): - self._accentuated_count += 1 - - def reset(self) -> None: # pragma: no cover - self._character_count = 0 - self._accentuated_count = 0 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - ratio_of_accentuation: float = self._accentuated_count / self._character_count - return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 - - -class UnprintablePlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._unprintable_count: int = 0 - self._character_count: int = 0 - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - if is_unprintable(character): - self._unprintable_count += 1 - self._character_count += 1 - - def reset(self) -> None: # pragma: no cover - self._unprintable_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return (self._unprintable_count * 8) / self._character_count - - -class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._successive_count: int = 0 - self._character_count: int = 0 - - self._last_latin_character: Optional[str] = None - - def eligible(self, character: str) -> bool: - return character.isalpha() and is_latin(character) - - def feed(self, character: str) -> None: - self._character_count += 1 - if ( - self._last_latin_character is not None - and is_accentuated(character) - and is_accentuated(self._last_latin_character) - ): - if character.isupper() and self._last_latin_character.isupper(): - self._successive_count += 1 - # Worse if its the same char duplicated with different accent. - if remove_accent(character) == remove_accent(self._last_latin_character): - self._successive_count += 1 - self._last_latin_character = character - - def reset(self) -> None: # pragma: no cover - self._successive_count = 0 - self._character_count = 0 - self._last_latin_character = None - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return (self._successive_count * 2) / self._character_count - - -class SuspiciousRange(MessDetectorPlugin): - def __init__(self) -> None: - self._suspicious_successive_range_count: int = 0 - self._character_count: int = 0 - self._last_printable_seen: Optional[str] = None - - def eligible(self, character: str) -> bool: - return character.isprintable() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if ( - character.isspace() - or is_punctuation(character) - or character in COMMON_SAFE_ASCII_CHARACTERS - ): - self._last_printable_seen = None - return - - if self._last_printable_seen is None: - self._last_printable_seen = character - return - - unicode_range_a: Optional[str] = unicode_range(self._last_printable_seen) - unicode_range_b: Optional[str] = unicode_range(character) - - if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): - self._suspicious_successive_range_count += 1 - - self._last_printable_seen = character - - def reset(self) -> None: # pragma: no cover - self._character_count = 0 - self._suspicious_successive_range_count = 0 - self._last_printable_seen = None - - @property - def ratio(self) -> float: - if self._character_count <= 24: - return 0.0 - - ratio_of_suspicious_range_usage: float = ( - self._suspicious_successive_range_count * 2 - ) / self._character_count - - return ratio_of_suspicious_range_usage - - -class SuperWeirdWordPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._word_count: int = 0 - self._bad_word_count: int = 0 - self._foreign_long_count: int = 0 - - self._is_current_word_bad: bool = False - self._foreign_long_watch: bool = False - - self._character_count: int = 0 - self._bad_character_count: int = 0 - - self._buffer: str = "" - self._buffer_accent_count: int = 0 - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - if character.isalpha(): - self._buffer += character - if is_accentuated(character): - self._buffer_accent_count += 1 - if ( - self._foreign_long_watch is False - and (is_latin(character) is False or is_accentuated(character)) - and is_cjk(character) is False - and is_hangul(character) is False - and is_katakana(character) is False - and is_hiragana(character) is False - and is_thai(character) is False - ): - self._foreign_long_watch = True - return - if not self._buffer: - return - if ( - character.isspace() or is_punctuation(character) or is_separator(character) - ) and self._buffer: - self._word_count += 1 - buffer_length: int = len(self._buffer) - - self._character_count += buffer_length - - if buffer_length >= 4: - if self._buffer_accent_count / buffer_length > 0.34: - self._is_current_word_bad = True - # Word/Buffer ending with an upper case accentuated letter are so rare, - # that we will consider them all as suspicious. Same weight as foreign_long suspicious. - if ( - is_accentuated(self._buffer[-1]) - and self._buffer[-1].isupper() - and all(_.isupper() for _ in self._buffer) is False - ): - self._foreign_long_count += 1 - self._is_current_word_bad = True - if buffer_length >= 24 and self._foreign_long_watch: - camel_case_dst = [ - i - for c, i in zip(self._buffer, range(0, buffer_length)) - if c.isupper() - ] - probable_camel_cased: bool = False - - if camel_case_dst and (len(camel_case_dst) / buffer_length <= 0.3): - probable_camel_cased = True - - if not probable_camel_cased: - self._foreign_long_count += 1 - self._is_current_word_bad = True - - if self._is_current_word_bad: - self._bad_word_count += 1 - self._bad_character_count += len(self._buffer) - self._is_current_word_bad = False - - self._foreign_long_watch = False - self._buffer = "" - self._buffer_accent_count = 0 - elif ( - character not in {"<", ">", "-", "=", "~", "|", "_"} - and character.isdigit() is False - and is_symbol(character) - ): - self._is_current_word_bad = True - self._buffer += character - - def reset(self) -> None: # pragma: no cover - self._buffer = "" - self._is_current_word_bad = False - self._foreign_long_watch = False - self._bad_word_count = 0 - self._word_count = 0 - self._character_count = 0 - self._bad_character_count = 0 - self._foreign_long_count = 0 - - @property - def ratio(self) -> float: - if self._word_count <= 10 and self._foreign_long_count == 0: - return 0.0 - - return self._bad_character_count / self._character_count - - -class CjkInvalidStopPlugin(MessDetectorPlugin): - """ - GB(Chinese) based encoding often render the stop incorrectly when the content does not fit and - can be easily detected. Searching for the overuse of '丅' and '丄'. - """ - - def __init__(self) -> None: - self._wrong_stop_count: int = 0 - self._cjk_character_count: int = 0 - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - if character in {"丅", "丄"}: - self._wrong_stop_count += 1 - return - if is_cjk(character): - self._cjk_character_count += 1 - - def reset(self) -> None: # pragma: no cover - self._wrong_stop_count = 0 - self._cjk_character_count = 0 - - @property - def ratio(self) -> float: - if self._cjk_character_count < 16: - return 0.0 - return self._wrong_stop_count / self._cjk_character_count - - -class ArchaicUpperLowerPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._buf: bool = False - - self._character_count_since_last_sep: int = 0 - - self._successive_upper_lower_count: int = 0 - self._successive_upper_lower_count_final: int = 0 - - self._character_count: int = 0 - - self._last_alpha_seen: Optional[str] = None - self._current_ascii_only: bool = True - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - is_concerned = character.isalpha() and is_case_variable(character) - chunk_sep = is_concerned is False - - if chunk_sep and self._character_count_since_last_sep > 0: - if ( - self._character_count_since_last_sep <= 64 - and character.isdigit() is False - and self._current_ascii_only is False - ): - self._successive_upper_lower_count_final += ( - self._successive_upper_lower_count - ) - - self._successive_upper_lower_count = 0 - self._character_count_since_last_sep = 0 - self._last_alpha_seen = None - self._buf = False - self._character_count += 1 - self._current_ascii_only = True - - return - - if self._current_ascii_only is True and character.isascii() is False: - self._current_ascii_only = False - - if self._last_alpha_seen is not None: - if (character.isupper() and self._last_alpha_seen.islower()) or ( - character.islower() and self._last_alpha_seen.isupper() - ): - if self._buf is True: - self._successive_upper_lower_count += 2 - self._buf = False - else: - self._buf = True - else: - self._buf = False - - self._character_count += 1 - self._character_count_since_last_sep += 1 - self._last_alpha_seen = character - - def reset(self) -> None: # pragma: no cover - self._character_count = 0 - self._character_count_since_last_sep = 0 - self._successive_upper_lower_count = 0 - self._successive_upper_lower_count_final = 0 - self._last_alpha_seen = None - self._buf = False - self._current_ascii_only = True - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return self._successive_upper_lower_count_final / self._character_count - - -class ArabicIsolatedFormPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._character_count: int = 0 - self._isolated_form_count: int = 0 - - def reset(self) -> None: # pragma: no cover - self._character_count = 0 - self._isolated_form_count = 0 - - def eligible(self, character: str) -> bool: - return is_arabic(character) - - def feed(self, character: str) -> None: - self._character_count += 1 - - if is_arabic_isolated_form(character): - self._isolated_form_count += 1 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - isolated_form_usage: float = self._isolated_form_count / self._character_count - - return isolated_form_usage - - -@lru_cache(maxsize=1024) -def is_suspiciously_successive_range( - unicode_range_a: Optional[str], unicode_range_b: Optional[str] -) -> bool: - """ - Determine if two Unicode range seen next to each other can be considered as suspicious. - """ - if unicode_range_a is None or unicode_range_b is None: - return True - - if unicode_range_a == unicode_range_b: - return False - - if "Latin" in unicode_range_a and "Latin" in unicode_range_b: - return False - - if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: - return False - - # Latin characters can be accompanied with a combining diacritical mark - # eg. Vietnamese. - if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( - "Combining" in unicode_range_a or "Combining" in unicode_range_b - ): - return False - - keywords_range_a, keywords_range_b = unicode_range_a.split( - " " - ), unicode_range_b.split(" ") - - for el in keywords_range_a: - if el in UNICODE_SECONDARY_RANGE_KEYWORD: - continue - if el in keywords_range_b: - return False - - # Japanese Exception - range_a_jp_chars, range_b_jp_chars = ( - unicode_range_a - in ( - "Hiragana", - "Katakana", - ), - unicode_range_b in ("Hiragana", "Katakana"), - ) - if (range_a_jp_chars or range_b_jp_chars) and ( - "CJK" in unicode_range_a or "CJK" in unicode_range_b - ): - return False - if range_a_jp_chars and range_b_jp_chars: - return False - - if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: - if "CJK" in unicode_range_a or "CJK" in unicode_range_b: - return False - if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": - return False - - # Chinese/Japanese use dedicated range for punctuation and/or separators. - if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( - unicode_range_a in ["Katakana", "Hiragana"] - and unicode_range_b in ["Katakana", "Hiragana"] - ): - if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: - return False - if "Forms" in unicode_range_a or "Forms" in unicode_range_b: - return False - if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": - return False - - return True - - -@lru_cache(maxsize=2048) -def mess_ratio( - decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False -) -> float: - """ - Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. - """ - - detectors: List[MessDetectorPlugin] = [ - md_class() for md_class in MessDetectorPlugin.__subclasses__() - ] - - length: int = len(decoded_sequence) + 1 - - mean_mess_ratio: float = 0.0 - - if length < 512: - intermediary_mean_mess_ratio_calc: int = 32 - elif length <= 1024: - intermediary_mean_mess_ratio_calc = 64 - else: - intermediary_mean_mess_ratio_calc = 128 - - for character, index in zip(decoded_sequence + "\n", range(length)): - for detector in detectors: - if detector.eligible(character): - detector.feed(character) - - if ( - index > 0 and index % intermediary_mean_mess_ratio_calc == 0 - ) or index == length - 1: - mean_mess_ratio = sum(dt.ratio for dt in detectors) - - if mean_mess_ratio >= maximum_threshold: - break - - if debug: - logger = getLogger("charset_normalizer") - - logger.log( - TRACE, - "Mess-detector extended-analysis start. " - f"intermediary_mean_mess_ratio_calc={intermediary_mean_mess_ratio_calc} mean_mess_ratio={mean_mess_ratio} " - f"maximum_threshold={maximum_threshold}", - ) - - if len(decoded_sequence) > 16: - logger.log(TRACE, f"Starting with: {decoded_sequence[:16]}") - logger.log(TRACE, f"Ending with: {decoded_sequence[-16::]}") - - for dt in detectors: # pragma: nocover - logger.log(TRACE, f"{dt.__class__}: {dt.ratio}") - - return round(mean_mess_ratio, 3) diff --git a/.flatpak-builder/cache/objects/39/6e550f269e17f903d51dd5afb7018bf513743e41b48b5e9c9721ab056bc02b.file b/.flatpak-builder/cache/objects/39/6e550f269e17f903d51dd5afb7018bf513743e41b48b5e9c9721ab056bc02b.file deleted file mode 100644 index 55991fc..0000000 --- a/.flatpak-builder/cache/objects/39/6e550f269e17f903d51dd5afb7018bf513743e41b48b5e9c9721ab056bc02b.file +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Charset-Normalizer -~~~~~~~~~~~~~~ -The Real First Universal Charset Detector. -A library that helps you read text from an unknown charset encoding. -Motivated by chardet, This package is trying to resolve the issue by taking a new approach. -All IANA character set names for which the Python core library provides codecs are supported. - -Basic usage: - >>> from charset_normalizer import from_bytes - >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) - >>> best_guess = results.best() - >>> str(best_guess) - 'Bсеки човек има право на образование. Oбразованието!' - -Others methods and usages are available - see the full documentation -at . -:copyright: (c) 2021 by Ahmed TAHRI -:license: MIT, see LICENSE for more details. -""" -import logging - -from .api import from_bytes, from_fp, from_path, is_binary -from .legacy import detect -from .models import CharsetMatch, CharsetMatches -from .utils import set_logging_handler -from .version import VERSION, __version__ - -__all__ = ( - "from_fp", - "from_path", - "from_bytes", - "is_binary", - "detect", - "CharsetMatch", - "CharsetMatches", - "__version__", - "VERSION", - "set_logging_handler", -) - -# Attach a NullHandler to the top level logger by default -# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library - -logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/.flatpak-builder/cache/objects/39/c531459bee1a50b11dc64c70717b64d5c645ae4a9a299453063a1b88b5c19d.file b/.flatpak-builder/cache/objects/39/c531459bee1a50b11dc64c70717b64d5c645ae4a9a299453063a1b88b5c19d.file deleted file mode 100755 index 16e8537f580fa6c3df25688b486e6e337619369a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14656 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 b=$@CHUyjcNH~TlfiogXw@Dkxt7x4c8Z9w;N diff --git a/.flatpak-builder/cache/objects/39/c640d8ce15f7971b9e9e2848106b845f707aff457bf771e8665916c2db63dc.file b/.flatpak-builder/cache/objects/39/c640d8ce15f7971b9e9e2848106b845f707aff457bf771e8665916c2db63dc.file deleted file mode 100644 index e6183d0..0000000 --- a/.flatpak-builder/cache/objects/39/c640d8ce15f7971b9e9e2848106b845f707aff457bf771e8665916c2db63dc.file +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2008-2020 Andrey Petrov and contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.flatpak-builder/cache/objects/39/e13797bd8a817a7659c99c67b9405bdbf97fa356ce8a5c18a1023b7bf3e181.file b/.flatpak-builder/cache/objects/39/e13797bd8a817a7659c99c67b9405bdbf97fa356ce8a5c18a1023b7bf3e181.file deleted file mode 100644 index 8a3c5be..0000000 --- a/.flatpak-builder/cache/objects/39/e13797bd8a817a7659c99c67b9405bdbf97fa356ce8a5c18a1023b7bf3e181.file +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import annotations - -import urllib3.connection - -from ...connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from .connection import EmscriptenHTTPConnection, EmscriptenHTTPSConnection - - -def inject_into_urllib3() -> None: - # override connection classes to use emscripten specific classes - # n.b. mypy complains about the overriding of classes below - # if it isn't ignored - HTTPConnectionPool.ConnectionCls = EmscriptenHTTPConnection - HTTPSConnectionPool.ConnectionCls = EmscriptenHTTPSConnection - urllib3.connection.HTTPConnection = EmscriptenHTTPConnection # type: ignore[misc,assignment] - urllib3.connection.HTTPSConnection = EmscriptenHTTPSConnection # type: ignore[misc,assignment] diff --git a/.flatpak-builder/cache/objects/3a/80a5cbd726adf062a1b835546a42d0c6e91f2a6b51f27056b6019afb899043.file b/.flatpak-builder/cache/objects/3a/80a5cbd726adf062a1b835546a42d0c6e91f2a6b51f27056b6019afb899043.file deleted file mode 100644 index f180c7e2bf11757ef1772ccfe84e6a80d74ee19a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2068 zcmcgsO^?$?7#_#Ymz}Q-EZGINYuM!@P?Ey7r+!GNv=T)NmEgjtlI6s+n^|UTGc#rh zs;V4%pj8ihsMJ4Dsp_Ao#6O7C9<1pFsV8o!xU4vJ#!1SisHaNJym|b*&wRY&dFS;{ z)v9d*0Dk{9S(n>?{`iODfB&o*d-7JQ4Y!*%LHm!5%V=vjD{Zomz?2{*IxHFA!g zhv(@9c!6Go7ik-|=_Po{0O&G&Tm3JiEAR?ZxRZk&)J5;8=T+3*G2pczcNetlPoCKf zJxmZ6ywi_p>5#DB)!24*W16C~z^2BPQJGY}~^Hi=m4- zSBu&`B=!*s-Oq<&5QXkFSIwC_TOIeNa2cXL4!OG%F}LUUAME=q;P&ETNhmOJ#Q?b> zdMsS(@2SC$5aT!sJN65m>Dw=K!e8hs_vyX1A?u&ry>t5p>PG?kgt3Sz$+^P<#87Yp z_eI;3rH_3={2oEFxb4R=4tHg3I}uu$`D#wNA4Lx^+Vk}Sh3$xOL=-FC6--UId8cj5 z{KF&?NZQ%Mi%G&|F$t$)Wk#lQIbkF~JIvpenxateP7P*cFT$ZLDH8iCLdJNk&QaP* zOTtWT=cT=iM9iYc7;$;xHTO{X2(u`pC={}u4fX~?#2&$1$cmmZ^m@bC=UlEF^^Q(# zZ^@$P1ySGgWU)U`SwKQMH?!PkCn%d*sqk>P6G_Wct}I~g z#lvf}=a#GueC}~|RS4SSQ7G*r+|mlu#VnnEL;fpstc`?$C;yhb2wrZO)Bb4)tF9pP^_vXR?|?|(9p1?p{e1RhT|HR zHJnf&YqR;Yx?wHdv!X$NfY?b5rxd8e5llM01QUTnPdoYEP^jG5J)f(J(^p8ESS2mL zLn2?uYM4;OaNiTdSPiSHF0_l-)cqN}REvUF?{?K~?Wz~(##vEqb*^6RaxBo5Se1{z zi+Fcl(cNhob>iWx(g)K5{)oM=7EzyFz;CIFnV5!QOmaoTng9(=(`ctwb98&!4%1?D z0t}=58dB@xc+vD4?Zd;vNdXwn$kuIA110CTVryh6(XKu9ziS;_|Mv8#@TS{rjcSuz z-e{!O+IViymsj-$=HVMU{1j5FKDsq;I&xzg*;4y7jdQ7WY5aygw>HO%rnkB|1{+5$ z1s{(8-BNI2yl5#{A1_)8TH{5V*p88#fd3y>3Oeq8g$AfMM^0KOkIb}G9p%&7(!qOA yzZlu+((wayP#IMxy|HZmQn;Q6&+_H#OXjnNq3|!AG-fFP diff --git a/.flatpak-builder/cache/objects/3a/e66fb8de2ad724ddca9f97f5cc3cccf3494680b21dde8712b702887f0f1f7b.dirtree b/.flatpak-builder/cache/objects/3a/e66fb8de2ad724ddca9f97f5cc3cccf3494680b21dde8712b702887f0f1f7b.dirtree deleted file mode 100644 index dd1415f1db81063e3db01c7290f790620710a8a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 810 zcma!#&&%A8Z^)h&{mfe*+P{9++XIDW z#$T92QTU6HZW-d_#YR<`lXfDRkoqPOat>P{_=huG^b1eN9+}FLL^Zkx9yZpJj&aT-u z-h1f z211JQWvNBQ*j#?klC9#)dw== 3 - and args[0] == self.mode - and args[0] in Image._MAPMODES - ): - try: - # use mmap, if possible - import mmap - - with open(self.filename) as fp: - self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) - if offset + self.size[1] * args[1] > self.map.size(): - msg = "buffer is not large enough" - raise OSError(msg) - self.im = Image.core.map_buffer( - self.map, self.size, decoder_name, offset, args - ) - readonly = 1 - # After trashing self.im, - # we might need to reload the palette data. - if self.palette: - self.palette.dirty = 1 - except (AttributeError, OSError, ImportError): - self.map = None - - self.load_prepare() - err_code = -3 # initialize to unknown error - if not self.map: - # sort tiles in file order - self.tile.sort(key=_tilesort) - - try: - # FIXME: This is a hack to handle TIFF's JpegTables tag. - prefix = self.tile_prefix - except AttributeError: - prefix = b"" - - # Remove consecutive duplicates that only differ by their offset - self.tile = [ - list(tiles)[-1] - for _, tiles in itertools.groupby( - self.tile, lambda tile: (tile[0], tile[1], tile[3]) - ) - ] - for decoder_name, extents, offset, args in self.tile: - seek(offset) - decoder = Image._getdecoder( - self.mode, decoder_name, args, self.decoderconfig - ) - try: - decoder.setimage(self.im, extents) - if decoder.pulls_fd: - decoder.setfd(self.fp) - err_code = decoder.decode(b"")[1] - else: - b = prefix - while True: - try: - s = read(self.decodermaxblock) - except (IndexError, struct.error) as e: - # truncated png/gif - if LOAD_TRUNCATED_IMAGES: - break - else: - msg = "image file is truncated" - raise OSError(msg) from e - - if not s: # truncated jpeg - if LOAD_TRUNCATED_IMAGES: - break - else: - msg = ( - "image file is truncated " - f"({len(b)} bytes not processed)" - ) - raise OSError(msg) - - b = b + s - n, err_code = decoder.decode(b) - if n < 0: - break - b = b[n:] - finally: - # Need to cleanup here to prevent leaks - decoder.cleanup() - - self.tile = [] - self.readonly = readonly - - self.load_end() - - if self._exclusive_fp and self._close_exclusive_fp_after_loading: - self.fp.close() - self.fp = None - - if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: - # still raised if decoder fails to return anything - raise _get_oserror(err_code, encoder=False) - - return Image.Image.load(self) - - def load_prepare(self): - # create image memory if necessary - if not self.im or self.im.mode != self.mode or self.im.size != self.size: - self.im = Image.core.new(self.mode, self.size) - # create palette (optional) - if self.mode == "P": - Image.Image.load(self) - - def load_end(self): - # may be overridden - pass - - # may be defined for contained formats - # def load_seek(self, pos): - # pass - - # may be defined for blocked formats (e.g. PNG) - # def load_read(self, read_bytes): - # pass - - def _seek_check(self, frame): - if ( - frame < self._min_frame - # Only check upper limit on frames if additional seek operations - # are not required to do so - or ( - not (hasattr(self, "_n_frames") and self._n_frames is None) - and frame >= self.n_frames + self._min_frame - ) - ): - msg = "attempt to seek outside sequence" - raise EOFError(msg) - - return self.tell() != frame - - -class StubImageFile(ImageFile): - """ - Base class for stub image loaders. - - A stub loader is an image loader that can identify files of a - certain format, but relies on external code to load the file. - """ - - def _open(self): - msg = "StubImageFile subclass must implement _open" - raise NotImplementedError(msg) - - def load(self): - loader = self._load() - if loader is None: - msg = f"cannot find loader for this {self.format} file" - raise OSError(msg) - image = loader.load(self) - assert image is not None - # become the other object (!) - self.__class__ = image.__class__ - self.__dict__ = image.__dict__ - return image.load() - - def _load(self): - """(Hook) Find actual image loader.""" - msg = "StubImageFile subclass must implement _load" - raise NotImplementedError(msg) - - -class Parser: - """ - Incremental image parser. This class implements the standard - feed/close consumer interface. - """ - - incremental = None - image: Image.Image | None = None - data = None - decoder = None - offset = 0 - finished = 0 - - def reset(self): - """ - (Consumer) Reset the parser. Note that you can only call this - method immediately after you've created a parser; parser - instances cannot be reused. - """ - assert self.data is None, "cannot reuse parsers" - - def feed(self, data): - """ - (Consumer) Feed data to the parser. - - :param data: A string buffer. - :exception OSError: If the parser failed to parse the image file. - """ - # collect data - - if self.finished: - return - - if self.data is None: - self.data = data - else: - self.data = self.data + data - - # parse what we have - if self.decoder: - if self.offset > 0: - # skip header - skip = min(len(self.data), self.offset) - self.data = self.data[skip:] - self.offset = self.offset - skip - if self.offset > 0 or not self.data: - return - - n, e = self.decoder.decode(self.data) - - if n < 0: - # end of stream - self.data = None - self.finished = 1 - if e < 0: - # decoding error - self.image = None - raise _get_oserror(e, encoder=False) - else: - # end of image - return - self.data = self.data[n:] - - elif self.image: - # if we end up here with no decoder, this file cannot - # be incrementally parsed. wait until we've gotten all - # available data - pass - - else: - # attempt to open this file - try: - with io.BytesIO(self.data) as fp: - im = Image.open(fp) - except OSError: - pass # not enough data - else: - flag = hasattr(im, "load_seek") or hasattr(im, "load_read") - if flag or len(im.tile) != 1: - # custom load code, or multiple tiles - self.decode = None - else: - # initialize decoder - im.load_prepare() - d, e, o, a = im.tile[0] - im.tile = [] - self.decoder = Image._getdecoder(im.mode, d, a, im.decoderconfig) - self.decoder.setimage(im.im, e) - - # calculate decoder offset - self.offset = o - if self.offset <= len(self.data): - self.data = self.data[self.offset :] - self.offset = 0 - - self.image = im - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def close(self): - """ - (Consumer) Close the stream. - - :returns: An image object. - :exception OSError: If the parser failed to parse the image file either - because it cannot be identified or cannot be - decoded. - """ - # finish decoding - if self.decoder: - # get rid of what's left in the buffers - self.feed(b"") - self.data = self.decoder = None - if not self.finished: - msg = "image was incomplete" - raise OSError(msg) - if not self.image: - msg = "cannot parse this image" - raise OSError(msg) - if self.data: - # incremental parsing not possible; reopen the file - # not that we have all data - with io.BytesIO(self.data) as fp: - try: - self.image = Image.open(fp) - finally: - self.image.load() - return self.image - - -# -------------------------------------------------------------------- - - -def _save(im, fp, tile, bufsize=0) -> None: - """Helper to save image based on tile list - - :param im: Image object. - :param fp: File object. - :param tile: Tile list. - :param bufsize: Optional buffer size - """ - - im.load() - if not hasattr(im, "encoderconfig"): - im.encoderconfig = () - tile.sort(key=_tilesort) - # FIXME: make MAXBLOCK a configuration parameter - # It would be great if we could have the encoder specify what it needs - # But, it would need at least the image size in most cases. RawEncode is - # a tricky case. - bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c - try: - fh = fp.fileno() - fp.flush() - _encode_tile(im, fp, tile, bufsize, fh) - except (AttributeError, io.UnsupportedOperation) as exc: - _encode_tile(im, fp, tile, bufsize, None, exc) - if hasattr(fp, "flush"): - fp.flush() - - -def _encode_tile(im, fp, tile: list[_Tile], bufsize, fh, exc=None): - for encoder_name, extents, offset, args in tile: - if offset > 0: - fp.seek(offset) - encoder = Image._getencoder(im.mode, encoder_name, args, im.encoderconfig) - try: - encoder.setimage(im.im, extents) - if encoder.pushes_fd: - encoder.setfd(fp) - errcode = encoder.encode_to_pyfd()[1] - else: - if exc: - # compress to Python file-compatible object - while True: - errcode, data = encoder.encode(bufsize)[1:] - fp.write(data) - if errcode: - break - else: - # slight speedup: compress to real file object - errcode = encoder.encode_to_file(fh, bufsize) - if errcode < 0: - raise _get_oserror(errcode, encoder=True) from exc - finally: - encoder.cleanup() - - -def _safe_read(fp, size): - """ - Reads large blocks in a safe way. Unlike fp.read(n), this function - doesn't trust the user. If the requested size is larger than - SAFEBLOCK, the file is read block by block. - - :param fp: File handle. Must implement a read method. - :param size: Number of bytes to read. - :returns: A string containing size bytes of data. - - Raises an OSError if the file is truncated and the read cannot be completed - - """ - if size <= 0: - return b"" - if size <= SAFEBLOCK: - data = fp.read(size) - if len(data) < size: - msg = "Truncated File Read" - raise OSError(msg) - return data - data = [] - remaining_size = size - while remaining_size > 0: - block = fp.read(min(remaining_size, SAFEBLOCK)) - if not block: - break - data.append(block) - remaining_size -= len(block) - if sum(len(d) for d in data) < size: - msg = "Truncated File Read" - raise OSError(msg) - return b"".join(data) - - -class PyCodecState: - def __init__(self): - self.xsize = 0 - self.ysize = 0 - self.xoff = 0 - self.yoff = 0 - - def extents(self): - return self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize - - -class PyCodec: - fd: IO[bytes] | None - - def __init__(self, mode, *args): - self.im = None - self.state = PyCodecState() - self.fd = None - self.mode = mode - self.init(args) - - def init(self, args): - """ - Override to perform codec specific initialization - - :param args: Array of args items from the tile entry - :returns: None - """ - self.args = args - - def cleanup(self): - """ - Override to perform codec specific cleanup - - :returns: None - """ - pass - - def setfd(self, fd): - """ - Called from ImageFile to set the Python file-like object - - :param fd: A Python file-like object - :returns: None - """ - self.fd = fd - - def setimage(self, im, extents=None): - """ - Called from ImageFile to set the core output image for the codec - - :param im: A core image object - :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle - for this tile - :returns: None - """ - - # following c code - self.im = im - - if extents: - (x0, y0, x1, y1) = extents - else: - (x0, y0, x1, y1) = (0, 0, 0, 0) - - if x0 == 0 and x1 == 0: - self.state.xsize, self.state.ysize = self.im.size - else: - self.state.xoff = x0 - self.state.yoff = y0 - self.state.xsize = x1 - x0 - self.state.ysize = y1 - y0 - - if self.state.xsize <= 0 or self.state.ysize <= 0: - msg = "Size cannot be negative" - raise ValueError(msg) - - if ( - self.state.xsize + self.state.xoff > self.im.size[0] - or self.state.ysize + self.state.yoff > self.im.size[1] - ): - msg = "Tile cannot extend outside image" - raise ValueError(msg) - - -class PyDecoder(PyCodec): - """ - Python implementation of a format decoder. Override this class and - add the decoding logic in the :meth:`decode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pulls_fd = False - - @property - def pulls_fd(self): - return self._pulls_fd - - def decode(self, buffer): - """ - Override to perform the decoding process. - - :param buffer: A bytes object with the data to be decoded. - :returns: A tuple of ``(bytes consumed, errcode)``. - If finished with decoding return -1 for the bytes consumed. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - msg = "unavailable in base decoder" - raise NotImplementedError(msg) - - def set_as_raw(self, data: bytes, rawmode=None) -> None: - """ - Convenience method to set the internal image from a stream of raw data - - :param data: Bytes to be set - :param rawmode: The rawmode to be used for the decoder. - If not specified, it will default to the mode of the image - :returns: None - """ - - if not rawmode: - rawmode = self.mode - d = Image._getdecoder(self.mode, "raw", rawmode) - d.setimage(self.im, self.state.extents()) - s = d.decode(data) - - if s[0] >= 0: - msg = "not enough image data" - raise ValueError(msg) - if s[1] != 0: - msg = "cannot decode image data" - raise ValueError(msg) - - -class PyEncoder(PyCodec): - """ - Python implementation of a format encoder. Override this class and - add the decoding logic in the :meth:`encode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pushes_fd = False - - @property - def pushes_fd(self): - return self._pushes_fd - - def encode(self, bufsize): - """ - Override to perform the encoding process. - - :param bufsize: Buffer size. - :returns: A tuple of ``(bytes encoded, errcode, bytes)``. - If finished with encoding return 1 for the error code. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - msg = "unavailable in base encoder" - raise NotImplementedError(msg) - - def encode_to_pyfd(self): - """ - If ``pushes_fd`` is ``True``, then this method will be used, - and ``encode()`` will only be called once. - - :returns: A tuple of ``(bytes consumed, errcode)``. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - if not self.pushes_fd: - return 0, -8 # bad configuration - bytes_consumed, errcode, data = self.encode(0) - if data: - self.fd.write(data) - return bytes_consumed, errcode - - def encode_to_file(self, fh, bufsize): - """ - :param fh: File handle. - :param bufsize: Buffer size. - - :returns: If finished successfully, return 0. - Otherwise, return an error code. Err codes are from - :data:`.ImageFile.ERRORS`. - """ - errcode = 0 - while errcode == 0: - status, errcode, buf = self.encode(bufsize) - if status > 0: - fh.write(buf[status:]) - return errcode diff --git a/.flatpak-builder/cache/objects/3b/dd94d772462fd398dc91cdc3570921a5c4909b41b6a40c3e8e84df60a80c58.dirtree b/.flatpak-builder/cache/objects/3b/dd94d772462fd398dc91cdc3570921a5c4909b41b6a40c3e8e84df60a80c58.dirtree deleted file mode 100644 index 31adfd3a9a7a1dc79a35a42151fa789e3d7fc797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmV-P0Ji^OaBy<~A|z8nLA>O$th-~nHT%Qa4bsxX3O%II zgEzhDDJu1kNyy&^SycBd-KhFu2f7J0A4@8+g>!*$#;&I zre2|opB%gg4?Hx0p4g=U3Z$MC$UPZ>1O)b!vTDr1X&FFICF&<_8D0aP>?xl5O&jy; zPlbfS5O6*&qwD)$eRZPmNoAhaxCVo}^e1bKcyI2%4RQU?gj&Ir|IcjVAEL0^l$h>D zVM@X@Vd|S*Ldk*Dau3W_Yk6!YX+(*g(jjRgra5lvM`6=sxu>ZqO@t5ahwH`X$32HH7P&!GD5@rQd~4ku8ZLMMmL1UfTZImh)g zT%Y2V9Is@`T*gNa79gYQOfj-2qs`Ig@z%-KRH@}kZBov8k=qz;95+rHZ@Wj`tQhn* G*Z2z?Zm5(1 diff --git a/.flatpak-builder/cache/objects/3c/9e15a9ac51420bdd5ce4512488a5afbe049275d1348ae1a8926eb8b23ea5d2.file b/.flatpak-builder/cache/objects/3c/9e15a9ac51420bdd5ce4512488a5afbe049275d1348ae1a8926eb8b23ea5d2.file deleted file mode 100644 index d31fac9..0000000 --- a/.flatpak-builder/cache/objects/3c/9e15a9ac51420bdd5ce4512488a5afbe049275d1348ae1a8926eb8b23ea5d2.file +++ /dev/null @@ -1,1243 +0,0 @@ -from __future__ import annotations - -import collections -import io -import json as _json -import logging -import re -import sys -import typing -import warnings -import zlib -from contextlib import contextmanager -from http.client import HTTPMessage as _HttplibHTTPMessage -from http.client import HTTPResponse as _HttplibHTTPResponse -from socket import timeout as SocketTimeout - -if typing.TYPE_CHECKING: - from ._base_connection import BaseHTTPConnection - -try: - try: - import brotlicffi as brotli # type: ignore[import-not-found] - except ImportError: - import brotli # type: ignore[import-not-found] -except ImportError: - brotli = None - -try: - import zstandard as zstd # type: ignore[import-not-found] - - # The package 'zstandard' added the 'eof' property starting - # in v0.18.0 which we require to ensure a complete and - # valid zstd stream was fed into the ZstdDecoder. - # See: https://github.com/urllib3/urllib3/pull/2624 - _zstd_version = _zstd_version = tuple( - map(int, re.search(r"^([0-9]+)\.([0-9]+)", zstd.__version__).groups()) # type: ignore[union-attr] - ) - if _zstd_version < (0, 18): # Defensive: - zstd = None - -except (AttributeError, ImportError, ValueError): # Defensive: - zstd = None - -from . import util -from ._base_connection import _TYPE_BODY -from ._collections import HTTPHeaderDict -from .connection import BaseSSLError, HTTPConnection, HTTPException -from .exceptions import ( - BodyNotHttplibCompatible, - DecodeError, - HTTPError, - IncompleteRead, - InvalidChunkLength, - InvalidHeader, - ProtocolError, - ReadTimeoutError, - ResponseNotChunked, - SSLError, -) -from .util.response import is_fp_closed, is_response_to_head -from .util.retry import Retry - -if typing.TYPE_CHECKING: - from typing import Literal - - from .connectionpool import HTTPConnectionPool - -log = logging.getLogger(__name__) - - -class ContentDecoder: - def decompress(self, data: bytes) -> bytes: - raise NotImplementedError() - - def flush(self) -> bytes: - raise NotImplementedError() - - -class DeflateDecoder(ContentDecoder): - def __init__(self) -> None: - self._first_try = True - self._data = b"" - self._obj = zlib.decompressobj() - - def decompress(self, data: bytes) -> bytes: - if not data: - return data - - if not self._first_try: - return self._obj.decompress(data) - - self._data += data - try: - decompressed = self._obj.decompress(data) - if decompressed: - self._first_try = False - self._data = None # type: ignore[assignment] - return decompressed - except zlib.error: - self._first_try = False - self._obj = zlib.decompressobj(-zlib.MAX_WBITS) - try: - return self.decompress(self._data) - finally: - self._data = None # type: ignore[assignment] - - def flush(self) -> bytes: - return self._obj.flush() - - -class GzipDecoderState: - FIRST_MEMBER = 0 - OTHER_MEMBERS = 1 - SWALLOW_DATA = 2 - - -class GzipDecoder(ContentDecoder): - def __init__(self) -> None: - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - self._state = GzipDecoderState.FIRST_MEMBER - - def decompress(self, data: bytes) -> bytes: - ret = bytearray() - if self._state == GzipDecoderState.SWALLOW_DATA or not data: - return bytes(ret) - while True: - try: - ret += self._obj.decompress(data) - except zlib.error: - previous_state = self._state - # Ignore data after the first error - self._state = GzipDecoderState.SWALLOW_DATA - if previous_state == GzipDecoderState.OTHER_MEMBERS: - # Allow trailing garbage acceptable in other gzip clients - return bytes(ret) - raise - data = self._obj.unused_data - if not data: - return bytes(ret) - self._state = GzipDecoderState.OTHER_MEMBERS - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - - def flush(self) -> bytes: - return self._obj.flush() - - -if brotli is not None: - - class BrotliDecoder(ContentDecoder): - # Supports both 'brotlipy' and 'Brotli' packages - # since they share an import name. The top branches - # are for 'brotlipy' and bottom branches for 'Brotli' - def __init__(self) -> None: - self._obj = brotli.Decompressor() - if hasattr(self._obj, "decompress"): - setattr(self, "decompress", self._obj.decompress) - else: - setattr(self, "decompress", self._obj.process) - - def flush(self) -> bytes: - if hasattr(self._obj, "flush"): - return self._obj.flush() # type: ignore[no-any-return] - return b"" - - -if zstd is not None: - - class ZstdDecoder(ContentDecoder): - def __init__(self) -> None: - self._obj = zstd.ZstdDecompressor().decompressobj() - - def decompress(self, data: bytes) -> bytes: - if not data: - return b"" - data_parts = [self._obj.decompress(data)] - while self._obj.eof and self._obj.unused_data: - unused_data = self._obj.unused_data - self._obj = zstd.ZstdDecompressor().decompressobj() - data_parts.append(self._obj.decompress(unused_data)) - return b"".join(data_parts) - - def flush(self) -> bytes: - ret = self._obj.flush() # note: this is a no-op - if not self._obj.eof: - raise DecodeError("Zstandard data is incomplete") - return ret # type: ignore[no-any-return] - - -class MultiDecoder(ContentDecoder): - """ - From RFC7231: - If one or more encodings have been applied to a representation, the - sender that applied the encodings MUST generate a Content-Encoding - header field that lists the content codings in the order in which - they were applied. - """ - - def __init__(self, modes: str) -> None: - self._decoders = [_get_decoder(m.strip()) for m in modes.split(",")] - - def flush(self) -> bytes: - return self._decoders[0].flush() - - def decompress(self, data: bytes) -> bytes: - for d in reversed(self._decoders): - data = d.decompress(data) - return data - - -def _get_decoder(mode: str) -> ContentDecoder: - if "," in mode: - return MultiDecoder(mode) - - # According to RFC 9110 section 8.4.1.3, recipients should - # consider x-gzip equivalent to gzip - if mode in ("gzip", "x-gzip"): - return GzipDecoder() - - if brotli is not None and mode == "br": - return BrotliDecoder() - - if zstd is not None and mode == "zstd": - return ZstdDecoder() - - return DeflateDecoder() - - -class BytesQueueBuffer: - """Memory-efficient bytes buffer - - To return decoded data in read() and still follow the BufferedIOBase API, we need a - buffer to always return the correct amount of bytes. - - This buffer should be filled using calls to put() - - Our maximum memory usage is determined by the sum of the size of: - - * self.buffer, which contains the full data - * the largest chunk that we will copy in get() - - The worst case scenario is a single chunk, in which case we'll make a full copy of - the data inside get(). - """ - - def __init__(self) -> None: - self.buffer: typing.Deque[bytes] = collections.deque() - self._size: int = 0 - - def __len__(self) -> int: - return self._size - - def put(self, data: bytes) -> None: - self.buffer.append(data) - self._size += len(data) - - def get(self, n: int) -> bytes: - if n == 0: - return b"" - elif not self.buffer: - raise RuntimeError("buffer is empty") - elif n < 0: - raise ValueError("n should be > 0") - - fetched = 0 - ret = io.BytesIO() - while fetched < n: - remaining = n - fetched - chunk = self.buffer.popleft() - chunk_length = len(chunk) - if remaining < chunk_length: - left_chunk, right_chunk = chunk[:remaining], chunk[remaining:] - ret.write(left_chunk) - self.buffer.appendleft(right_chunk) - self._size -= remaining - break - else: - ret.write(chunk) - self._size -= chunk_length - fetched += chunk_length - - if not self.buffer: - break - - return ret.getvalue() - - def get_all(self) -> bytes: - buffer = self.buffer - if not buffer: - assert self._size == 0 - return b"" - if len(buffer) == 1: - result = buffer.pop() - else: - ret = io.BytesIO() - ret.writelines(buffer.popleft() for _ in range(len(buffer))) - result = ret.getvalue() - self._size = 0 - return result - - -class BaseHTTPResponse(io.IOBase): - CONTENT_DECODERS = ["gzip", "x-gzip", "deflate"] - if brotli is not None: - CONTENT_DECODERS += ["br"] - if zstd is not None: - CONTENT_DECODERS += ["zstd"] - REDIRECT_STATUSES = [301, 302, 303, 307, 308] - - DECODER_ERROR_CLASSES: tuple[type[Exception], ...] = (IOError, zlib.error) - if brotli is not None: - DECODER_ERROR_CLASSES += (brotli.error,) - - if zstd is not None: - DECODER_ERROR_CLASSES += (zstd.ZstdError,) - - def __init__( - self, - *, - headers: typing.Mapping[str, str] | typing.Mapping[bytes, bytes] | None = None, - status: int, - version: int, - reason: str | None, - decode_content: bool, - request_url: str | None, - retries: Retry | None = None, - ) -> None: - if isinstance(headers, HTTPHeaderDict): - self.headers = headers - else: - self.headers = HTTPHeaderDict(headers) # type: ignore[arg-type] - self.status = status - self.version = version - self.reason = reason - self.decode_content = decode_content - self._has_decoded_content = False - self._request_url: str | None = request_url - self.retries = retries - - self.chunked = False - tr_enc = self.headers.get("transfer-encoding", "").lower() - # Don't incur the penalty of creating a list and then discarding it - encodings = (enc.strip() for enc in tr_enc.split(",")) - if "chunked" in encodings: - self.chunked = True - - self._decoder: ContentDecoder | None = None - self.length_remaining: int | None - - def get_redirect_location(self) -> str | None | Literal[False]: - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in self.REDIRECT_STATUSES: - return self.headers.get("location") - return False - - @property - def data(self) -> bytes: - raise NotImplementedError() - - def json(self) -> typing.Any: - """ - Parses the body of the HTTP response as JSON. - - To use a custom JSON decoder pass the result of :attr:`HTTPResponse.data` to the decoder. - - This method can raise either `UnicodeDecodeError` or `json.JSONDecodeError`. - - Read more :ref:`here `. - """ - data = self.data.decode("utf-8") - return _json.loads(data) - - @property - def url(self) -> str | None: - raise NotImplementedError() - - @url.setter - def url(self, url: str | None) -> None: - raise NotImplementedError() - - @property - def connection(self) -> BaseHTTPConnection | None: - raise NotImplementedError() - - @property - def retries(self) -> Retry | None: - return self._retries - - @retries.setter - def retries(self, retries: Retry | None) -> None: - # Override the request_url if retries has a redirect location. - if retries is not None and retries.history: - self.url = retries.history[-1].redirect_location - self._retries = retries - - def stream( - self, amt: int | None = 2**16, decode_content: bool | None = None - ) -> typing.Iterator[bytes]: - raise NotImplementedError() - - def read( - self, - amt: int | None = None, - decode_content: bool | None = None, - cache_content: bool = False, - ) -> bytes: - raise NotImplementedError() - - def read1( - self, - amt: int | None = None, - decode_content: bool | None = None, - ) -> bytes: - raise NotImplementedError() - - def read_chunked( - self, - amt: int | None = None, - decode_content: bool | None = None, - ) -> typing.Iterator[bytes]: - raise NotImplementedError() - - def release_conn(self) -> None: - raise NotImplementedError() - - def drain_conn(self) -> None: - raise NotImplementedError() - - def close(self) -> None: - raise NotImplementedError() - - def _init_decoder(self) -> None: - """ - Set-up the _decoder attribute if necessary. - """ - # Note: content-encoding value should be case-insensitive, per RFC 7230 - # Section 3.2 - content_encoding = self.headers.get("content-encoding", "").lower() - if self._decoder is None: - if content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) - elif "," in content_encoding: - encodings = [ - e.strip() - for e in content_encoding.split(",") - if e.strip() in self.CONTENT_DECODERS - ] - if encodings: - self._decoder = _get_decoder(content_encoding) - - def _decode( - self, data: bytes, decode_content: bool | None, flush_decoder: bool - ) -> bytes: - """ - Decode the data passed in and potentially flush the decoder. - """ - if not decode_content: - if self._has_decoded_content: - raise RuntimeError( - "Calling read(decode_content=False) is not supported after " - "read(decode_content=True) was called." - ) - return data - - try: - if self._decoder: - data = self._decoder.decompress(data) - self._has_decoded_content = True - except self.DECODER_ERROR_CLASSES as e: - content_encoding = self.headers.get("content-encoding", "").lower() - raise DecodeError( - "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, - e, - ) from e - if flush_decoder: - data += self._flush_decoder() - - return data - - def _flush_decoder(self) -> bytes: - """ - Flushes the decoder. Should only be called if the decoder is actually - being used. - """ - if self._decoder: - return self._decoder.decompress(b"") + self._decoder.flush() - return b"" - - # Compatibility methods for `io` module - def readinto(self, b: bytearray) -> int: - temp = self.read(len(b)) - if len(temp) == 0: - return 0 - else: - b[: len(temp)] = temp - return len(temp) - - # Compatibility methods for http.client.HTTPResponse - def getheaders(self) -> HTTPHeaderDict: - warnings.warn( - "HTTPResponse.getheaders() is deprecated and will be removed " - "in urllib3 v2.1.0. Instead access HTTPResponse.headers directly.", - category=DeprecationWarning, - stacklevel=2, - ) - return self.headers - - def getheader(self, name: str, default: str | None = None) -> str | None: - warnings.warn( - "HTTPResponse.getheader() is deprecated and will be removed " - "in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default).", - category=DeprecationWarning, - stacklevel=2, - ) - return self.headers.get(name, default) - - # Compatibility method for http.cookiejar - def info(self) -> HTTPHeaderDict: - return self.headers - - def geturl(self) -> str | None: - return self.url - - -class HTTPResponse(BaseHTTPResponse): - """ - HTTP Response container. - - Backwards-compatible with :class:`http.client.HTTPResponse` but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. This - class is also compatible with the Python standard library's :mod:`io` - module, and can hence be treated as a readable object in the context of that - framework. - - Extra parameters for behaviour not present in :class:`http.client.HTTPResponse`: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param original_response: - When this HTTPResponse wrapper is generated from an :class:`http.client.HTTPResponse` - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - - :param retries: - The retries contains the last :class:`~urllib3.util.retry.Retry` that - was used during the request. - - :param enforce_content_length: - Enforce content length checking. Body returned by server must match - value of Content-Length header, if present. Otherwise, raise error. - """ - - def __init__( - self, - body: _TYPE_BODY = "", - headers: typing.Mapping[str, str] | typing.Mapping[bytes, bytes] | None = None, - status: int = 0, - version: int = 0, - reason: str | None = None, - preload_content: bool = True, - decode_content: bool = True, - original_response: _HttplibHTTPResponse | None = None, - pool: HTTPConnectionPool | None = None, - connection: HTTPConnection | None = None, - msg: _HttplibHTTPMessage | None = None, - retries: Retry | None = None, - enforce_content_length: bool = True, - request_method: str | None = None, - request_url: str | None = None, - auto_close: bool = True, - ) -> None: - super().__init__( - headers=headers, - status=status, - version=version, - reason=reason, - decode_content=decode_content, - request_url=request_url, - retries=retries, - ) - - self.enforce_content_length = enforce_content_length - self.auto_close = auto_close - - self._body = None - self._fp: _HttplibHTTPResponse | None = None - self._original_response = original_response - self._fp_bytes_read = 0 - self.msg = msg - - if body and isinstance(body, (str, bytes)): - self._body = body - - self._pool = pool - self._connection = connection - - if hasattr(body, "read"): - self._fp = body # type: ignore[assignment] - - # Are we using the chunked-style of transfer encoding? - self.chunk_left: int | None = None - - # Determine length of response - self.length_remaining = self._init_length(request_method) - - # Used to return the correct amount of bytes for partial read()s - self._decoded_buffer = BytesQueueBuffer() - - # If requested, preload the body. - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def release_conn(self) -> None: - if not self._pool or not self._connection: - return None - - self._pool._put_conn(self._connection) - self._connection = None - - def drain_conn(self) -> None: - """ - Read and discard any remaining HTTP response data in the response connection. - - Unread data in the HTTPResponse connection blocks the connection from being released back to the pool. - """ - try: - self.read() - except (HTTPError, OSError, BaseSSLError, HTTPException): - pass - - @property - def data(self) -> bytes: - # For backwards-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body # type: ignore[return-value] - - if self._fp: - return self.read(cache_content=True) - - return None # type: ignore[return-value] - - @property - def connection(self) -> HTTPConnection | None: - return self._connection - - def isclosed(self) -> bool: - return is_fp_closed(self._fp) - - def tell(self) -> int: - """ - Obtain the number of bytes pulled over the wire so far. May differ from - the amount of content returned by :meth:``urllib3.response.HTTPResponse.read`` - if bytes are encoded on the wire (e.g, compressed). - """ - return self._fp_bytes_read - - def _init_length(self, request_method: str | None) -> int | None: - """ - Set initial length value for Response content if available. - """ - length: int | None - content_length: str | None = self.headers.get("content-length") - - if content_length is not None: - if self.chunked: - # This Response will fail with an IncompleteRead if it can't be - # received as chunked. This method falls back to attempt reading - # the response before raising an exception. - log.warning( - "Received response with both Content-Length and " - "Transfer-Encoding set. This is expressly forbidden " - "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " - "attempting to process response as Transfer-Encoding: " - "chunked." - ) - return None - - try: - # RFC 7230 section 3.3.2 specifies multiple content lengths can - # be sent in a single Content-Length header - # (e.g. Content-Length: 42, 42). This line ensures the values - # are all valid ints and that as long as the `set` length is 1, - # all values are the same. Otherwise, the header is invalid. - lengths = {int(val) for val in content_length.split(",")} - if len(lengths) > 1: - raise InvalidHeader( - "Content-Length contained multiple " - "unmatching values (%s)" % content_length - ) - length = lengths.pop() - except ValueError: - length = None - else: - if length < 0: - length = None - - else: # if content_length is None - length = None - - # Convert status to int for comparison - # In some cases, httplib returns a status of "_UNKNOWN" - try: - status = int(self.status) - except ValueError: - status = 0 - - # Check for responses that shouldn't include a body - if status in (204, 304) or 100 <= status < 200 or request_method == "HEAD": - length = 0 - - return length - - @contextmanager - def _error_catcher(self) -> typing.Generator[None, None, None]: - """ - Catch low-level python exceptions, instead re-raising urllib3 - variants, so that low-level exceptions are not leaked in the - high-level api. - - On exit, release the connection back to the pool. - """ - clean_exit = False - - try: - try: - yield - - except SocketTimeout as e: - # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but - # there is yet no clean way to get at it from this context. - raise ReadTimeoutError(self._pool, None, "Read timed out.") from e # type: ignore[arg-type] - - except BaseSSLError as e: - # FIXME: Is there a better way to differentiate between SSLErrors? - if "read operation timed out" not in str(e): - # SSL errors related to framing/MAC get wrapped and reraised here - raise SSLError(e) from e - - raise ReadTimeoutError(self._pool, None, "Read timed out.") from e # type: ignore[arg-type] - - except IncompleteRead as e: - if ( - e.expected is not None - and e.partial is not None - and e.expected == -e.partial - ): - arg = "Response may not contain content." - else: - arg = f"Connection broken: {e!r}" - raise ProtocolError(arg, e) from e - - except (HTTPException, OSError) as e: - raise ProtocolError(f"Connection broken: {e!r}", e) from e - - # If no exception is thrown, we should avoid cleaning up - # unnecessarily. - clean_exit = True - finally: - # If we didn't terminate cleanly, we need to throw away our - # connection. - if not clean_exit: - # The response may not be closed but we're not going to use it - # anymore so close it now to ensure that the connection is - # released back to the pool. - if self._original_response: - self._original_response.close() - - # Closing the response may not actually be sufficient to close - # everything, so if we have a hold of the connection close that - # too. - if self._connection: - self._connection.close() - - # If we hold the original response but it's closed now, we should - # return the connection back to the pool. - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - def _fp_read( - self, - amt: int | None = None, - *, - read1: bool = False, - ) -> bytes: - """ - Read a response with the thought that reading the number of bytes - larger than can fit in a 32-bit int at a time via SSL in some - known cases leads to an overflow error that has to be prevented - if `amt` or `self.length_remaining` indicate that a problem may - happen. - - The known cases: - * 3.8 <= CPython < 3.9.7 because of a bug - https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900. - * urllib3 injected with pyOpenSSL-backed SSL-support. - * CPython < 3.10 only when `amt` does not fit 32-bit int. - """ - assert self._fp - c_int_max = 2**31 - 1 - if ( - (amt and amt > c_int_max) - or ( - amt is None - and self.length_remaining - and self.length_remaining > c_int_max - ) - ) and (util.IS_PYOPENSSL or sys.version_info < (3, 10)): - if read1: - return self._fp.read1(c_int_max) - buffer = io.BytesIO() - # Besides `max_chunk_amt` being a maximum chunk size, it - # affects memory overhead of reading a response by this - # method in CPython. - # `c_int_max` equal to 2 GiB - 1 byte is the actual maximum - # chunk size that does not lead to an overflow error, but - # 256 MiB is a compromise. - max_chunk_amt = 2**28 - while amt is None or amt != 0: - if amt is not None: - chunk_amt = min(amt, max_chunk_amt) - amt -= chunk_amt - else: - chunk_amt = max_chunk_amt - data = self._fp.read(chunk_amt) - if not data: - break - buffer.write(data) - del data # to reduce peak memory usage by `max_chunk_amt`. - return buffer.getvalue() - elif read1: - return self._fp.read1(amt) if amt is not None else self._fp.read1() - else: - # StringIO doesn't like amt=None - return self._fp.read(amt) if amt is not None else self._fp.read() - - def _raw_read( - self, - amt: int | None = None, - *, - read1: bool = False, - ) -> bytes: - """ - Reads `amt` of bytes from the socket. - """ - if self._fp is None: - return None # type: ignore[return-value] - - fp_closed = getattr(self._fp, "closed", False) - - with self._error_catcher(): - data = self._fp_read(amt, read1=read1) if not fp_closed else b"" - if amt is not None and amt != 0 and not data: - # Platform-specific: Buggy versions of Python. - # Close the connection when no data is returned - # - # This is redundant to what httplib/http.client _should_ - # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do - # not properly close the connection in all cases. There is - # no harm in redundantly calling close. - self._fp.close() - if ( - self.enforce_content_length - and self.length_remaining is not None - and self.length_remaining != 0 - ): - # This is an edge case that httplib failed to cover due - # to concerns of backward compatibility. We're - # addressing it here to make sure IncompleteRead is - # raised during streaming, so all calls with incorrect - # Content-Length are caught. - raise IncompleteRead(self._fp_bytes_read, self.length_remaining) - elif read1 and ( - (amt != 0 and not data) or self.length_remaining == len(data) - ): - # All data has been read, but `self._fp.read1` in - # CPython 3.12 and older doesn't always close - # `http.client.HTTPResponse`, so we close it here. - # See https://github.com/python/cpython/issues/113199 - self._fp.close() - - if data: - self._fp_bytes_read += len(data) - if self.length_remaining is not None: - self.length_remaining -= len(data) - return data - - def read( - self, - amt: int | None = None, - decode_content: bool | None = None, - cache_content: bool = False, - ) -> bytes: - """ - Similar to :meth:`http.client.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - self._init_decoder() - if decode_content is None: - decode_content = self.decode_content - - if amt is not None: - cache_content = False - - if len(self._decoded_buffer) >= amt: - return self._decoded_buffer.get(amt) - - data = self._raw_read(amt) - - flush_decoder = amt is None or (amt != 0 and not data) - - if not data and len(self._decoded_buffer) == 0: - return data - - if amt is None: - data = self._decode(data, decode_content, flush_decoder) - if cache_content: - self._body = data - else: - # do not waste memory on buffer when not decoding - if not decode_content: - if self._has_decoded_content: - raise RuntimeError( - "Calling read(decode_content=False) is not supported after " - "read(decode_content=True) was called." - ) - return data - - decoded_data = self._decode(data, decode_content, flush_decoder) - self._decoded_buffer.put(decoded_data) - - while len(self._decoded_buffer) < amt and data: - # TODO make sure to initially read enough data to get past the headers - # For example, the GZ file header takes 10 bytes, we don't want to read - # it one byte at a time - data = self._raw_read(amt) - decoded_data = self._decode(data, decode_content, flush_decoder) - self._decoded_buffer.put(decoded_data) - data = self._decoded_buffer.get(amt) - - return data - - def read1( - self, - amt: int | None = None, - decode_content: bool | None = None, - ) -> bytes: - """ - Similar to ``http.client.HTTPResponse.read1`` and documented - in :meth:`io.BufferedReader.read1`, but with an additional parameter: - ``decode_content``. - - :param amt: - How much of the content to read. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - if decode_content is None: - decode_content = self.decode_content - # try and respond without going to the network - if self._has_decoded_content: - if not decode_content: - raise RuntimeError( - "Calling read1(decode_content=False) is not supported after " - "read1(decode_content=True) was called." - ) - if len(self._decoded_buffer) > 0: - if amt is None: - return self._decoded_buffer.get_all() - return self._decoded_buffer.get(amt) - if amt == 0: - return b"" - - # FIXME, this method's type doesn't say returning None is possible - data = self._raw_read(amt, read1=True) - if not decode_content or data is None: - return data - - self._init_decoder() - while True: - flush_decoder = not data - decoded_data = self._decode(data, decode_content, flush_decoder) - self._decoded_buffer.put(decoded_data) - if decoded_data or flush_decoder: - break - data = self._raw_read(8192, read1=True) - - if amt is None: - return self._decoded_buffer.get_all() - return self._decoded_buffer.get(amt) - - def stream( - self, amt: int | None = 2**16, decode_content: bool | None = None - ) -> typing.Generator[bytes, None, None]: - """ - A generator wrapper for the read() method. A call will block until - ``amt`` bytes have been read from the connection or until the - connection is closed. - - :param amt: - How much of the content to read. The generator will return up to - much data per iteration, but may return less. This is particularly - likely when using compressed data. However, the empty string will - never be returned. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - if self.chunked and self.supports_chunked_reads(): - yield from self.read_chunked(amt, decode_content=decode_content) - else: - while not is_fp_closed(self._fp) or len(self._decoded_buffer) > 0: - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data - - # Overrides from io.IOBase - def readable(self) -> bool: - return True - - def close(self) -> None: - if not self.closed and self._fp: - self._fp.close() - - if self._connection: - self._connection.close() - - if not self.auto_close: - io.IOBase.close(self) - - @property - def closed(self) -> bool: - if not self.auto_close: - return io.IOBase.closed.__get__(self) # type: ignore[no-any-return] - elif self._fp is None: - return True - elif hasattr(self._fp, "isclosed"): - return self._fp.isclosed() - elif hasattr(self._fp, "closed"): - return self._fp.closed - else: - return True - - def fileno(self) -> int: - if self._fp is None: - raise OSError("HTTPResponse has no file to get a fileno from") - elif hasattr(self._fp, "fileno"): - return self._fp.fileno() - else: - raise OSError( - "The file-like object this HTTPResponse is wrapped " - "around has no file descriptor" - ) - - def flush(self) -> None: - if ( - self._fp is not None - and hasattr(self._fp, "flush") - and not getattr(self._fp, "closed", False) - ): - return self._fp.flush() - - def supports_chunked_reads(self) -> bool: - """ - Checks if the underlying file-like object looks like a - :class:`http.client.HTTPResponse` object. We do this by testing for - the fp attribute. If it is present we assume it returns raw chunks as - processed by read_chunked(). - """ - return hasattr(self._fp, "fp") - - def _update_chunk_length(self) -> None: - # First, we'll figure out length of a chunk and then - # we'll try to read it from socket. - if self.chunk_left is not None: - return None - line = self._fp.fp.readline() # type: ignore[union-attr] - line = line.split(b";", 1)[0] - try: - self.chunk_left = int(line, 16) - except ValueError: - self.close() - if line: - # Invalid chunked protocol response, abort. - raise InvalidChunkLength(self, line) from None - else: - # Truncated at start of next chunk - raise ProtocolError("Response ended prematurely") from None - - def _handle_chunk(self, amt: int | None) -> bytes: - returned_chunk = None - if amt is None: - chunk = self._fp._safe_read(self.chunk_left) # type: ignore[union-attr] - returned_chunk = chunk - self._fp._safe_read(2) # type: ignore[union-attr] # Toss the CRLF at the end of the chunk. - self.chunk_left = None - elif self.chunk_left is not None and amt < self.chunk_left: - value = self._fp._safe_read(amt) # type: ignore[union-attr] - self.chunk_left = self.chunk_left - amt - returned_chunk = value - elif amt == self.chunk_left: - value = self._fp._safe_read(amt) # type: ignore[union-attr] - self._fp._safe_read(2) # type: ignore[union-attr] # Toss the CRLF at the end of the chunk. - self.chunk_left = None - returned_chunk = value - else: # amt > self.chunk_left - returned_chunk = self._fp._safe_read(self.chunk_left) # type: ignore[union-attr] - self._fp._safe_read(2) # type: ignore[union-attr] # Toss the CRLF at the end of the chunk. - self.chunk_left = None - return returned_chunk # type: ignore[no-any-return] - - def read_chunked( - self, amt: int | None = None, decode_content: bool | None = None - ) -> typing.Generator[bytes, None, None]: - """ - Similar to :meth:`HTTPResponse.read`, but with an additional - parameter: ``decode_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - self._init_decoder() - # FIXME: Rewrite this method and make it a class with a better structured logic. - if not self.chunked: - raise ResponseNotChunked( - "Response is not chunked. " - "Header 'transfer-encoding: chunked' is missing." - ) - if not self.supports_chunked_reads(): - raise BodyNotHttplibCompatible( - "Body should be http.client.HTTPResponse like. " - "It should have have an fp attribute which returns raw chunks." - ) - - with self._error_catcher(): - # Don't bother reading the body of a HEAD request. - if self._original_response and is_response_to_head(self._original_response): - self._original_response.close() - return None - - # If a response is already read and closed - # then return immediately. - if self._fp.fp is None: # type: ignore[union-attr] - return None - - while True: - self._update_chunk_length() - if self.chunk_left == 0: - break - chunk = self._handle_chunk(amt) - decoded = self._decode( - chunk, decode_content=decode_content, flush_decoder=False - ) - if decoded: - yield decoded - - if decode_content: - # On CPython and PyPy, we should never need to flush the - # decoder. However, on Jython we *might* need to, so - # lets defensively do it anyway. - decoded = self._flush_decoder() - if decoded: # Platform-specific: Jython. - yield decoded - - # Chunk content ends with \r\n: discard it. - while self._fp is not None: - line = self._fp.fp.readline() - if not line: - # Some sites may not end with '\r\n'. - break - if line == b"\r\n": - break - - # We read everything; close the "file". - if self._original_response: - self._original_response.close() - - @property - def url(self) -> str | None: - """ - Returns the URL that was the source of this response. - If the request that generated this response redirected, this method - will return the final redirect location. - """ - return self._request_url - - @url.setter - def url(self, url: str) -> None: - self._request_url = url - - def __iter__(self) -> typing.Iterator[bytes]: - buffer: list[bytes] = [] - for chunk in self.stream(decode_content=True): - if b"\n" in chunk: - chunks = chunk.split(b"\n") - yield b"".join(buffer) + chunks[0] + b"\n" - for x in chunks[1:-1]: - yield x + b"\n" - if chunks[-1]: - buffer = [chunks[-1]] - else: - buffer = [] - else: - buffer.append(chunk) - if buffer: - yield b"".join(buffer) diff --git a/.flatpak-builder/cache/objects/3d/f418550a210db034bf531a67f6c7167e5c233afc42cccd155336d5ab07974b.file b/.flatpak-builder/cache/objects/3d/f418550a210db034bf531a67f6c7167e5c233afc42cccd155336d5ab07974b.file deleted file mode 100644 index 92962ca9d048ce33bfb8fc522f3103198bb787f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmY+BF>ljA6vxj=n>bFLMr|PiA>jpysO8+W6BVjJER_(bf=;)bT;C%;#j(xZxl%lN zub8`3Vgxom3Zs<~zCfgIop`2g1b5Qu_x^Y9ulL@4bzP@P2-!Ic+1q;$&VM5>mvu{5 z6ybsh!icb#B^s_Y-x)>bKOq3?x z(aFiN_c2x8Q9cb4O^e5oF_}K_{kx}BK_E;7A`LZ_Y0=uF`y;w5$*4gJ_YEWon8rsOy>-hY|-8n*N6@|(B#^7)5{@NVeL zJDeM7V&Htf&ba^`Dw!FXCMdKy&sB`j<@^kkzELsbG?%eJ-QhgQu| z5E5ORyPSu2WnpMz7)>> import requests - >>> r = requests.get('https://www.python.org') - >>> r.status_code - 200 - >>> b'Python is a programming language' in r.content - True - -... or POST: - - >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('https://httpbin.org/post', data=payload) - >>> print(r.text) - { - ... - "form": { - "key1": "value1", - "key2": "value2" - }, - ... - } - -The other HTTP methods are supported - see `requests.api`. Full documentation -is at . - -:copyright: (c) 2017 by Kenneth Reitz. -:license: Apache 2.0, see LICENSE for more details. -""" - -import warnings - -import urllib3 - -from .exceptions import RequestsDependencyWarning - -try: - from charset_normalizer import __version__ as charset_normalizer_version -except ImportError: - charset_normalizer_version = None - -try: - from chardet import __version__ as chardet_version -except ImportError: - chardet_version = None - - -def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version): - urllib3_version = urllib3_version.split(".") - assert urllib3_version != ["dev"] # Verify urllib3 isn't installed from git. - - # Sometimes, urllib3 only reports its version as 16.1. - if len(urllib3_version) == 2: - urllib3_version.append("0") - - # Check urllib3 for compatibility. - major, minor, patch = urllib3_version # noqa: F811 - major, minor, patch = int(major), int(minor), int(patch) - # urllib3 >= 1.21.1 - assert major >= 1 - if major == 1: - assert minor >= 21 - - # Check charset_normalizer for compatibility. - if chardet_version: - major, minor, patch = chardet_version.split(".")[:3] - major, minor, patch = int(major), int(minor), int(patch) - # chardet_version >= 3.0.2, < 6.0.0 - assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0) - elif charset_normalizer_version: - major, minor, patch = charset_normalizer_version.split(".")[:3] - major, minor, patch = int(major), int(minor), int(patch) - # charset_normalizer >= 2.0.0 < 4.0.0 - assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) - else: - raise Exception("You need either charset_normalizer or chardet installed") - - -def _check_cryptography(cryptography_version): - # cryptography < 1.3.4 - try: - cryptography_version = list(map(int, cryptography_version.split("."))) - except ValueError: - return - - if cryptography_version < [1, 3, 4]: - warning = "Old version of cryptography ({}) may cause slowdown.".format( - cryptography_version - ) - warnings.warn(warning, RequestsDependencyWarning) - - -# Check imported dependencies for compatibility. -try: - check_compatibility( - urllib3.__version__, chardet_version, charset_normalizer_version - ) -except (AssertionError, ValueError): - warnings.warn( - "urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported " - "version!".format( - urllib3.__version__, chardet_version, charset_normalizer_version - ), - RequestsDependencyWarning, - ) - -# Attempt to enable urllib3's fallback for SNI support -# if the standard library doesn't support SNI or the -# 'ssl' library isn't available. -try: - try: - import ssl - except ImportError: - ssl = None - - if not getattr(ssl, "HAS_SNI", False): - from urllib3.contrib import pyopenssl - - pyopenssl.inject_into_urllib3() - - # Check cryptography version - from cryptography import __version__ as cryptography_version - - _check_cryptography(cryptography_version) -except ImportError: - pass - -# urllib3's DependencyWarnings should be silenced. -from urllib3.exceptions import DependencyWarning - -warnings.simplefilter("ignore", DependencyWarning) - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -from . import packages, utils -from .__version__ import ( - __author__, - __author_email__, - __build__, - __cake__, - __copyright__, - __description__, - __license__, - __title__, - __url__, - __version__, -) -from .api import delete, get, head, options, patch, post, put, request -from .exceptions import ( - ConnectionError, - ConnectTimeout, - FileModeWarning, - HTTPError, - JSONDecodeError, - ReadTimeout, - RequestException, - Timeout, - TooManyRedirects, - URLRequired, -) -from .models import PreparedRequest, Request, Response -from .sessions import Session, session -from .status_codes import codes - -logging.getLogger(__name__).addHandler(NullHandler()) - -# FileModeWarnings go off per the default. -warnings.simplefilter("default", FileModeWarning, append=True) diff --git a/.flatpak-builder/cache/objects/3e/73d7be8cf586f48918718b614e2baffbf690cf1c030ca627fe8147b319a6e6.dirtree b/.flatpak-builder/cache/objects/3e/73d7be8cf586f48918718b614e2baffbf690cf1c030ca627fe8147b319a6e6.dirtree deleted file mode 100644 index d4d4f8d5f8ace898a94e15ff3d99e6a5e7b66ee7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmYdEO)5=iuz$V5SnEi8~Y1SKkzW)9iT7ofFcb##T^Sl98WhtY>J*@Zh<6@492hTYZ1-kZ0p# eI&IBupwaN4;&_2&cSZMnNnS#RX>)r_WdH!@Lq|OT diff --git a/.flatpak-builder/cache/objects/3e/ab1940c14997d593ebb504f3d76edd53884529d19a88f423fa117b15ea0fe7.file b/.flatpak-builder/cache/objects/3e/ab1940c14997d593ebb504f3d76edd53884529d19a88f423fa117b15ea0fe7.file deleted file mode 100644 index 3f3be70..0000000 --- a/.flatpak-builder/cache/objects/3e/ab1940c14997d593ebb504f3d76edd53884529d19a88f423fa117b15ea0fe7.file +++ /dev/null @@ -1,186 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# screen grabber -# -# History: -# 2001-04-26 fl created -# 2001-09-17 fl use builtin driver, if present -# 2002-11-19 fl added grabclipboard support -# -# Copyright (c) 2001-2002 by Secret Labs AB -# Copyright (c) 2001-2002 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import shutil -import subprocess -import sys -import tempfile - -from . import Image - - -def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None): - if xdisplay is None: - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - args = ["screencapture"] - if bbox: - left, top, right, bottom = bbox - args += ["-R", f"{left},{top},{right-left},{bottom-top}"] - subprocess.call(args + ["-x", filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_resized = im.resize((right - left, bottom - top)) - im.close() - return im_resized - return im - elif sys.platform == "win32": - offset, size, data = Image.core.grabscreen_win32( - include_layered_windows, all_screens - ) - im = Image.frombytes( - "RGB", - size, - data, - # RGB, 32-bit line padding, origin lower left corner - "raw", - "BGR", - (size[0] * 3 + 3) & -4, - -1, - ) - if bbox: - x0, y0 = offset - left, top, right, bottom = bbox - im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) - return im - try: - if not Image.core.HAVE_XCB: - msg = "Pillow was built without XCB support" - raise OSError(msg) - size, data = Image.core.grabscreen_x11(xdisplay) - except OSError: - if ( - xdisplay is None - and sys.platform not in ("darwin", "win32") - and shutil.which("gnome-screenshot") - ): - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - subprocess.call(["gnome-screenshot", "-f", filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_cropped = im.crop(bbox) - im.close() - return im_cropped - return im - else: - raise - else: - im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1) - if bbox: - im = im.crop(bbox) - return im - - -def grabclipboard(): - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - commands = [ - 'set theFile to (open for access POSIX file "' - + filepath - + '" with write permission)', - "try", - " write (the clipboard as «class PNGf») to theFile", - "end try", - "close access theFile", - ] - script = ["osascript"] - for command in commands: - script += ["-e", command] - subprocess.call(script) - - im = None - if os.stat(filepath).st_size != 0: - im = Image.open(filepath) - im.load() - os.unlink(filepath) - return im - elif sys.platform == "win32": - fmt, data = Image.core.grabclipboard_win32() - if fmt == "file": # CF_HDROP - import struct - - o = struct.unpack_from("I", data)[0] - if data[16] != 0: - files = data[o:].decode("utf-16le").split("\0") - else: - files = data[o:].decode("mbcs").split("\0") - return files[: files.index("")] - if isinstance(data, bytes): - data = io.BytesIO(data) - if fmt == "png": - from . import PngImagePlugin - - return PngImagePlugin.PngImageFile(data) - elif fmt == "DIB": - from . import BmpImagePlugin - - return BmpImagePlugin.DibImageFile(data) - return None - else: - if os.getenv("WAYLAND_DISPLAY"): - session_type = "wayland" - elif os.getenv("DISPLAY"): - session_type = "x11" - else: # Session type check failed - session_type = None - - if shutil.which("wl-paste") and session_type in ("wayland", None): - args = ["wl-paste", "-t", "image"] - elif shutil.which("xclip") and session_type in ("x11", None): - args = ["xclip", "-selection", "clipboard", "-t", "image/png", "-o"] - else: - msg = "wl-paste or xclip is required for ImageGrab.grabclipboard() on Linux" - raise NotImplementedError(msg) - - p = subprocess.run(args, capture_output=True) - if p.returncode != 0: - err = p.stderr - for silent_error in [ - # wl-paste, when the clipboard is empty - b"Nothing is copied", - # Ubuntu/Debian wl-paste, when the clipboard is empty - b"No selection", - # Ubuntu/Debian wl-paste, when an image isn't available - b"No suitable type of content copied", - # wl-paste or Ubuntu/Debian xclip, when an image isn't available - b" not available", - # xclip, when an image isn't available - b"cannot convert ", - # xclip, when the clipboard isn't initialized - b"xclip: Error: There is no owner for the ", - ]: - if silent_error in err: - return None - msg = f"{args[0]} error" - if err: - msg += f": {err.strip().decode()}" - raise ChildProcessError(msg) - - data = io.BytesIO(p.stdout) - im = Image.open(data) - im.load() - return im diff --git a/.flatpak-builder/cache/objects/3f/16b106f2dbf509344dcae863e510fd42eaf7637821afd050863d5d2400eae4.file b/.flatpak-builder/cache/objects/3f/16b106f2dbf509344dcae863e510fd42eaf7637821afd050863d5d2400eae4.file deleted file mode 100644 index 97151e5e05dd0822a50416f1b93edcaa2563bc34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmaJ<%WB&|6rGV}*_N>bcKYzPG{sufB6u508WS2Qn3QBCD1&OLtx~-hjVak>(f&fS z@22VBc;P@8>JsS6JA>&atKO^FQXEW&%hj1P_oXxQqgK-kgpjuv-+o>EZoT;fI9tjs zqVqif=foin^+`Z2N)ao*VilZ%qxx!4w2FadX}}j9%`XLIs~l9U3hZ^K@!%! zb&3TIDyw!FM#2_e6ej&C_BRySI5<8&>_uVd4)EYGihS8b?r4>q(%bmQ`$00`UM$>j zHB+`$PwwPPjk{vVL#g&7=!4@d7yc|vLg(KBoD;F+;VTwGAjL8)v^+$Vb9^TvCyCJW z%}JKYN=tU7+WOe6heJS2+BYg3DP9C8Yq>~0Kj9TTz&5fpq>o)X)EjZ6x+C` z^G`B|Tyk?@+Hq_`x*4B}k5Sm|Y;T*1C*0?;J@{mQa1(P;-h}FcL!g`8ipiK4dV;Y| zd@7q>cmfv-jELAGhd+QGIBC)acSin}Nqd)Gst?EN(@Fc~rTS>BZcW;|Utf)p+nN}A z3;1lLqVXo=845?ecolI~>WsY~!X3MeaeP^_vFO&x|DV_Kpq>*kJhoKFR5QMT^-^t9 z9dS(FK!^SKCb*mOP7pam-+jSbu*D~td0vq(CotqGR=w08S)mn^=I(lrOuKW}4x z+IsxmyKSYvmIz&aQ~XV{<283qNQVkbaeir0aw None: - # Header - assert self.fp is not None - - s = self.fp.read(1037) - - if i16(s) not in [65534, 65535]: - msg = "Not a valid GD 2.x .gd file" - raise SyntaxError(msg) - - self._mode = "L" # FIXME: "P" - self._size = i16(s, 2), i16(s, 4) - - true_color = s[6] - true_color_offset = 2 if true_color else 0 - - # transparency index - tindex = i32(s, 7 + true_color_offset) - if tindex < 256: - self.info["transparency"] = tindex - - self.palette = ImagePalette.raw( - "XBGR", s[7 + true_color_offset + 4 : 7 + true_color_offset + 4 + 256 * 4] - ) - - self.tile = [ - ( - "raw", - (0, 0) + self.size, - 7 + true_color_offset + 4 + 256 * 4, - ("L", 0, 1), - ) - ] - - -def open(fp: StrOrBytesPath | IO[bytes], mode: str = "r") -> GdImageFile: - """ - Load texture from a GD image file. - - :param fp: GD file name, or an opened file handle. - :param mode: Optional mode. In this version, if the mode argument - is given, it must be "r". - :returns: An image instance. - :raises OSError: If the image could not be read. - """ - if mode != "r": - msg = "bad mode" - raise ValueError(msg) - - try: - return GdImageFile(fp) - except SyntaxError as e: - msg = "cannot identify this image file" - raise UnidentifiedImageError(msg) from e diff --git a/.flatpak-builder/cache/objects/40/f1b515e0a7cb8af0e71355723d28b623b0221f1d65d723e0aff056c3383777.file b/.flatpak-builder/cache/objects/40/f1b515e0a7cb8af0e71355723d28b623b0221f1d65d723e0aff056c3383777.file deleted file mode 100644 index 9a8786587c023c3843c7e629a72f5c82fb2f78c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 zcmah}-)q!Z6ux(ICz(lX`ope{R?A?eyQS<5{b9F?6qc^FBG!kx6=zw8baLCKO=o6r zQf6B$L~)nk_Mt3-MG@zzj#S_L1N;*vkcV)e1fTXT;LFe_@11Gf5tj9yn{yA}J?Hz* z2_Y{#I%EL=@apv9@XDL~(gzlQUgA;o@el&=1n5AACdh$gD}p\@{Rb{>#^*usRI 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 diff --git a/.flatpak-builder/cache/objects/43/5ace3b37539d48f8811969ca4ed03e04b7f5331cdf7e4da5e9352f924a00c4.file b/.flatpak-builder/cache/objects/43/5ace3b37539d48f8811969ca4ed03e04b7f5331cdf7e4da5e9352f924a00c4.file deleted file mode 100644 index 05779fa..0000000 --- a/.flatpak-builder/cache/objects/43/5ace3b37539d48f8811969ca4ed03e04b7f5331cdf7e4da5e9352f924a00c4.file +++ /dev/null @@ -1,122 +0,0 @@ -Metadata-Version: 2.1 -Name: requests -Version: 2.31.0 -Summary: Python HTTP for Humans. -Home-page: https://requests.readthedocs.io -Author: Kenneth Reitz -Author-email: me@kennethreitz.org -License: Apache 2.0 -Project-URL: Documentation, https://requests.readthedocs.io -Project-URL: Source, https://github.com/psf/requests -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Natural Language :: English -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: Software Development :: Libraries -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -License-File: LICENSE -Requires-Dist: charset-normalizer (<4,>=2) -Requires-Dist: idna (<4,>=2.5) -Requires-Dist: urllib3 (<3,>=1.21.1) -Requires-Dist: certifi (>=2017.4.17) -Provides-Extra: security -Provides-Extra: socks -Requires-Dist: PySocks (!=1.5.7,>=1.5.6) ; extra == 'socks' -Provides-Extra: use_chardet_on_py3 -Requires-Dist: chardet (<6,>=3.0.2) ; extra == 'use_chardet_on_py3' - -# Requests - -**Requests** is a simple, yet elegant, HTTP library. - -```python ->>> import requests ->>> r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass')) ->>> r.status_code -200 ->>> r.headers['content-type'] -'application/json; charset=utf8' ->>> r.encoding -'utf-8' ->>> r.text -'{"authenticated": true, ...' ->>> r.json() -{'authenticated': True, ...} -``` - -Requests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method! - -Requests is one of the most downloaded Python packages today, pulling in around `30M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `1,000,000+` repositories. You may certainly put your trust in this code. - -[![Downloads](https://pepy.tech/badge/requests/month)](https://pepy.tech/project/requests) -[![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests) -[![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors) - -## Installing Requests and Supported Versions - -Requests is available on PyPI: - -```console -$ python -m pip install requests -``` - -Requests officially supports Python 3.7+. - -## Supported Features & Best–Practices - -Requests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today. - -- Keep-Alive & Connection Pooling -- International Domains and URLs -- Sessions with Cookie Persistence -- Browser-style TLS/SSL Verification -- Basic & Digest Authentication -- Familiar `dict`–like Cookies -- Automatic Content Decompression and Decoding -- Multi-part File Uploads -- SOCKS Proxy Support -- Connection Timeouts -- Streaming Downloads -- Automatic honoring of `.netrc` -- Chunked HTTP Requests - -## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io) - -[![Read the Docs](https://raw.githubusercontent.com/psf/requests/main/ext/ss.png)](https://requests.readthedocs.io) - -## Cloning the repository - -When cloning the Requests repository, you may need to add the `-c -fetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit (see -[this issue](https://github.com/psf/requests/issues/2690) for more background): - -```shell -git clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git -``` - -You can also apply this setting to your global Git config: - -```shell -git config --global fetch.fsck.badTimezone ignore -``` - ---- - -[![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/main/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/main/ext/psf.png)](https://www.python.org/psf) - - diff --git a/.flatpak-builder/cache/objects/43/5d429de64946fa8c7bd78126aa0e59e587caae6c5ff4a75b03ca6d16a0571f.file b/.flatpak-builder/cache/objects/43/5d429de64946fa8c7bd78126aa0e59e587caae6c5ff4a75b03ca6d16a0571f.file deleted file mode 100644 index 908fc66..0000000 --- a/.flatpak-builder/cache/objects/43/5d429de64946fa8c7bd78126aa0e59e587caae6c5ff4a75b03ca6d16a0571f.file +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -import typing - -from .url import Url - -if typing.TYPE_CHECKING: - from ..connection import ProxyConfig - - -def connection_requires_http_tunnel( - proxy_url: Url | None = None, - proxy_config: ProxyConfig | None = None, - destination_scheme: str | None = None, -) -> bool: - """ - Returns True if the connection requires an HTTP CONNECT through the proxy. - - :param URL proxy_url: - URL of the proxy. - :param ProxyConfig proxy_config: - Proxy configuration from poolmanager.py - :param str destination_scheme: - The scheme of the destination. (i.e https, http, etc) - """ - # If we're not using a proxy, no way to use a tunnel. - if proxy_url is None: - return False - - # HTTP destinations never require tunneling, we always forward. - if destination_scheme == "http": - return False - - # Support for forwarding with HTTPS proxies and HTTPS destinations. - if ( - proxy_url.scheme == "https" - and proxy_config - and proxy_config.use_forwarding_for_https - ): - return False - - # Otherwise always use a tunnel. - return True diff --git a/.flatpak-builder/cache/objects/43/af829f849a8e721df02231d2309271302f1292f20a9e346cf66899db8bb275.file b/.flatpak-builder/cache/objects/43/af829f849a8e721df02231d2309271302f1292f20a9e346cf66899db8bb275.file deleted file mode 100644 index 4ea6760..0000000 --- a/.flatpak-builder/cache/objects/43/af829f849a8e721df02231d2309271302f1292f20a9e346cf66899db8bb275.file +++ /dev/null @@ -1,395 +0,0 @@ -import importlib -from codecs import IncrementalDecoder -from collections import Counter -from functools import lru_cache -from typing import Counter as TypeCounter, Dict, List, Optional, Tuple - -from .constant import ( - FREQUENCIES, - KO_NAMES, - LANGUAGE_SUPPORTED_COUNT, - TOO_SMALL_SEQUENCE, - ZH_NAMES, -) -from .md import is_suspiciously_successive_range -from .models import CoherenceMatches -from .utils import ( - is_accentuated, - is_latin, - is_multi_byte_encoding, - is_unicode_range_secondary, - unicode_range, -) - - -def encoding_unicode_range(iana_name: str) -> List[str]: - """ - Return associated unicode ranges in a single byte code page. - """ - if is_multi_byte_encoding(iana_name): - raise IOError("Function not supported on multi-byte code page") - - decoder = importlib.import_module( - "encodings.{}".format(iana_name) - ).IncrementalDecoder - - p: IncrementalDecoder = decoder(errors="ignore") - seen_ranges: Dict[str, int] = {} - character_count: int = 0 - - for i in range(0x40, 0xFF): - chunk: str = p.decode(bytes([i])) - - if chunk: - character_range: Optional[str] = unicode_range(chunk) - - if character_range is None: - continue - - if is_unicode_range_secondary(character_range) is False: - if character_range not in seen_ranges: - seen_ranges[character_range] = 0 - seen_ranges[character_range] += 1 - character_count += 1 - - return sorted( - [ - character_range - for character_range in seen_ranges - if seen_ranges[character_range] / character_count >= 0.15 - ] - ) - - -def unicode_range_languages(primary_range: str) -> List[str]: - """ - Return inferred languages used with a unicode range. - """ - languages: List[str] = [] - - for language, characters in FREQUENCIES.items(): - for character in characters: - if unicode_range(character) == primary_range: - languages.append(language) - break - - return languages - - -@lru_cache() -def encoding_languages(iana_name: str) -> List[str]: - """ - Single-byte encoding language association. Some code page are heavily linked to particular language(s). - This function does the correspondence. - """ - unicode_ranges: List[str] = encoding_unicode_range(iana_name) - primary_range: Optional[str] = None - - for specified_range in unicode_ranges: - if "Latin" not in specified_range: - primary_range = specified_range - break - - if primary_range is None: - return ["Latin Based"] - - return unicode_range_languages(primary_range) - - -@lru_cache() -def mb_encoding_languages(iana_name: str) -> List[str]: - """ - Multi-byte encoding language association. Some code page are heavily linked to particular language(s). - This function does the correspondence. - """ - if ( - iana_name.startswith("shift_") - or iana_name.startswith("iso2022_jp") - or iana_name.startswith("euc_j") - or iana_name == "cp932" - ): - return ["Japanese"] - if iana_name.startswith("gb") or iana_name in ZH_NAMES: - return ["Chinese"] - if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: - return ["Korean"] - - return [] - - -@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) -def get_target_features(language: str) -> Tuple[bool, bool]: - """ - Determine main aspects from a supported language if it contains accents and if is pure Latin. - """ - target_have_accents: bool = False - target_pure_latin: bool = True - - for character in FREQUENCIES[language]: - if not target_have_accents and is_accentuated(character): - target_have_accents = True - if target_pure_latin and is_latin(character) is False: - target_pure_latin = False - - return target_have_accents, target_pure_latin - - -def alphabet_languages( - characters: List[str], ignore_non_latin: bool = False -) -> List[str]: - """ - Return associated languages associated to given characters. - """ - languages: List[Tuple[str, float]] = [] - - source_have_accents = any(is_accentuated(character) for character in characters) - - for language, language_characters in FREQUENCIES.items(): - target_have_accents, target_pure_latin = get_target_features(language) - - if ignore_non_latin and target_pure_latin is False: - continue - - if target_have_accents is False and source_have_accents: - continue - - character_count: int = len(language_characters) - - character_match_count: int = len( - [c for c in language_characters if c in characters] - ) - - ratio: float = character_match_count / character_count - - if ratio >= 0.2: - languages.append((language, ratio)) - - languages = sorted(languages, key=lambda x: x[1], reverse=True) - - return [compatible_language[0] for compatible_language in languages] - - -def characters_popularity_compare( - language: str, ordered_characters: List[str] -) -> float: - """ - Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. - The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). - Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) - """ - if language not in FREQUENCIES: - raise ValueError("{} not available".format(language)) - - character_approved_count: int = 0 - FREQUENCIES_language_set = set(FREQUENCIES[language]) - - ordered_characters_count: int = len(ordered_characters) - target_language_characters_count: int = len(FREQUENCIES[language]) - - large_alphabet: bool = target_language_characters_count > 26 - - for character, character_rank in zip( - ordered_characters, range(0, ordered_characters_count) - ): - if character not in FREQUENCIES_language_set: - continue - - character_rank_in_language: int = FREQUENCIES[language].index(character) - expected_projection_ratio: float = ( - target_language_characters_count / ordered_characters_count - ) - character_rank_projection: int = int(character_rank * expected_projection_ratio) - - if ( - large_alphabet is False - and abs(character_rank_projection - character_rank_in_language) > 4 - ): - continue - - if ( - large_alphabet is True - and abs(character_rank_projection - character_rank_in_language) - < target_language_characters_count / 3 - ): - character_approved_count += 1 - continue - - characters_before_source: List[str] = FREQUENCIES[language][ - 0:character_rank_in_language - ] - characters_after_source: List[str] = FREQUENCIES[language][ - character_rank_in_language: - ] - characters_before: List[str] = ordered_characters[0:character_rank] - characters_after: List[str] = ordered_characters[character_rank:] - - before_match_count: int = len( - set(characters_before) & set(characters_before_source) - ) - - after_match_count: int = len( - set(characters_after) & set(characters_after_source) - ) - - if len(characters_before_source) == 0 and before_match_count <= 4: - character_approved_count += 1 - continue - - if len(characters_after_source) == 0 and after_match_count <= 4: - character_approved_count += 1 - continue - - if ( - before_match_count / len(characters_before_source) >= 0.4 - or after_match_count / len(characters_after_source) >= 0.4 - ): - character_approved_count += 1 - continue - - return character_approved_count / len(ordered_characters) - - -def alpha_unicode_split(decoded_sequence: str) -> List[str]: - """ - Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. - Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; - One containing the latin letters and the other hebrew. - """ - layers: Dict[str, str] = {} - - for character in decoded_sequence: - if character.isalpha() is False: - continue - - character_range: Optional[str] = unicode_range(character) - - if character_range is None: - continue - - layer_target_range: Optional[str] = None - - for discovered_range in layers: - if ( - is_suspiciously_successive_range(discovered_range, character_range) - is False - ): - layer_target_range = discovered_range - break - - if layer_target_range is None: - layer_target_range = character_range - - if layer_target_range not in layers: - layers[layer_target_range] = character.lower() - continue - - layers[layer_target_range] += character.lower() - - return list(layers.values()) - - -def merge_coherence_ratios(results: List[CoherenceMatches]) -> CoherenceMatches: - """ - This function merge results previously given by the function coherence_ratio. - The return type is the same as coherence_ratio. - """ - per_language_ratios: Dict[str, List[float]] = {} - for result in results: - for sub_result in result: - language, ratio = sub_result - if language not in per_language_ratios: - per_language_ratios[language] = [ratio] - continue - per_language_ratios[language].append(ratio) - - merge = [ - ( - language, - round( - sum(per_language_ratios[language]) / len(per_language_ratios[language]), - 4, - ), - ) - for language in per_language_ratios - ] - - return sorted(merge, key=lambda x: x[1], reverse=True) - - -def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches: - """ - We shall NOT return "English—" in CoherenceMatches because it is an alternative - of "English". This function only keeps the best match and remove the em-dash in it. - """ - index_results: Dict[str, List[float]] = dict() - - for result in results: - language, ratio = result - no_em_name: str = language.replace("—", "") - - if no_em_name not in index_results: - index_results[no_em_name] = [] - - index_results[no_em_name].append(ratio) - - if any(len(index_results[e]) > 1 for e in index_results): - filtered_results: CoherenceMatches = [] - - for language in index_results: - filtered_results.append((language, max(index_results[language]))) - - return filtered_results - - return results - - -@lru_cache(maxsize=2048) -def coherence_ratio( - decoded_sequence: str, threshold: float = 0.1, lg_inclusion: Optional[str] = None -) -> CoherenceMatches: - """ - Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. - A layer = Character extraction by alphabets/ranges. - """ - - results: List[Tuple[str, float]] = [] - ignore_non_latin: bool = False - - sufficient_match_count: int = 0 - - lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] - if "Latin Based" in lg_inclusion_list: - ignore_non_latin = True - lg_inclusion_list.remove("Latin Based") - - for layer in alpha_unicode_split(decoded_sequence): - sequence_frequencies: TypeCounter[str] = Counter(layer) - most_common = sequence_frequencies.most_common() - - character_count: int = sum(o for c, o in most_common) - - if character_count <= TOO_SMALL_SEQUENCE: - continue - - popular_character_ordered: List[str] = [c for c, o in most_common] - - for language in lg_inclusion_list or alphabet_languages( - popular_character_ordered, ignore_non_latin - ): - ratio: float = characters_popularity_compare( - language, popular_character_ordered - ) - - if ratio < threshold: - continue - elif ratio >= 0.8: - sufficient_match_count += 1 - - results.append((language, round(ratio, 4))) - - if sufficient_match_count >= 3: - break - - return sorted( - filter_alt_coherence_matches(results), key=lambda x: x[1], reverse=True - ) diff --git a/.flatpak-builder/cache/objects/44/0fe274d3fe682682b6f1fbbbd860959f5abbc958ab6a4d1580b03e5d0cd350.file b/.flatpak-builder/cache/objects/44/0fe274d3fe682682b6f1fbbbd860959f5abbc958ab6a4d1580b03e5d0cd350.file deleted file mode 100644 index 26a898c5bd0649d1ab031fd1640b1591cf5037aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12750 zcmbtadu$uWncw9u$>mEFNj1p*-!5Fp?X;Cy#~C`bwz z`6u`LW=V>q~{|B*t6-tL!vCmV%R)s8L~`ThpfOe-{yv-F;2GpEk9(F zt$4D_5}?Dxo#bTOZBDi;)^TgO&$ls{cWFQ@4LRjb*>Rg6a>-7#X^>rjZn*)l(Zng1 zaZedjagKXe@^70!1%D&)9K-dMpKEX%>v5GP**(G9rg`;OXxXfY<1OX3Z}Xsxzmep| z36@dYf!8W~YHL});`q8U_S?w3TYlhpu9~hav{h<`+Ca^rwAE76j6S@zrGKsu_U7$n z()Bd=aYG$!-?x@L)%Fb9LKtUh!A&lKMH6O?0g; z9ppB0yE#p~YPu$TkGl#v@jdW4q=0FV{rkEeQwM##?g&OAQ_)~FG!@a#Kc)@UXVT55 zCxc^(ZezEBP*@qM>@*_Rf|pM{aR&)K+WRc*YEQ)l@&7w2Pk4l>Kw%_>HWQSdaz zXhk+~T$HUENFt4zdO203Q4`)(&UlMH;k-%>RKn~NbRiUp>h_m|;Th$Gs!pl8>%wb_ zIvSq3${z6|{HV@{G-~7be{pbEaC&-II5fO#`g-*8RHT3B?%lhzP*mA59UPg!3v0Vx zI(>H6;B-hk)6}mb#q8N9f_(9ptK!-?InN&w`{VSJ&R6vnx7j;4J7%Z z!9ZOkPP|Sr$=F3=@`fn&7!LjE%P+qSeNN!N3H%p8&8nDz#8zcJRs%W$^G^GJmX}S( zxgWI8nrc>wkDFHZLoF|A0{BE2bR8RyevMg#jFq)s#otd9%~E=b?wbhZ7f-6ccu$nD#WXT0yGMSqhNb-yB zru4=1mHA6^H&QpiU$$n(eCgd_EnD-SES#$`&8NHP#ktd|(}@#BtMji0a@KbI7z=)a zYEOF4eDmB;YA7+V_?3@Et1G=Z^UZs^7OXuvYY!u^JOaXwomN{F73AmUKIqV8wO+`&~#f#)KQwZ&ePmbR3}D@-j5@jB5tD@1K& zJdTSCb-jvlQ5H)=toJE2&Hs0rU`We(-J}jb{ysX7iHG;}k20Q%iHDHwGwb5iv=Y%p z6-=R9w5U2W0v?))kl11@0u*T!VmcC>RCLqmwCVsMm8=cja#>bUq0tO5PBR$IRc16M z=Twqum+;sA86d$e+FZ%Y88L6`D%iS6UaiY|i_V6-C-0n0ADw$K^@7HZ!T6pHSw8RSDR_F4mLhQ>6QcK8`h|ZK_gjC<@3+!6uO!;%Nc?A`fcH6t z8{%aS#xoDY*+fS3kXaUC)LIlP8O*h2$dH6m%c{~EV_J5}c9_Xd7|R?P%UIh6-Cd

cTh230hgIedCxDIAA!xKiEB1S35 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�qWUGIi}#w0N;3Rx^R?W|apu9y*B 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

6vP;4x*;@iknU$cP-RiV%;(l*RklQaM>K3Z&pwf z(rev#xhqabEM{vKsbhu{P@vWx$vnNYM`@)?p-6p%Sn^wLe-Tt^@}UQ^mJ>U#zSzqZpg`MtF;^~1*vLHF3mUa zaSigHovAT2u;H^4@M0Q%sk_TlD+)YMQQeN7(v!!chR`^dS7$psr3ihdl`w>4SP{gnv)QY7ma5WJbGWK0ZGPR;(E5+9K3Q2VOQn@mbK=%XZ7*BI&)t#^T+}+K zjLmGX+D6qYDQeG7GEi*dSIpD`AiaYqTLZ{8mC2*%<0@{Nv4q;!*mOEE7U_3t)f*VR z`LEWAsdI!fHQl1+mh50O8srs6#HN-Ms9xbUU$Pq2N7Yw^iP;CStCN zOf2<#D{+$#`>Kpu>Vox>3#u$>yfY%RXw6IND*9x+tR1%RB~f!KrD2oa55@gT4gx)a7_X5%orcN?19~259jN*{pm(SrW$DU_nIo1R=wn zS}~0Q^qHj0qE&r})hE3h%YCT5R$HSHNvf_OpFR}yM%8Q0Nf+O(_prq}%CmTv)%twE zsLY_3v#;R>2&F0<_*C(pM<8u`Wsa%LLB{fBgn2_Gccdn3KE5#JS&XIV}! z(8!BWYAY(X(?%{h-VQ@&jqHlET?$@*kQ&Q!tL@mcoIkvf92v=9Y+0Eu69<}Fs7grV zqL+SgK=kWRV`KWQuimtN`ayz_S__PMr`$TY`NmCkd0|C8NU}1HmxU5Kw)!#tk{T|uF)%8WK zCg>M_A|aZj#8np4EUWdZFCFw3i*cn3^;Y)9R$jGRr@JlP?DUk5+(oL+`ZWo?{D;t( zMskYuOj9Q*VVH=uT&0kVRPV!C?hSo|L2F>us!LX%RhoKv$eQY@;)^dls*B~xQo6y9f{HeGaRReW>*gVF%k>sxzIYL8L&|##`%6cKajrc=YdfLAHE!m7;%wog4H z6XODy;aGI$^m4khMXBbm7SPwE*v{xRmg-7ca7-1QDr=(!l1 zNEu3(;V(| zI~4H)iT^)mK@cbYRjnAiiZ1Qxf2x+BN%$fpRP2{{D5?<0jfD)uwHWaq> z;W!D&XIK2Kv4QUG;R`R~l92FUC8R$w{;>(+)276S&kV&!sN%98D!Ubfxkk#)`0$DH zaxdr06T+YT{}_HH#chw@l@Q)7KU4^#T{z20J+_B0IZl;`VMzYDQ7}@!#crtwxe4|+ zro@MzOg}MgKP0@IDR^A`hATe&N9Wi>lU?z*x>K~<-+FO;_=O1to)~@@8K7)POVBIn zPy9_lC94iOx7n`s1N?ELLU^TOfJ?rK>@vC#UBc9PB{JM6|KnafOq3l*AdxB2BfsH@ z2c#mPL-@(WlZ7920%u%sb^O!#JHyzC@QL}i>RE2bKV&A4U-Z1?5Pm88fwvO!Pr}K$ zJzdDPJ*G>4<@iU-4>00kqU=cy;U74UYv}P=cCClTrK-2pciBXryMn{JA`JV`X$=WV py_fN;8}WoB>Hr`8$dXz49A5q=+JCx3`0hjahfWtI1W33w{tx{=>c#*7 diff --git a/.flatpak-builder/cache/objects/50/bcf1b97ec9345d111539b31761012c8e16c18e449d0d6e3e27460fa92318b7.dirtree b/.flatpak-builder/cache/objects/50/bcf1b97ec9345d111539b31761012c8e16c18e449d0d6e3e27460fa92318b7.dirtree deleted file mode 100644 index 83abf88a159b4bd5cbd4799d58dea53c30f574bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 918 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 diff --git a/.flatpak-builder/cache/objects/52/8dae0634c8c429d2d1f0876d1eb2e3f5a9227402a2014f6d361e6e5194622c.file b/.flatpak-builder/cache/objects/52/8dae0634c8c429d2d1f0876d1eb2e3f5a9227402a2014f6d361e6e5194622c.file deleted file mode 100644 index a40eeaf..0000000 --- a/.flatpak-builder/cache/objects/52/8dae0634c8c429d2d1f0876d1eb2e3f5a9227402a2014f6d361e6e5194622c.file +++ /dev/null @@ -1,44 +0,0 @@ -from .package_data import __version__ -from .core import ( - IDNABidiError, - IDNAError, - InvalidCodepoint, - InvalidCodepointContext, - alabel, - check_bidi, - check_hyphen_ok, - check_initial_combiner, - check_label, - check_nfc, - decode, - encode, - ulabel, - uts46_remap, - valid_contextj, - valid_contexto, - valid_label_length, - valid_string_length, -) -from .intranges import intranges_contain - -__all__ = [ - "IDNABidiError", - "IDNAError", - "InvalidCodepoint", - "InvalidCodepointContext", - "alabel", - "check_bidi", - "check_hyphen_ok", - "check_initial_combiner", - "check_label", - "check_nfc", - "decode", - "encode", - "intranges_contain", - "ulabel", - "uts46_remap", - "valid_contextj", - "valid_contexto", - "valid_label_length", - "valid_string_length", -] diff --git a/.flatpak-builder/cache/objects/52/bce5b79217d91dbc4489ec6725b01e1d6272c82273c1016c6893b0c86a9e82.file b/.flatpak-builder/cache/objects/52/bce5b79217d91dbc4489ec6725b01e1d6272c82273c1016c6893b0c86a9e82.file deleted file mode 100644 index 98c0d20..0000000 --- a/.flatpak-builder/cache/objects/52/bce5b79217d91dbc4489ec6725b01e1d6272c82273c1016c6893b0c86a9e82.file +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.flatpak-builder/cache/objects/52/fe2c435502384dea87dec1f4bfbaebe286c91a33be5584f660747b87e969dc.file b/.flatpak-builder/cache/objects/52/fe2c435502384dea87dec1f4bfbaebe286c91a33be5584f660747b87e969dc.file deleted file mode 100644 index 94bf430..0000000 --- a/.flatpak-builder/cache/objects/52/fe2c435502384dea87dec1f4bfbaebe286c91a33be5584f660747b87e969dc.file +++ /dev/null @@ -1,371 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PPM support for PIL -# -# History: -# 96-03-24 fl Created -# 98-03-06 fl Write RGBA images (as RGB, that is) -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import math -from typing import IO - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d" - -MODES = { - # standard - b"P1": "1", - b"P2": "L", - b"P3": "RGB", - b"P4": "1", - b"P5": "L", - b"P6": "RGB", - # extensions - b"P0CMYK": "CMYK", - b"Pf": "F", - # PIL extensions (for test purposes only) - b"PyP": "P", - b"PyRGBA": "RGBA", - b"PyCMYK": "CMYK", -} - - -def _accept(prefix: bytes) -> bool: - return prefix[0:1] == b"P" and prefix[1] in b"0123456fy" - - -## -# Image plugin for PBM, PGM, and PPM images. - - -class PpmImageFile(ImageFile.ImageFile): - format = "PPM" - format_description = "Pbmplus image" - - def _read_magic(self) -> bytes: - assert self.fp is not None - - magic = b"" - # read until whitespace or longest available magic number - for _ in range(6): - c = self.fp.read(1) - if not c or c in b_whitespace: - break - magic += c - return magic - - def _read_token(self) -> bytes: - assert self.fp is not None - - token = b"" - while len(token) <= 10: # read until next whitespace or limit of 10 characters - c = self.fp.read(1) - if not c: - break - elif c in b_whitespace: # token ended - if not token: - # skip whitespace at start - continue - break - elif c == b"#": - # ignores rest of the line; stops at CR, LF or EOF - while self.fp.read(1) not in b"\r\n": - pass - continue - token += c - if not token: - # Token was not even 1 byte - msg = "Reached EOF while reading header" - raise ValueError(msg) - elif len(token) > 10: - msg = f"Token too long in file header: {token.decode()}" - raise ValueError(msg) - return token - - def _open(self) -> None: - assert self.fp is not None - - magic_number = self._read_magic() - try: - mode = MODES[magic_number] - except KeyError: - msg = "not a PPM file" - raise SyntaxError(msg) - self._mode = mode - - if magic_number in (b"P1", b"P4"): - self.custom_mimetype = "image/x-portable-bitmap" - elif magic_number in (b"P2", b"P5"): - self.custom_mimetype = "image/x-portable-graymap" - elif magic_number in (b"P3", b"P6"): - self.custom_mimetype = "image/x-portable-pixmap" - - self._size = int(self._read_token()), int(self._read_token()) - - decoder_name = "raw" - if magic_number in (b"P1", b"P2", b"P3"): - decoder_name = "ppm_plain" - - args: str | tuple[str | int, ...] - if mode == "1": - args = "1;I" - elif mode == "F": - scale = float(self._read_token()) - if scale == 0.0 or not math.isfinite(scale): - msg = "scale must be finite and non-zero" - raise ValueError(msg) - self.info["scale"] = abs(scale) - - rawmode = "F;32F" if scale < 0 else "F;32BF" - args = (rawmode, 0, -1) - else: - maxval = int(self._read_token()) - if not 0 < maxval < 65536: - msg = "maxval must be greater than 0 and less than 65536" - raise ValueError(msg) - if maxval > 255 and mode == "L": - self._mode = "I" - - rawmode = mode - if decoder_name != "ppm_plain": - # If maxval matches a bit depth, use the raw decoder directly - if maxval == 65535 and mode == "L": - rawmode = "I;16B" - elif maxval != 255: - decoder_name = "ppm" - - args = rawmode if decoder_name == "raw" else (rawmode, maxval) - self.tile = [(decoder_name, (0, 0) + self.size, self.fp.tell(), args)] - - -# -# -------------------------------------------------------------------- - - -class PpmPlainDecoder(ImageFile.PyDecoder): - _pulls_fd = True - _comment_spans: bool - - def _read_block(self) -> bytes: - assert self.fd is not None - - return self.fd.read(ImageFile.SAFEBLOCK) - - def _find_comment_end(self, block: bytes, start: int = 0) -> int: - a = block.find(b"\n", start) - b = block.find(b"\r", start) - return min(a, b) if a * b > 0 else max(a, b) # lowest nonnegative index (or -1) - - def _ignore_comments(self, block: bytes) -> bytes: - if self._comment_spans: - # Finish current comment - while block: - comment_end = self._find_comment_end(block) - if comment_end != -1: - # Comment ends in this block - # Delete tail of comment - block = block[comment_end + 1 :] - break - else: - # Comment spans whole block - # So read the next block, looking for the end - block = self._read_block() - - # Search for any further comments - self._comment_spans = False - while True: - comment_start = block.find(b"#") - if comment_start == -1: - # No comment found - break - comment_end = self._find_comment_end(block, comment_start) - if comment_end != -1: - # Comment ends in this block - # Delete comment - block = block[:comment_start] + block[comment_end + 1 :] - else: - # Comment continues to next block(s) - block = block[:comment_start] - self._comment_spans = True - break - return block - - def _decode_bitonal(self) -> bytearray: - """ - This is a separate method because in the plain PBM format, all data tokens are - exactly one byte, so the inter-token whitespace is optional. - """ - data = bytearray() - total_bytes = self.state.xsize * self.state.ysize - - while len(data) != total_bytes: - block = self._read_block() # read next block - if not block: - # eof - break - - block = self._ignore_comments(block) - - tokens = b"".join(block.split()) - for token in tokens: - if token not in (48, 49): - msg = b"Invalid token for this mode: %s" % bytes([token]) - raise ValueError(msg) - data = (data + tokens)[:total_bytes] - invert = bytes.maketrans(b"01", b"\xFF\x00") - return data.translate(invert) - - def _decode_blocks(self, maxval: int) -> bytearray: - data = bytearray() - max_len = 10 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - total_bytes = self.state.xsize * self.state.ysize * bands * out_byte_count - - half_token = b"" - while len(data) != total_bytes: - block = self._read_block() # read next block - if not block: - if half_token: - block = bytearray(b" ") # flush half_token - else: - # eof - break - - block = self._ignore_comments(block) - - if half_token: - block = half_token + block # stitch half_token to new block - half_token = b"" - - tokens = block.split() - - if block and not block[-1:].isspace(): # block might split token - half_token = tokens.pop() # save half token for later - if len(half_token) > max_len: # prevent buildup of half_token - msg = ( - b"Token too long found in data: %s" % half_token[: max_len + 1] - ) - raise ValueError(msg) - - for token in tokens: - if len(token) > max_len: - msg = b"Token too long found in data: %s" % token[: max_len + 1] - raise ValueError(msg) - value = int(token) - if value < 0: - msg_str = f"Channel value is negative: {value}" - raise ValueError(msg_str) - if value > maxval: - msg_str = f"Channel value too large for this mode: {value}" - raise ValueError(msg_str) - value = round(value / maxval * out_max) - data += o32(value) if self.mode == "I" else o8(value) - if len(data) == total_bytes: # finished! - break - return data - - def decode(self, buffer: bytes) -> tuple[int, int]: - self._comment_spans = False - if self.mode == "1": - data = self._decode_bitonal() - rawmode = "1;8" - else: - maxval = self.args[-1] - data = self._decode_blocks(maxval) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), rawmode) - return -1, 0 - - -class PpmDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes) -> tuple[int, int]: - assert self.fd is not None - - data = bytearray() - maxval = self.args[-1] - in_byte_count = 1 if maxval < 256 else 2 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - dest_length = self.state.xsize * self.state.ysize * bands * out_byte_count - while len(data) < dest_length: - pixels = self.fd.read(in_byte_count * bands) - if len(pixels) < in_byte_count * bands: - # eof - break - for b in range(bands): - value = ( - pixels[b] if in_byte_count == 1 else i16(pixels, b * in_byte_count) - ) - value = min(out_max, round(value / maxval * out_max)) - data += o32(value) if self.mode == "I" else o8(value) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), rawmode) - return -1, 0 - - -# -# -------------------------------------------------------------------- - - -def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None: - if im.mode == "1": - rawmode, head = "1;I", b"P4" - elif im.mode == "L": - rawmode, head = "L", b"P5" - elif im.mode == "I": - rawmode, head = "I;16B", b"P5" - elif im.mode in ("RGB", "RGBA"): - rawmode, head = "RGB", b"P6" - elif im.mode == "F": - rawmode, head = "F;32F", b"Pf" - else: - msg = f"cannot write mode {im.mode} as PPM" - raise OSError(msg) - fp.write(head + b"\n%d %d\n" % im.size) - if head == b"P6": - fp.write(b"255\n") - elif head == b"P5": - if rawmode == "L": - fp.write(b"255\n") - else: - fp.write(b"65535\n") - elif head == b"Pf": - fp.write(b"-1.0\n") - row_order = -1 if im.mode == "F" else 1 - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, row_order))]) - - -# -# -------------------------------------------------------------------- - - -Image.register_open(PpmImageFile.format, PpmImageFile, _accept) -Image.register_save(PpmImageFile.format, _save) - -Image.register_decoder("ppm", PpmDecoder) -Image.register_decoder("ppm_plain", PpmPlainDecoder) - -Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm", ".pfm"]) - -Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/.flatpak-builder/cache/objects/53/ac9175206854ede398b79a2be25353fba977f6db595dc1fe938c2149743e24.file b/.flatpak-builder/cache/objects/53/ac9175206854ede398b79a2be25353fba977f6db595dc1fe938c2149743e24.file deleted file mode 100644 index 237ff184362b0ab59353a537828f1b2c465fa783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2684 zcmcIm&1)M+6rbIdRv)(INU|MACGntq*otGxPMV7-4Q-r4pmoz0r_?5hjb?0bydUc9 z%Em$lQ*uyC4xtcYNDVoqDe1pZC^_{g7ahdXfT8r@n~Hn#q4dq}S|4tpy<{|cyEE@& z-ut~bGyDC(KvY5qJ$QN0_ z;e(9m$V!n5IC4oVGevWvgq9dBDmEpKWZBFKtglexFsd3huHre$PW#P1(ueUqZo_RP_zYxTwB?9=>WGDUIjgP=J6T0f5D8U-K*KwM&5+F< z_FFa7tMipm6-Z>&U5!a33SM1+nZEW+Kg^sa162X6#cUpx-(Wnr69nshM>7b$#=6Lo zRf)yPiT@!PBJrvSb`v|&revG}y%YiMryTWvwd1&eUeMKpTG^EB!H&Ycw%1+A3|HkR zs46`{JF=bV$dZvCPd!i*n;EXoN-tm`(DRIA{G{C(j_y0vU^S)N4R4zJ{t zQYojYcXOo;d&M-aWM^h_mTJ?f5=5XZQ!97t=7+gLd&6Z*8&0G>Vi_>T4O+M1j@m-4 z_XRYRsz=Y(&ezUw+gsQ7LVa7+X5w5eR0}mD1CNrA78}DCo?5%Zla1lY=kGO!v%B$J zBcA&;lB-8@&G=jO*bV60Mehl;CcTQKwy*5Q#u~A)dUy=XJWPC(s->EVi@w>O@m_59 z`MG**7Wz-4-V-RdGP<4o+I(Qv!>9K`i53!rXCAJ(k7g|Y8h$W1)QnGWPuAnpUa!eD zxfvO3A&GM)A1*!Cztx{!-yNA~j7-$yAjmtH+KVS^@*jcz`yVy?hU?)^pl?gw^XCve ze;M%xufnNja;Oyw1m!;wkiR%-^^yaC7m8{w)9xBvhE diff --git a/.flatpak-builder/cache/objects/54/24357ad5bc66fe61990ad5b56899ee7bd4eb144da7988931c3e92befc1c620.file b/.flatpak-builder/cache/objects/54/24357ad5bc66fe61990ad5b56899ee7bd4eb144da7988931c3e92befc1c620.file deleted file mode 100644 index fe0e348..0000000 --- a/.flatpak-builder/cache/objects/54/24357ad5bc66fe61990ad5b56899ee7bd4eb144da7988931c3e92befc1c620.file +++ /dev/null @@ -1,256 +0,0 @@ -from __future__ import annotations - -import io -import typing -from base64 import b64encode -from enum import Enum - -from ..exceptions import UnrewindableBodyError -from .util import to_bytes - -if typing.TYPE_CHECKING: - from typing import Final - -# Pass as a value within ``headers`` to skip -# emitting some HTTP headers that are added automatically. -# The only headers that are supported are ``Accept-Encoding``, -# ``Host``, and ``User-Agent``. -SKIP_HEADER = "@@@SKIP_HEADER@@@" -SKIPPABLE_HEADERS = frozenset(["accept-encoding", "host", "user-agent"]) - -ACCEPT_ENCODING = "gzip,deflate" -try: - try: - import brotlicffi as _unused_module_brotli # type: ignore[import-not-found] # noqa: F401 - except ImportError: - import brotli as _unused_module_brotli # type: ignore[import-not-found] # noqa: F401 -except ImportError: - pass -else: - ACCEPT_ENCODING += ",br" -try: - import zstandard as _unused_module_zstd # type: ignore[import-not-found] # noqa: F401 -except ImportError: - pass -else: - ACCEPT_ENCODING += ",zstd" - - -class _TYPE_FAILEDTELL(Enum): - token = 0 - - -_FAILEDTELL: Final[_TYPE_FAILEDTELL] = _TYPE_FAILEDTELL.token - -_TYPE_BODY_POSITION = typing.Union[int, _TYPE_FAILEDTELL] - -# When sending a request with these methods we aren't expecting -# a body so don't need to set an explicit 'Content-Length: 0' -# The reason we do this in the negative instead of tracking methods -# which 'should' have a body is because unknown methods should be -# treated as if they were 'POST' which *does* expect a body. -_METHODS_NOT_EXPECTING_BODY = {"GET", "HEAD", "DELETE", "TRACE", "OPTIONS", "CONNECT"} - - -def make_headers( - keep_alive: bool | None = None, - accept_encoding: bool | list[str] | str | None = None, - user_agent: str | None = None, - basic_auth: str | None = None, - proxy_basic_auth: str | None = None, - disable_cache: bool | None = None, -) -> dict[str, str]: - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. If either the ``brotli`` or - ``brotlicffi`` package is installed 'gzip,deflate,br' is used instead. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - :param proxy_basic_auth: - Colon-separated username:password string for 'proxy-authorization: basic ...' - auth header. - - :param disable_cache: - If ``True``, adds 'cache-control: no-cache' header. - - Example: - - .. code-block:: python - - import urllib3 - - print(urllib3.util.make_headers(keep_alive=True, user_agent="Batman/1.0")) - # {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - print(urllib3.util.make_headers(accept_encoding=True)) - # {'accept-encoding': 'gzip,deflate'} - """ - headers: dict[str, str] = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ",".join(accept_encoding) - else: - accept_encoding = ACCEPT_ENCODING - headers["accept-encoding"] = accept_encoding - - if user_agent: - headers["user-agent"] = user_agent - - if keep_alive: - headers["connection"] = "keep-alive" - - if basic_auth: - headers[ - "authorization" - ] = f"Basic {b64encode(basic_auth.encode('latin-1')).decode()}" - - if proxy_basic_auth: - headers[ - "proxy-authorization" - ] = f"Basic {b64encode(proxy_basic_auth.encode('latin-1')).decode()}" - - if disable_cache: - headers["cache-control"] = "no-cache" - - return headers - - -def set_file_position( - body: typing.Any, pos: _TYPE_BODY_POSITION | None -) -> _TYPE_BODY_POSITION | None: - """ - If a position is provided, move file to that point. - Otherwise, we'll attempt to record a position for future use. - """ - if pos is not None: - rewind_body(body, pos) - elif getattr(body, "tell", None) is not None: - try: - pos = body.tell() - except OSError: - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body. - pos = _FAILEDTELL - - return pos - - -def rewind_body(body: typing.IO[typing.AnyStr], body_pos: _TYPE_BODY_POSITION) -> None: - """ - Attempt to rewind body to a certain position. - Primarily used for request redirects and retries. - - :param body: - File-like object that supports seek. - - :param int pos: - Position to seek to in file. - """ - body_seek = getattr(body, "seek", None) - if body_seek is not None and isinstance(body_pos, int): - try: - body_seek(body_pos) - except OSError as e: - raise UnrewindableBodyError( - "An error occurred when rewinding request body for redirect/retry." - ) from e - elif body_pos is _FAILEDTELL: - raise UnrewindableBodyError( - "Unable to record file position for rewinding " - "request body during a redirect/retry." - ) - else: - raise ValueError( - f"body_pos must be of type integer, instead it was {type(body_pos)}." - ) - - -class ChunksAndContentLength(typing.NamedTuple): - chunks: typing.Iterable[bytes] | None - content_length: int | None - - -def body_to_chunks( - body: typing.Any | None, method: str, blocksize: int -) -> ChunksAndContentLength: - """Takes the HTTP request method, body, and blocksize and - transforms them into an iterable of chunks to pass to - socket.sendall() and an optional 'Content-Length' header. - - A 'Content-Length' of 'None' indicates the length of the body - can't be determined so should use 'Transfer-Encoding: chunked' - for framing instead. - """ - - chunks: typing.Iterable[bytes] | None - content_length: int | None - - # No body, we need to make a recommendation on 'Content-Length' - # based on whether that request method is expected to have - # a body or not. - if body is None: - chunks = None - if method.upper() not in _METHODS_NOT_EXPECTING_BODY: - content_length = 0 - else: - content_length = None - - # Bytes or strings become bytes - elif isinstance(body, (str, bytes)): - chunks = (to_bytes(body),) - content_length = len(chunks[0]) - - # File-like object, TODO: use seek() and tell() for length? - elif hasattr(body, "read"): - - def chunk_readable() -> typing.Iterable[bytes]: - nonlocal body, blocksize - encode = isinstance(body, io.TextIOBase) - while True: - datablock = body.read(blocksize) - if not datablock: - break - if encode: - datablock = datablock.encode("iso-8859-1") - yield datablock - - chunks = chunk_readable() - content_length = None - - # Otherwise we need to start checking via duck-typing. - else: - try: - # Check if the body implements the buffer API. - mv = memoryview(body) - except TypeError: - try: - # Check if the body is an iterable - chunks = iter(body) - content_length = None - except TypeError: - raise TypeError( - f"'body' must be a bytes-like object, file-like " - f"object, or iterable. Instead was {body!r}" - ) from None - else: - # Since it implements the buffer API can be passed directly to socket.sendall() - chunks = (body,) - content_length = mv.nbytes - - return ChunksAndContentLength(chunks=chunks, content_length=content_length) diff --git a/.flatpak-builder/cache/objects/54/2b14975bb28ba3a0b02b1145c19f9a4ee911e95e586e3b6897687530139e5f.file b/.flatpak-builder/cache/objects/54/2b14975bb28ba3a0b02b1145c19f9a4ee911e95e586e3b6897687530139e5f.file deleted file mode 120000 index f35003d..0000000 --- a/.flatpak-builder/cache/objects/54/2b14975bb28ba3a0b02b1145c19f9a4ee911e95e586e3b6897687530139e5f.file +++ /dev/null @@ -1 +0,0 @@ -/run \ No newline at end of file diff --git a/.flatpak-builder/cache/objects/55/0dee87a0ff2a24eda70c8ab51ccb9e775445cd0fc010553738b074268911b4.file b/.flatpak-builder/cache/objects/55/0dee87a0ff2a24eda70c8ab51ccb9e775445cd0fc010553738b074268911b4.file deleted file mode 100644 index 963eac5..0000000 --- a/.flatpak-builder/cache/objects/55/0dee87a0ff2a24eda70c8ab51ccb9e775445cd0fc010553738b074268911b4.file +++ /dev/null @@ -1 +0,0 @@ -certifi diff --git a/.flatpak-builder/cache/objects/55/ef3dce50e6ed1de64fefbac150b5444b3d5378bda02435849c7e684e1032c2.file b/.flatpak-builder/cache/objects/55/ef3dce50e6ed1de64fefbac150b5444b3d5378bda02435849c7e684e1032c2.file deleted file mode 100644 index 8b13789..0000000 --- a/.flatpak-builder/cache/objects/55/ef3dce50e6ed1de64fefbac150b5444b3d5378bda02435849c7e684e1032c2.file +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.flatpak-builder/cache/objects/56/3168ef95cd68c851c1214228c745148c9fe5bb1e0b6cf56973d5700202a612.file b/.flatpak-builder/cache/objects/56/3168ef95cd68c851c1214228c745148c9fe5bb1e0b6cf56973d5700202a612.file deleted file mode 100644 index f7344df..0000000 --- a/.flatpak-builder/cache/objects/56/3168ef95cd68c851c1214228c745148c9fe5bb1e0b6cf56973d5700202a612.file +++ /dev/null @@ -1,80 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# DCX file handling -# -# DCX is a container file format defined by Intel, commonly used -# for fax applications. Each DCX file consists of a directory -# (a list of file offsets) followed by a set of (usually 1-bit) -# PCX files. -# -# History: -# 1995-09-09 fl Created -# 1996-03-20 fl Properly derived from PcxImageFile. -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 2002-07-30 fl Fixed file handling -# -# Copyright (c) 1997-98 by Secret Labs AB. -# Copyright (c) 1995-96 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image -from ._binary import i32le as i32 -from .PcxImagePlugin import PcxImageFile - -MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? - - -def _accept(prefix): - return len(prefix) >= 4 and i32(prefix) == MAGIC - - -## -# Image plugin for the Intel DCX format. - - -class DcxImageFile(PcxImageFile): - format = "DCX" - format_description = "Intel DCX" - _close_exclusive_fp_after_loading = False - - def _open(self): - # Header - s = self.fp.read(4) - if not _accept(s): - msg = "not a DCX file" - raise SyntaxError(msg) - - # Component directory - self._offset = [] - for i in range(1024): - offset = i32(self.fp.read(4)) - if not offset: - break - self._offset.append(offset) - - self._fp = self.fp - self.frame = None - self.n_frames = len(self._offset) - self.is_animated = self.n_frames > 1 - self.seek(0) - - def seek(self, frame): - if not self._seek_check(frame): - return - self.frame = frame - self.fp = self._fp - self.fp.seek(self._offset[frame]) - PcxImageFile._open(self) - - def tell(self): - return self.frame - - -Image.register_open(DcxImageFile.format, DcxImageFile, _accept) - -Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/.flatpak-builder/cache/objects/56/97732b4e9358249b1445d1679c77706a8733e897522b79fa64cb488406d9d0.file b/.flatpak-builder/cache/objects/56/97732b4e9358249b1445d1679c77706a8733e897522b79fa64cb488406d9d0.file deleted file mode 100644 index 191c4ce87ffd50609c906bbf4ea80604af57a80c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 978 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 nq)!x*qGkSSaZDD*T diff --git a/.flatpak-builder/cache/objects/57/195f0d74d33c9f8d102de3a4288f4c9533e1308e9768cbf3b735dd24723a9b.dirtree b/.flatpak-builder/cache/objects/57/195f0d74d33c9f8d102de3a4288f4c9533e1308e9768cbf3b735dd24723a9b.dirtree deleted file mode 100644 index 460b9f31d6f17252995d367eeeb1b3dbaf19311f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmV-S0JHySX=86}Z*l;iVpjb@|J8GGw*I?sz4sTuS_|#M5u`G*la_`M)3{BVVw^N-DHRD~qg}aj^p)8a ziG&2Eq#y@F89cyN=|*VioWU`I@*1D^WJaX z{^re_nV+0aJC6{$IoaCWT)Fe>pP&z#si)zC-$2lRdIb{ zsH^sIG)4yc$Ph6^E4DojBE#Ejz`}kD1sxsM4Pxq$)9H*Z>xoQS>tJT%=)~nz_F76_ zQ*R`5Yl$>9865zd65$V$s-Y|{B-I$h_Z#C5FFrU4$_^?T8Ty`^?)xE2_Y4;Bb$+!Y zfL&t(0r{U96LXfR@x()o1@*oDa9+-4=aY%M^Vz)qZ6>`K3Ww*lgs#4ym1FmSn>K&r z+RFTLj*Ku3W%JY$m18kAs}q*6S$H)shz-b(TnTJlsLlN0m}>}g2jD<4Ci?Bo zgzy0yxPw#_!3v6S3Xbp!7ZDU57SN;!Fa;A8``^BjNUD@y{_197;_F0O$vn_};LD zuZp+;?(vymw#xSYs8Q}?_7T2{y#Om4=ZYvg$U0!fx5c;(^Dmi8mXft(E1DI@XiUbX zXf4{}!uaTmU{?^7uejP_1zDJY&F_=Cf+gY>D1Y=qWi1j>QEkXo-SKO;O`d(1Bsl4n{Q@r{+vNuBkf38s$^k8pSD! z6BH{Hs}yG_mNhmF-=Gmzx)3UpRnrCc=-v$(wlmDH5;#0A9v+44+Ts|;Odb)^rPPIMW3a;R` zGY0OT_7N9j;%~cyjLA%Gc{@}MHAElq zusNTIkHu%VYEtd;cBC4qpKf~3G_ApwHQ2BQ0WfvE`c3VA^>+Q-?nnDy>|T5kZk{^V z@SZCRTlThhy64=qmvK2G=&{;qhHV}{yDz_x8b=oZX{-1*#WMVi5?T$KsWlo+ z%PBP)rS@nvl~Hm@ri;<&{hXY9<1xoGBqi(A-TRL!sum-OEW3?J2o{8}UC=8^wtPhD zi#bpAmU5s5kr{@T;BXB??iU_;w z3ELlVo7_#LWs)cCASEZ5V21m3XUJ1i=fT9cu_nB(uE_j8P}XT#J&la-a0=e_;e7Y~|fsfCsrXz3L?#yrPrv#sf~ Q`|&0^-$Lgb{m01vzkj|ISpWb4 diff --git a/.flatpak-builder/cache/objects/59/d8cd0c2796700c2bc1c0251edecd853ac5be1ee2a0dae6d8a95df6f2fc14d8.file b/.flatpak-builder/cache/objects/59/d8cd0c2796700c2bc1c0251edecd853ac5be1ee2a0dae6d8a95df6f2fc14d8.file deleted file mode 100644 index 036521b..0000000 --- a/.flatpak-builder/cache/objects/59/d8cd0c2796700c2bc1c0251edecd853ac5be1ee2a0dae6d8a95df6f2fc14d8.file +++ /dev/null @@ -1,145 +0,0 @@ -import datetime -import sys -from typing import Literal, SupportsFloat, TypedDict - -littlecms_version: str - -_Tuple3f = tuple[float, float, float] -_Tuple2x3f = tuple[_Tuple3f, _Tuple3f] -_Tuple3x3f = tuple[_Tuple3f, _Tuple3f, _Tuple3f] - -class _IccMeasurementCondition(TypedDict): - observer: int - backing: _Tuple3f - geo: str - flare: float - illuminant_type: str - -class _IccViewingCondition(TypedDict): - illuminant: _Tuple3f - surround: _Tuple3f - illuminant_type: str - -class CmsProfile: - @property - def rendering_intent(self) -> int: ... - @property - def creation_date(self) -> datetime.datetime | None: ... - @property - def copyright(self) -> str | None: ... - @property - def target(self) -> str | None: ... - @property - def manufacturer(self) -> str | None: ... - @property - def model(self) -> str | None: ... - @property - def profile_description(self) -> str | None: ... - @property - def screening_description(self) -> str | None: ... - @property - def viewing_condition(self) -> str | None: ... - @property - def version(self) -> float: ... - @property - def icc_version(self) -> int: ... - @property - def attributes(self) -> int: ... - @property - def header_flags(self) -> int: ... - @property - def header_manufacturer(self) -> str: ... - @property - def header_model(self) -> str: ... - @property - def device_class(self) -> str: ... - @property - def connection_space(self) -> str: ... - @property - def xcolor_space(self) -> str: ... - @property - def profile_id(self) -> bytes: ... - @property - def is_matrix_shaper(self) -> bool: ... - @property - def technology(self) -> str | None: ... - @property - def colorimetric_intent(self) -> str | None: ... - @property - def perceptual_rendering_intent_gamut(self) -> str | None: ... - @property - def saturation_rendering_intent_gamut(self) -> str | None: ... - @property - def red_colorant(self) -> _Tuple2x3f | None: ... - @property - def green_colorant(self) -> _Tuple2x3f | None: ... - @property - def blue_colorant(self) -> _Tuple2x3f | None: ... - @property - def red_primary(self) -> _Tuple2x3f | None: ... - @property - def green_primary(self) -> _Tuple2x3f | None: ... - @property - def blue_primary(self) -> _Tuple2x3f | None: ... - @property - def media_white_point_temperature(self) -> float | None: ... - @property - def media_white_point(self) -> _Tuple2x3f | None: ... - @property - def media_black_point(self) -> _Tuple2x3f | None: ... - @property - def luminance(self) -> _Tuple2x3f | None: ... - @property - def chromatic_adaptation(self) -> tuple[_Tuple3x3f, _Tuple3x3f] | None: ... - @property - def chromaticity(self) -> _Tuple3x3f | None: ... - @property - def colorant_table(self) -> list[str] | None: ... - @property - def colorant_table_out(self) -> list[str] | None: ... - @property - def intent_supported(self) -> dict[int, tuple[bool, bool, bool]] | None: ... - @property - def clut(self) -> dict[int, tuple[bool, bool, bool]] | None: ... - @property - def icc_measurement_condition(self) -> _IccMeasurementCondition | None: ... - @property - def icc_viewing_condition(self) -> _IccViewingCondition | None: ... - def is_intent_supported(self, intent: int, direction: int, /) -> int: ... - -class CmsTransform: - @property - def inputMode(self) -> str: ... - @property - def outputMode(self) -> str: ... - def apply(self, id_in: int, id_out: int) -> int: ... - -def profile_open(profile: str, /) -> CmsProfile: ... -def profile_frombytes(profile: bytes, /) -> CmsProfile: ... -def profile_tobytes(profile: CmsProfile, /) -> bytes: ... -def buildTransform( - input_profile: CmsProfile, - output_profile: CmsProfile, - in_mode: str, - out_mode: str, - rendering_intent: int = 0, - cms_flags: int = 0, - /, -) -> CmsTransform: ... -def buildProofTransform( - input_profile: CmsProfile, - output_profile: CmsProfile, - proof_profile: CmsProfile, - in_mode: str, - out_mode: str, - rendering_intent: int = 0, - proof_intent: int = 0, - cms_flags: int = 0, - /, -) -> CmsTransform: ... -def createProfile( - color_space: Literal["LAB", "XYZ", "sRGB"], color_temp: SupportsFloat = 0.0, / -) -> CmsProfile: ... - -if sys.platform == "win32": - def get_display_profile_win32(handle: int = 0, is_dc: int = 0, /) -> str | None: ... diff --git a/.flatpak-builder/cache/objects/59/e22deb09db7f00b9d456de6b58c7084bcf3fc15e5f4a6776d18424ae0d69a4.file b/.flatpak-builder/cache/objects/59/e22deb09db7f00b9d456de6b58c7084bcf3fc15e5f4a6776d18424ae0d69a4.file deleted file mode 100644 index bacf7aa1a6e2dcf93d20b38da672a8d475ed0ec2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7125 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 diff --git a/.flatpak-builder/cache/objects/5a/83a528e6d04061ab7c7dca6e8ea0133342bddcecf5ded42b5d51885b4b114e.file b/.flatpak-builder/cache/objects/5a/83a528e6d04061ab7c7dca6e8ea0133342bddcecf5ded42b5d51885b4b114e.file deleted file mode 100644 index f45edfa4288789964ea94c9f6dca004b8d25e1c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3608 zcmai0-A^0Y6~E&df7=)g7-O7e_*hc!QYazOE@8V7$p!>sX#$&cqDH?7#%X^+FA%m0+y+;b{0z4ImTs#xzeR@x zcEeho3ziMrtFd5iL^DW3+g~AGp|S0m4kW|B+&~Ze3i3IMbn0VNYcLjzOF=0dkBLQw z(pXhL9}TVxs#$x@h9iP%(}uT#5kZm!Sfvk7URo7YLxKpQ@MBfKx+4jqY9NBNMPe$q z8jnZTsIY3IhQXhCxdel!NUGzd&@-5QTccp+q2}bcQ>wWGq1RBlhnh)X3cFOKUJUA6ewqlbJp^;b z@muqY<11USvZ;}+^>Az~v7;IT!L>CZArU9YaZ`aq(Cwj9Yg_u!m(vH+^1z9;Pq9w@ zkq_y zskW*vS_IgYJ4;Cikoe`GC<%n8R6-L(<(A?xp~2k-AZzZP1WYkq+E-?g|6=Pdng%?midIri@AOEM$R|n zj41fNmYX2UQj=_}c<%!4sgF;}l&w|gDwe*n4fixk-Zg=|TJ^^6-Woi`B_W@2FSQJN zl8{5Vk5YEc5N+=xMBMlSexrUhMW)!4DP<1nLfksdm|E4xXa&K#zKXss+~0a_t96(^ zF9N=Sr6LczCtYw|@WB`l^@u0sQWT=4s12A!8jvEjwb(^FS}u!T=m^aVD9+48lAV~I zr=!IryEuKB@DxJxfR^s%x$9(58*49>y*{_>)0M{@Fh8zMfbntCb0;QlB@%HW37G#d zj)n2-VTu0$iuHpqf*q55J>W(>5+{7+4&xVv*t+x}>8?jqc^~a0grpw!n_g6zTZESF zB2BwuJMHMyr`M>OS!4hRW%FruQdtt*20bZE>r|t-6$_Av(5OybDX0G9CD_#0rs_fo zl_NqBYxj+6UD=6A!N)fVi4#J%SM>ogoD|>{1%nB#xa4h0Hzvxrv&vD1Y9vA;5?m8h zPJ?q2?BTP(Oo)V3MpW6TxUL%Fp^zv@svc9Hsb;E3fGVQeD$>fcw(1P-R`41K4{mF_ z7(|JLu^`gp!q*zg949E0VjWI*ma{>H3y`_kNja6=}!s{w>-1|S^BfW$faESP=-6S$aC`CS;MRqda?oCFmsN*<_K$V z3E9n;3yup}?!+;yIED+ZcQfp%Yalz6bB*L(BTD?mr*PUAdjVay!?zobOu(6Bi4P&VwEK#)+d}ar751 z@YJk=XW$RxzZ*XqIudi9$-HMWV}z)7xeur0+lTLE-^_JhJQ~b(jvhO6&dKA=T*td< zL+K~T)-5{}>qU49p8l-sX!tu{Zea5G?)U4@A1OayQhI-(xNpIp^J(}M>@Im=|I_rR z188SI$HQNo zf^M(&gCOtC7JA=OI9G}L6{8<2q5s#HrBYc*ZVU?Ul8@8AYY9DbWh-dGh0+1KhqmAY z9CRnNqN<3{f<)+7iB>4!TXr=Z3z8i|>$Fx*v?`-%s@jRL9;Tm`+8HG`sRU<@COnpe zm`IJCqid-bHB)~uy;pYF`{YBQ(QirdU(l6UhG9y>h#6AQVEuE3MwK6b3TQxSd`bp} zxmrSvT{~tN@LTIXGnMZg`H#l@Z$0ELi ( - tuple[ - str, - int, - tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]], - Image.Image, - ] - | None -): - # skip to STARTCHAR - while True: - s = f.readline() - if not s: - return None - if s[:9] == b"STARTCHAR": - break - id = s[9:].strip().decode("ascii") - - # load symbol properties - props = {} - while True: - s = f.readline() - if not s or s[:6] == b"BITMAP": - break - i = s.find(b" ") - props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") - - # load bitmap - bitmap = bytearray() - while True: - s = f.readline() - if not s or s[:7] == b"ENDCHAR": - break - bitmap += s[:-1] - - # The word BBX - # followed by the width in x (BBw), height in y (BBh), - # and x and y displacement (BBxoff0, BByoff0) - # of the lower left corner from the origin of the character. - width, height, x_disp, y_disp = (int(p) for p in props["BBX"].split()) - - # The word DWIDTH - # followed by the width in x and y of the character in device pixels. - dwx, dwy = (int(p) for p in props["DWIDTH"].split()) - - bbox = ( - (dwx, dwy), - (x_disp, -y_disp - height, width + x_disp, -y_disp), - (0, 0, width, height), - ) - - try: - im = Image.frombytes("1", (width, height), bitmap, "hex", "1") - except ValueError: - # deal with zero-width characters - im = Image.new("1", (width, height)) - - return id, int(props["ENCODING"]), bbox, im - - -class BdfFontFile(FontFile.FontFile): - """Font file plugin for the X11 BDF format.""" - - def __init__(self, fp: BinaryIO): - super().__init__() - - s = fp.readline() - if s[:13] != b"STARTFONT 2.1": - msg = "not a valid BDF file" - raise SyntaxError(msg) - - props = {} - comments = [] - - while True: - s = fp.readline() - if not s or s[:13] == b"ENDPROPERTIES": - break - i = s.find(b" ") - props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") - if s[:i] in [b"COMMENT", b"COPYRIGHT"]: - if s.find(b"LogicalFontDescription") < 0: - comments.append(s[i + 1 : -1].decode("ascii")) - - while True: - c = bdf_char(fp) - if not c: - break - id, ch, (xy, dst, src), im = c - if 0 <= ch < len(self.glyph): - self.glyph[ch] = xy, dst, src, im diff --git a/.flatpak-builder/cache/objects/5b/75211ac0565bc53bd07ea4fceab3461093734a1fa5312da431fbe9f96ad537.file b/.flatpak-builder/cache/objects/5b/75211ac0565bc53bd07ea4fceab3461093734a1fa5312da431fbe9f96ad537.file deleted file mode 100644 index c84adac..0000000 --- a/.flatpak-builder/cache/objects/5b/75211ac0565bc53bd07ea4fceab3461093734a1fa5312da431fbe9f96ad537.file +++ /dev/null @@ -1,81 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XV Thumbnail file handler by Charles E. "Gene" Cash -# (gcash@magicnet.net) -# -# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, -# available from ftp://ftp.cis.upenn.edu/pub/xv/ -# -# history: -# 98-08-15 cec created (b/w only) -# 98-12-09 cec added color palette -# 98-12-28 fl added to PIL (with only a few very minor modifications) -# -# To do: -# FIXME: make save work (this requires quantization support) -# -from __future__ import annotations - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -_MAGIC = b"P7 332" - -# standard color palette for thumbnails (RGB332) -PALETTE = b"" -for r in range(8): - for g in range(8): - for b in range(4): - PALETTE = PALETTE + ( - o8((r * 255) // 7) + o8((g * 255) // 7) + o8((b * 255) // 3) - ) - - -def _accept(prefix: bytes) -> bool: - return prefix[:6] == _MAGIC - - -## -# Image plugin for XV thumbnail images. - - -class XVThumbImageFile(ImageFile.ImageFile): - format = "XVThumb" - format_description = "XV thumbnail image" - - def _open(self) -> None: - # check magic - assert self.fp is not None - - if not _accept(self.fp.read(6)): - msg = "not an XV thumbnail file" - raise SyntaxError(msg) - - # Skip to beginning of next line - self.fp.readline() - - # skip info comments - while True: - s = self.fp.readline() - if not s: - msg = "Unexpected EOF reading XV thumbnail file" - raise SyntaxError(msg) - if s[0] != 35: # ie. when not a comment: '#' - break - - # parse header line (already read) - s = s.strip().split() - - self._mode = "P" - self._size = int(s[0]), int(s[1]) - - self.palette = ImagePalette.raw("RGB", PALETTE) - - self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1))] - - -# -------------------------------------------------------------------- - -Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/.flatpak-builder/cache/objects/5c/9e3a4c685dda1575c5a8a62d091542024bac351156e0d5dcd58d999c6b3abd.file b/.flatpak-builder/cache/objects/5c/9e3a4c685dda1575c5a8a62d091542024bac351156e0d5dcd58d999c6b3abd.file deleted file mode 100644 index e692e69..0000000 --- a/.flatpak-builder/cache/objects/5c/9e3a4c685dda1575c5a8a62d091542024bac351156e0d5dcd58d999c6b3abd.file +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass, field - -from ..._base_connection import _TYPE_BODY - - -@dataclass -class EmscriptenRequest: - method: str - url: str - params: dict[str, str] | None = None - body: _TYPE_BODY | None = None - headers: dict[str, str] = field(default_factory=dict) - timeout: float = 0 - decode_content: bool = True - - def set_header(self, name: str, value: str) -> None: - self.headers[name.capitalize()] = value - - def set_body(self, body: _TYPE_BODY | None) -> None: - self.body = body diff --git a/.flatpak-builder/cache/objects/5c/c1cb0c455e0f8cc88774d0d328a868465577fb5f04194166ac5319f2adb7a7.dirtree b/.flatpak-builder/cache/objects/5c/c1cb0c455e0f8cc88774d0d328a868465577fb5f04194166ac5319f2adb7a7.dirtree deleted file mode 100644 index 560582502614414f2ee060379506fd5e7ea9def4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79 zcmV-V0I>gXd30!RZZj@1F#z11J_Fylt`+Gh`D)5nJYres#QbsKK#~i|tV>S<9_&PF l4)Gg&!DsWf1LcLs?(VjA`lJ%o>~r=hi0cb%RER4JO#tF+CX)aF diff --git a/.flatpak-builder/cache/objects/5c/f304a4889a2379cccfe7ce3bb5e497f0479f22e8ac1567fd8ba68c0399aa7c.file b/.flatpak-builder/cache/objects/5c/f304a4889a2379cccfe7ce3bb5e497f0479f22e8ac1567fd8ba68c0399aa7c.file deleted file mode 100644 index 9ebdaf19da2c0a308bbfccfc7b653c2d3d64205b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8748 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 diff --git a/.flatpak-builder/cache/objects/5d/b40d45ce01e078919a6ec0ea5c264df2e0d4a2fd8fc1634c77367e8d4a75b4.file b/.flatpak-builder/cache/objects/5d/b40d45ce01e078919a6ec0ea5c264df2e0d4a2fd8fc1634c77367e8d4a75b4.file deleted file mode 100644 index 77c45c9..0000000 --- a/.flatpak-builder/cache/objects/5d/b40d45ce01e078919a6ec0ea5c264df2e0d4a2fd8fc1634c77367e8d4a75b4.file +++ /dev/null @@ -1,28 +0,0 @@ -import sys - -try: - import chardet -except ImportError: - import warnings - - import charset_normalizer as chardet - - warnings.filterwarnings("ignore", "Trying to detect", module="charset_normalizer") - -# This code exists for backwards compatibility reasons. -# I don't like it either. Just look the other way. :) - -for package in ("urllib3", "idna"): - locals()[package] = __import__(package) - # This traversal is apparently necessary such that the identities are - # preserved (requests.packages.urllib3.* is urllib3.*) - for mod in list(sys.modules): - if mod == package or mod.startswith(f"{package}."): - sys.modules[f"requests.packages.{mod}"] = sys.modules[mod] - -target = chardet.__name__ -for mod in list(sys.modules): - if mod == target or mod.startswith(f"{target}."): - target = target.replace(target, "chardet") - sys.modules[f"requests.packages.{target}"] = sys.modules[mod] -# Kinda cool, though, right? diff --git a/.flatpak-builder/cache/objects/5e/1f6471772c474bd4cc7e308ed2e9d8e2afbe4a1ab82c11b70d4b0732ac54d8.dirtree b/.flatpak-builder/cache/objects/5e/1f6471772c474bd4cc7e308ed2e9d8e2afbe4a1ab82c11b70d4b0732ac54d8.dirtree deleted file mode 100644 index 46c55c28c9604b7e71b74b85c749e215e6faca2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcma!#&&&q;jLL!@b|$7>uaT1);AJVv%*=# zauYN2Knh#l%t?CtnA3LF%)|V?H-4Sc8+kW2YI-maM|oymN`5&=sX}JQ r{;HR6wq8uvo$!5D->#*$F)|z7j?6q@=ypVEDd$oy-K3d^-hKiAro?R7 diff --git a/.flatpak-builder/cache/objects/5e/3879c82f02417e2aa122c549267dbbdb308234b41fb5d89a70a120c55cbac0.dirtree b/.flatpak-builder/cache/objects/5e/3879c82f02417e2aa122c549267dbbdb308234b41fb5d89a70a120c55cbac0.dirtree deleted file mode 100644 index 8908728ef2b273ccd619c2d708ef57c8a79e0465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmV+~0nq+mUukY>bYEXCaCrcCk4bt$qgn6MuK4vR&E43cKk6$-9Kc@szOuRRMO%E^v7O)GzH6b<6cUBJnPGpFl~7p4%XAyF+yhZ{3t@j5!$>3}azqWpZ>b zaAj=(a1hsm9|Y0atqsEJyq%3;3Xu6FmAqiT`Y0ykV?z5p3uA9`WiD`e0F)$+9&q*s zng9B1DL63D_izblRdO`P!p8O%EDe>Ma0qaDE_8WtWn=)%a1BQE2gb##EnVJ6LuRQc zw>g4$<`H7&`0NJsY4CmtEn0@J*XY;lL<%P%Y?zVOMq!QKabM`5S>kDjDh%5|F-T?ih BkkJ4D diff --git a/.flatpak-builder/cache/objects/5e/75f8325a3d5e74b9e9bc01dfabcd6816cf0c79b3305176e89634ece822f590.file b/.flatpak-builder/cache/objects/5e/75f8325a3d5e74b9e9bc01dfabcd6816cf0c79b3305176e89634ece822f590.file deleted file mode 100644 index 4e09847..0000000 --- a/.flatpak-builder/cache/objects/5e/75f8325a3d5e74b9e9bc01dfabcd6816cf0c79b3305176e89634ece822f590.file +++ /dev/null @@ -1,141 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Sun image file handling -# -# History: -# 1995-09-10 fl Created -# 1996-05-28 fl Fixed 32-bit alignment -# 1998-12-29 fl Import ImagePalette module -# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1995-1996 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile, ImagePalette -from ._binary import i32be as i32 - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 4 and i32(prefix) == 0x59A66A95 - - -## -# Image plugin for Sun raster files. - - -class SunImageFile(ImageFile.ImageFile): - format = "SUN" - format_description = "Sun Raster File" - - def _open(self) -> None: - # The Sun Raster file header is 32 bytes in length - # and has the following format: - - # typedef struct _SunRaster - # { - # DWORD MagicNumber; /* Magic (identification) number */ - # DWORD Width; /* Width of image in pixels */ - # DWORD Height; /* Height of image in pixels */ - # DWORD Depth; /* Number of bits per pixel */ - # DWORD Length; /* Size of image data in bytes */ - # DWORD Type; /* Type of raster file */ - # DWORD ColorMapType; /* Type of color map */ - # DWORD ColorMapLength; /* Size of the color map in bytes */ - # } SUNRASTER; - - assert self.fp is not None - - # HEAD - s = self.fp.read(32) - if not _accept(s): - msg = "not an SUN raster file" - raise SyntaxError(msg) - - offset = 32 - - self._size = i32(s, 4), i32(s, 8) - - depth = i32(s, 12) - # data_length = i32(s, 16) # unreliable, ignore. - file_type = i32(s, 20) - palette_type = i32(s, 24) # 0: None, 1: RGB, 2: Raw/arbitrary - palette_length = i32(s, 28) - - if depth == 1: - self._mode, rawmode = "1", "1;I" - elif depth == 4: - self._mode, rawmode = "L", "L;4" - elif depth == 8: - self._mode = rawmode = "L" - elif depth == 24: - if file_type == 3: - self._mode, rawmode = "RGB", "RGB" - else: - self._mode, rawmode = "RGB", "BGR" - elif depth == 32: - if file_type == 3: - self._mode, rawmode = "RGB", "RGBX" - else: - self._mode, rawmode = "RGB", "BGRX" - else: - msg = "Unsupported Mode/Bit Depth" - raise SyntaxError(msg) - - if palette_length: - if palette_length > 1024: - msg = "Unsupported Color Palette Length" - raise SyntaxError(msg) - - if palette_type != 1: - msg = "Unsupported Palette Type" - raise SyntaxError(msg) - - offset = offset + palette_length - self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) - if self.mode == "L": - self._mode = "P" - rawmode = rawmode.replace("L", "P") - - # 16 bit boundaries on stride - stride = ((self.size[0] * depth + 15) // 16) * 2 - - # file type: Type is the version (or flavor) of the bitmap - # file. The following values are typically found in the Type - # field: - # 0000h Old - # 0001h Standard - # 0002h Byte-encoded - # 0003h RGB format - # 0004h TIFF format - # 0005h IFF format - # FFFFh Experimental - - # Old and standard are the same, except for the length tag. - # byte-encoded is run-length-encoded - # RGB looks similar to standard, but RGB byte order - # TIFF and IFF mean that they were converted from T/IFF - # Experimental means that it's something else. - # (https://www.fileformat.info/format/sunraster/egff.htm) - - if file_type in (0, 1, 3, 4, 5): - self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride))] - elif file_type == 2: - self.tile = [("sun_rle", (0, 0) + self.size, offset, rawmode)] - else: - msg = "Unsupported Sun Raster file type" - raise SyntaxError(msg) - - -# -# registry - - -Image.register_open(SunImageFile.format, SunImageFile, _accept) - -Image.register_extension(SunImageFile.format, ".ras") diff --git a/.flatpak-builder/cache/objects/5e/ec496ed8af378c80a42b908cc5f11ee8de0024af76a873e9689c7253774b2c.file b/.flatpak-builder/cache/objects/5e/ec496ed8af378c80a42b908cc5f11ee8de0024af76a873e9689c7253774b2c.file deleted file mode 100644 index 1ab8a018e2ab7b9621bbaea79a9f61718a75b664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11459 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 diff --git a/.flatpak-builder/cache/objects/5f/3c5a041b155970d110194221fce7cbd7828a9dda22b0c0327e16748077fa58.file b/.flatpak-builder/cache/objects/5f/3c5a041b155970d110194221fce7cbd7828a9dda22b0c0327e16748077fa58.file deleted file mode 100644 index c61dcf9..0000000 --- a/.flatpak-builder/cache/objects/5f/3c5a041b155970d110194221fce7cbd7828a9dda22b0c0327e16748077fa58.file +++ /dev/null @@ -1,4245 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = '15.1.0' -scripts = { - 'Greek': ( - 0x37000000374, - 0x37500000378, - 0x37a0000037e, - 0x37f00000380, - 0x38400000385, - 0x38600000387, - 0x3880000038b, - 0x38c0000038d, - 0x38e000003a2, - 0x3a3000003e2, - 0x3f000000400, - 0x1d2600001d2b, - 0x1d5d00001d62, - 0x1d6600001d6b, - 0x1dbf00001dc0, - 0x1f0000001f16, - 0x1f1800001f1e, - 0x1f2000001f46, - 0x1f4800001f4e, - 0x1f5000001f58, - 0x1f5900001f5a, - 0x1f5b00001f5c, - 0x1f5d00001f5e, - 0x1f5f00001f7e, - 0x1f8000001fb5, - 0x1fb600001fc5, - 0x1fc600001fd4, - 0x1fd600001fdc, - 0x1fdd00001ff0, - 0x1ff200001ff5, - 0x1ff600001fff, - 0x212600002127, - 0xab650000ab66, - 0x101400001018f, - 0x101a0000101a1, - 0x1d2000001d246, - ), - 'Han': ( - 0x2e8000002e9a, - 0x2e9b00002ef4, - 0x2f0000002fd6, - 0x300500003006, - 0x300700003008, - 0x30210000302a, - 0x30380000303c, - 0x340000004dc0, - 0x4e000000a000, - 0xf9000000fa6e, - 0xfa700000fada, - 0x16fe200016fe4, - 0x16ff000016ff2, - 0x200000002a6e0, - 0x2a7000002b73a, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - 0x2ebf00002ee5e, - 0x2f8000002fa1e, - 0x300000003134b, - 0x31350000323b0, - ), - 'Hebrew': ( - 0x591000005c8, - 0x5d0000005eb, - 0x5ef000005f5, - 0xfb1d0000fb37, - 0xfb380000fb3d, - 0xfb3e0000fb3f, - 0xfb400000fb42, - 0xfb430000fb45, - 0xfb460000fb50, - ), - 'Hiragana': ( - 0x304100003097, - 0x309d000030a0, - 0x1b0010001b120, - 0x1b1320001b133, - 0x1b1500001b153, - 0x1f2000001f201, - ), - 'Katakana': ( - 0x30a1000030fb, - 0x30fd00003100, - 0x31f000003200, - 0x32d0000032ff, - 0x330000003358, - 0xff660000ff70, - 0xff710000ff9e, - 0x1aff00001aff4, - 0x1aff50001affc, - 0x1affd0001afff, - 0x1b0000001b001, - 0x1b1200001b123, - 0x1b1550001b156, - 0x1b1640001b168, - ), -} -joining_types = { - 0xad: 84, - 0x300: 84, - 0x301: 84, - 0x302: 84, - 0x303: 84, - 0x304: 84, - 0x305: 84, - 0x306: 84, - 0x307: 84, - 0x308: 84, - 0x309: 84, - 0x30a: 84, - 0x30b: 84, - 0x30c: 84, - 0x30d: 84, - 0x30e: 84, - 0x30f: 84, - 0x310: 84, - 0x311: 84, - 0x312: 84, - 0x313: 84, - 0x314: 84, - 0x315: 84, - 0x316: 84, - 0x317: 84, - 0x318: 84, - 0x319: 84, - 0x31a: 84, - 0x31b: 84, - 0x31c: 84, - 0x31d: 84, - 0x31e: 84, - 0x31f: 84, - 0x320: 84, - 0x321: 84, - 0x322: 84, - 0x323: 84, - 0x324: 84, - 0x325: 84, - 0x326: 84, - 0x327: 84, - 0x328: 84, - 0x329: 84, - 0x32a: 84, - 0x32b: 84, - 0x32c: 84, - 0x32d: 84, - 0x32e: 84, - 0x32f: 84, - 0x330: 84, - 0x331: 84, - 0x332: 84, - 0x333: 84, - 0x334: 84, - 0x335: 84, - 0x336: 84, - 0x337: 84, - 0x338: 84, - 0x339: 84, - 0x33a: 84, - 0x33b: 84, - 0x33c: 84, - 0x33d: 84, - 0x33e: 84, - 0x33f: 84, - 0x340: 84, - 0x341: 84, - 0x342: 84, - 0x343: 84, - 0x344: 84, - 0x345: 84, - 0x346: 84, - 0x347: 84, - 0x348: 84, - 0x349: 84, - 0x34a: 84, - 0x34b: 84, - 0x34c: 84, - 0x34d: 84, - 0x34e: 84, - 0x34f: 84, - 0x350: 84, - 0x351: 84, - 0x352: 84, - 0x353: 84, - 0x354: 84, - 0x355: 84, - 0x356: 84, - 0x357: 84, - 0x358: 84, - 0x359: 84, - 0x35a: 84, - 0x35b: 84, - 0x35c: 84, - 0x35d: 84, - 0x35e: 84, - 0x35f: 84, - 0x360: 84, - 0x361: 84, - 0x362: 84, - 0x363: 84, - 0x364: 84, - 0x365: 84, - 0x366: 84, - 0x367: 84, - 0x368: 84, - 0x369: 84, - 0x36a: 84, - 0x36b: 84, - 0x36c: 84, - 0x36d: 84, - 0x36e: 84, - 0x36f: 84, - 0x483: 84, - 0x484: 84, - 0x485: 84, - 0x486: 84, - 0x487: 84, - 0x488: 84, - 0x489: 84, - 0x591: 84, - 0x592: 84, - 0x593: 84, - 0x594: 84, - 0x595: 84, - 0x596: 84, - 0x597: 84, - 0x598: 84, - 0x599: 84, - 0x59a: 84, - 0x59b: 84, - 0x59c: 84, - 0x59d: 84, - 0x59e: 84, - 0x59f: 84, - 0x5a0: 84, - 0x5a1: 84, - 0x5a2: 84, - 0x5a3: 84, - 0x5a4: 84, - 0x5a5: 84, - 0x5a6: 84, - 0x5a7: 84, - 0x5a8: 84, - 0x5a9: 84, - 0x5aa: 84, - 0x5ab: 84, - 0x5ac: 84, - 0x5ad: 84, - 0x5ae: 84, - 0x5af: 84, - 0x5b0: 84, - 0x5b1: 84, - 0x5b2: 84, - 0x5b3: 84, - 0x5b4: 84, - 0x5b5: 84, - 0x5b6: 84, - 0x5b7: 84, - 0x5b8: 84, - 0x5b9: 84, - 0x5ba: 84, - 0x5bb: 84, - 0x5bc: 84, - 0x5bd: 84, - 0x5bf: 84, - 0x5c1: 84, - 0x5c2: 84, - 0x5c4: 84, - 0x5c5: 84, - 0x5c7: 84, - 0x610: 84, - 0x611: 84, - 0x612: 84, - 0x613: 84, - 0x614: 84, - 0x615: 84, - 0x616: 84, - 0x617: 84, - 0x618: 84, - 0x619: 84, - 0x61a: 84, - 0x61c: 84, - 0x620: 68, - 0x622: 82, - 0x623: 82, - 0x624: 82, - 0x625: 82, - 0x626: 68, - 0x627: 82, - 0x628: 68, - 0x629: 82, - 0x62a: 68, - 0x62b: 68, - 0x62c: 68, - 0x62d: 68, - 0x62e: 68, - 0x62f: 82, - 0x630: 82, - 0x631: 82, - 0x632: 82, - 0x633: 68, - 0x634: 68, - 0x635: 68, - 0x636: 68, - 0x637: 68, - 0x638: 68, - 0x639: 68, - 0x63a: 68, - 0x63b: 68, - 0x63c: 68, - 0x63d: 68, - 0x63e: 68, - 0x63f: 68, - 0x640: 67, - 0x641: 68, - 0x642: 68, - 0x643: 68, - 0x644: 68, - 0x645: 68, - 0x646: 68, - 0x647: 68, - 0x648: 82, - 0x649: 68, - 0x64a: 68, - 0x64b: 84, - 0x64c: 84, - 0x64d: 84, - 0x64e: 84, - 0x64f: 84, - 0x650: 84, - 0x651: 84, - 0x652: 84, - 0x653: 84, - 0x654: 84, - 0x655: 84, - 0x656: 84, - 0x657: 84, - 0x658: 84, - 0x659: 84, - 0x65a: 84, - 0x65b: 84, - 0x65c: 84, - 0x65d: 84, - 0x65e: 84, - 0x65f: 84, - 0x66e: 68, - 0x66f: 68, - 0x670: 84, - 0x671: 82, - 0x672: 82, - 0x673: 82, - 0x675: 82, - 0x676: 82, - 0x677: 82, - 0x678: 68, - 0x679: 68, - 0x67a: 68, - 0x67b: 68, - 0x67c: 68, - 0x67d: 68, - 0x67e: 68, - 0x67f: 68, - 0x680: 68, - 0x681: 68, - 0x682: 68, - 0x683: 68, - 0x684: 68, - 0x685: 68, - 0x686: 68, - 0x687: 68, - 0x688: 82, - 0x689: 82, - 0x68a: 82, - 0x68b: 82, - 0x68c: 82, - 0x68d: 82, - 0x68e: 82, - 0x68f: 82, - 0x690: 82, - 0x691: 82, - 0x692: 82, - 0x693: 82, - 0x694: 82, - 0x695: 82, - 0x696: 82, - 0x697: 82, - 0x698: 82, - 0x699: 82, - 0x69a: 68, - 0x69b: 68, - 0x69c: 68, - 0x69d: 68, - 0x69e: 68, - 0x69f: 68, - 0x6a0: 68, - 0x6a1: 68, - 0x6a2: 68, - 0x6a3: 68, - 0x6a4: 68, - 0x6a5: 68, - 0x6a6: 68, - 0x6a7: 68, - 0x6a8: 68, - 0x6a9: 68, - 0x6aa: 68, - 0x6ab: 68, - 0x6ac: 68, - 0x6ad: 68, - 0x6ae: 68, - 0x6af: 68, - 0x6b0: 68, - 0x6b1: 68, - 0x6b2: 68, - 0x6b3: 68, - 0x6b4: 68, - 0x6b5: 68, - 0x6b6: 68, - 0x6b7: 68, - 0x6b8: 68, - 0x6b9: 68, - 0x6ba: 68, - 0x6bb: 68, - 0x6bc: 68, - 0x6bd: 68, - 0x6be: 68, - 0x6bf: 68, - 0x6c0: 82, - 0x6c1: 68, - 0x6c2: 68, - 0x6c3: 82, - 0x6c4: 82, - 0x6c5: 82, - 0x6c6: 82, - 0x6c7: 82, - 0x6c8: 82, - 0x6c9: 82, - 0x6ca: 82, - 0x6cb: 82, - 0x6cc: 68, - 0x6cd: 82, - 0x6ce: 68, - 0x6cf: 82, - 0x6d0: 68, - 0x6d1: 68, - 0x6d2: 82, - 0x6d3: 82, - 0x6d5: 82, - 0x6d6: 84, - 0x6d7: 84, - 0x6d8: 84, - 0x6d9: 84, - 0x6da: 84, - 0x6db: 84, - 0x6dc: 84, - 0x6df: 84, - 0x6e0: 84, - 0x6e1: 84, - 0x6e2: 84, - 0x6e3: 84, - 0x6e4: 84, - 0x6e7: 84, - 0x6e8: 84, - 0x6ea: 84, - 0x6eb: 84, - 0x6ec: 84, - 0x6ed: 84, - 0x6ee: 82, - 0x6ef: 82, - 0x6fa: 68, - 0x6fb: 68, - 0x6fc: 68, - 0x6ff: 68, - 0x70f: 84, - 0x710: 82, - 0x711: 84, - 0x712: 68, - 0x713: 68, - 0x714: 68, - 0x715: 82, - 0x716: 82, - 0x717: 82, - 0x718: 82, - 0x719: 82, - 0x71a: 68, - 0x71b: 68, - 0x71c: 68, - 0x71d: 68, - 0x71e: 82, - 0x71f: 68, - 0x720: 68, - 0x721: 68, - 0x722: 68, - 0x723: 68, - 0x724: 68, - 0x725: 68, - 0x726: 68, - 0x727: 68, - 0x728: 82, - 0x729: 68, - 0x72a: 82, - 0x72b: 68, - 0x72c: 82, - 0x72d: 68, - 0x72e: 68, - 0x72f: 82, - 0x730: 84, - 0x731: 84, - 0x732: 84, - 0x733: 84, - 0x734: 84, - 0x735: 84, - 0x736: 84, - 0x737: 84, - 0x738: 84, - 0x739: 84, - 0x73a: 84, - 0x73b: 84, - 0x73c: 84, - 0x73d: 84, - 0x73e: 84, - 0x73f: 84, - 0x740: 84, - 0x741: 84, - 0x742: 84, - 0x743: 84, - 0x744: 84, - 0x745: 84, - 0x746: 84, - 0x747: 84, - 0x748: 84, - 0x749: 84, - 0x74a: 84, - 0x74d: 82, - 0x74e: 68, - 0x74f: 68, - 0x750: 68, - 0x751: 68, - 0x752: 68, - 0x753: 68, - 0x754: 68, - 0x755: 68, - 0x756: 68, - 0x757: 68, - 0x758: 68, - 0x759: 82, - 0x75a: 82, - 0x75b: 82, - 0x75c: 68, - 0x75d: 68, - 0x75e: 68, - 0x75f: 68, - 0x760: 68, - 0x761: 68, - 0x762: 68, - 0x763: 68, - 0x764: 68, - 0x765: 68, - 0x766: 68, - 0x767: 68, - 0x768: 68, - 0x769: 68, - 0x76a: 68, - 0x76b: 82, - 0x76c: 82, - 0x76d: 68, - 0x76e: 68, - 0x76f: 68, - 0x770: 68, - 0x771: 82, - 0x772: 68, - 0x773: 82, - 0x774: 82, - 0x775: 68, - 0x776: 68, - 0x777: 68, - 0x778: 82, - 0x779: 82, - 0x77a: 68, - 0x77b: 68, - 0x77c: 68, - 0x77d: 68, - 0x77e: 68, - 0x77f: 68, - 0x7a6: 84, - 0x7a7: 84, - 0x7a8: 84, - 0x7a9: 84, - 0x7aa: 84, - 0x7ab: 84, - 0x7ac: 84, - 0x7ad: 84, - 0x7ae: 84, - 0x7af: 84, - 0x7b0: 84, - 0x7ca: 68, - 0x7cb: 68, - 0x7cc: 68, - 0x7cd: 68, - 0x7ce: 68, - 0x7cf: 68, - 0x7d0: 68, - 0x7d1: 68, - 0x7d2: 68, - 0x7d3: 68, - 0x7d4: 68, - 0x7d5: 68, - 0x7d6: 68, - 0x7d7: 68, - 0x7d8: 68, - 0x7d9: 68, - 0x7da: 68, - 0x7db: 68, - 0x7dc: 68, - 0x7dd: 68, - 0x7de: 68, - 0x7df: 68, - 0x7e0: 68, - 0x7e1: 68, - 0x7e2: 68, - 0x7e3: 68, - 0x7e4: 68, - 0x7e5: 68, - 0x7e6: 68, - 0x7e7: 68, - 0x7e8: 68, - 0x7e9: 68, - 0x7ea: 68, - 0x7eb: 84, - 0x7ec: 84, - 0x7ed: 84, - 0x7ee: 84, - 0x7ef: 84, - 0x7f0: 84, - 0x7f1: 84, - 0x7f2: 84, - 0x7f3: 84, - 0x7fa: 67, - 0x7fd: 84, - 0x816: 84, - 0x817: 84, - 0x818: 84, - 0x819: 84, - 0x81b: 84, - 0x81c: 84, - 0x81d: 84, - 0x81e: 84, - 0x81f: 84, - 0x820: 84, - 0x821: 84, - 0x822: 84, - 0x823: 84, - 0x825: 84, - 0x826: 84, - 0x827: 84, - 0x829: 84, - 0x82a: 84, - 0x82b: 84, - 0x82c: 84, - 0x82d: 84, - 0x840: 82, - 0x841: 68, - 0x842: 68, - 0x843: 68, - 0x844: 68, - 0x845: 68, - 0x846: 82, - 0x847: 82, - 0x848: 68, - 0x849: 82, - 0x84a: 68, - 0x84b: 68, - 0x84c: 68, - 0x84d: 68, - 0x84e: 68, - 0x84f: 68, - 0x850: 68, - 0x851: 68, - 0x852: 68, - 0x853: 68, - 0x854: 82, - 0x855: 68, - 0x856: 82, - 0x857: 82, - 0x858: 82, - 0x859: 84, - 0x85a: 84, - 0x85b: 84, - 0x860: 68, - 0x862: 68, - 0x863: 68, - 0x864: 68, - 0x865: 68, - 0x867: 82, - 0x868: 68, - 0x869: 82, - 0x86a: 82, - 0x870: 82, - 0x871: 82, - 0x872: 82, - 0x873: 82, - 0x874: 82, - 0x875: 82, - 0x876: 82, - 0x877: 82, - 0x878: 82, - 0x879: 82, - 0x87a: 82, - 0x87b: 82, - 0x87c: 82, - 0x87d: 82, - 0x87e: 82, - 0x87f: 82, - 0x880: 82, - 0x881: 82, - 0x882: 82, - 0x883: 67, - 0x884: 67, - 0x885: 67, - 0x886: 68, - 0x889: 68, - 0x88a: 68, - 0x88b: 68, - 0x88c: 68, - 0x88d: 68, - 0x88e: 82, - 0x898: 84, - 0x899: 84, - 0x89a: 84, - 0x89b: 84, - 0x89c: 84, - 0x89d: 84, - 0x89e: 84, - 0x89f: 84, - 0x8a0: 68, - 0x8a1: 68, - 0x8a2: 68, - 0x8a3: 68, - 0x8a4: 68, - 0x8a5: 68, - 0x8a6: 68, - 0x8a7: 68, - 0x8a8: 68, - 0x8a9: 68, - 0x8aa: 82, - 0x8ab: 82, - 0x8ac: 82, - 0x8ae: 82, - 0x8af: 68, - 0x8b0: 68, - 0x8b1: 82, - 0x8b2: 82, - 0x8b3: 68, - 0x8b4: 68, - 0x8b5: 68, - 0x8b6: 68, - 0x8b7: 68, - 0x8b8: 68, - 0x8b9: 82, - 0x8ba: 68, - 0x8bb: 68, - 0x8bc: 68, - 0x8bd: 68, - 0x8be: 68, - 0x8bf: 68, - 0x8c0: 68, - 0x8c1: 68, - 0x8c2: 68, - 0x8c3: 68, - 0x8c4: 68, - 0x8c5: 68, - 0x8c6: 68, - 0x8c7: 68, - 0x8c8: 68, - 0x8ca: 84, - 0x8cb: 84, - 0x8cc: 84, - 0x8cd: 84, - 0x8ce: 84, - 0x8cf: 84, - 0x8d0: 84, - 0x8d1: 84, - 0x8d2: 84, - 0x8d3: 84, - 0x8d4: 84, - 0x8d5: 84, - 0x8d6: 84, - 0x8d7: 84, - 0x8d8: 84, - 0x8d9: 84, - 0x8da: 84, - 0x8db: 84, - 0x8dc: 84, - 0x8dd: 84, - 0x8de: 84, - 0x8df: 84, - 0x8e0: 84, - 0x8e1: 84, - 0x8e3: 84, - 0x8e4: 84, - 0x8e5: 84, - 0x8e6: 84, - 0x8e7: 84, - 0x8e8: 84, - 0x8e9: 84, - 0x8ea: 84, - 0x8eb: 84, - 0x8ec: 84, - 0x8ed: 84, - 0x8ee: 84, - 0x8ef: 84, - 0x8f0: 84, - 0x8f1: 84, - 0x8f2: 84, - 0x8f3: 84, - 0x8f4: 84, - 0x8f5: 84, - 0x8f6: 84, - 0x8f7: 84, - 0x8f8: 84, - 0x8f9: 84, - 0x8fa: 84, - 0x8fb: 84, - 0x8fc: 84, - 0x8fd: 84, - 0x8fe: 84, - 0x8ff: 84, - 0x900: 84, - 0x901: 84, - 0x902: 84, - 0x93a: 84, - 0x93c: 84, - 0x941: 84, - 0x942: 84, - 0x943: 84, - 0x944: 84, - 0x945: 84, - 0x946: 84, - 0x947: 84, - 0x948: 84, - 0x94d: 84, - 0x951: 84, - 0x952: 84, - 0x953: 84, - 0x954: 84, - 0x955: 84, - 0x956: 84, - 0x957: 84, - 0x962: 84, - 0x963: 84, - 0x981: 84, - 0x9bc: 84, - 0x9c1: 84, - 0x9c2: 84, - 0x9c3: 84, - 0x9c4: 84, - 0x9cd: 84, - 0x9e2: 84, - 0x9e3: 84, - 0x9fe: 84, - 0xa01: 84, - 0xa02: 84, - 0xa3c: 84, - 0xa41: 84, - 0xa42: 84, - 0xa47: 84, - 0xa48: 84, - 0xa4b: 84, - 0xa4c: 84, - 0xa4d: 84, - 0xa51: 84, - 0xa70: 84, - 0xa71: 84, - 0xa75: 84, - 0xa81: 84, - 0xa82: 84, - 0xabc: 84, - 0xac1: 84, - 0xac2: 84, - 0xac3: 84, - 0xac4: 84, - 0xac5: 84, - 0xac7: 84, - 0xac8: 84, - 0xacd: 84, - 0xae2: 84, - 0xae3: 84, - 0xafa: 84, - 0xafb: 84, - 0xafc: 84, - 0xafd: 84, - 0xafe: 84, - 0xaff: 84, - 0xb01: 84, - 0xb3c: 84, - 0xb3f: 84, - 0xb41: 84, - 0xb42: 84, - 0xb43: 84, - 0xb44: 84, - 0xb4d: 84, - 0xb55: 84, - 0xb56: 84, - 0xb62: 84, - 0xb63: 84, - 0xb82: 84, - 0xbc0: 84, - 0xbcd: 84, - 0xc00: 84, - 0xc04: 84, - 0xc3c: 84, - 0xc3e: 84, - 0xc3f: 84, - 0xc40: 84, - 0xc46: 84, - 0xc47: 84, - 0xc48: 84, - 0xc4a: 84, - 0xc4b: 84, - 0xc4c: 84, - 0xc4d: 84, - 0xc55: 84, - 0xc56: 84, - 0xc62: 84, - 0xc63: 84, - 0xc81: 84, - 0xcbc: 84, - 0xcbf: 84, - 0xcc6: 84, - 0xccc: 84, - 0xccd: 84, - 0xce2: 84, - 0xce3: 84, - 0xd00: 84, - 0xd01: 84, - 0xd3b: 84, - 0xd3c: 84, - 0xd41: 84, - 0xd42: 84, - 0xd43: 84, - 0xd44: 84, - 0xd4d: 84, - 0xd62: 84, - 0xd63: 84, - 0xd81: 84, - 0xdca: 84, - 0xdd2: 84, - 0xdd3: 84, - 0xdd4: 84, - 0xdd6: 84, - 0xe31: 84, - 0xe34: 84, - 0xe35: 84, - 0xe36: 84, - 0xe37: 84, - 0xe38: 84, - 0xe39: 84, - 0xe3a: 84, - 0xe47: 84, - 0xe48: 84, - 0xe49: 84, - 0xe4a: 84, - 0xe4b: 84, - 0xe4c: 84, - 0xe4d: 84, - 0xe4e: 84, - 0xeb1: 84, - 0xeb4: 84, - 0xeb5: 84, - 0xeb6: 84, - 0xeb7: 84, - 0xeb8: 84, - 0xeb9: 84, - 0xeba: 84, - 0xebb: 84, - 0xebc: 84, - 0xec8: 84, - 0xec9: 84, - 0xeca: 84, - 0xecb: 84, - 0xecc: 84, - 0xecd: 84, - 0xece: 84, - 0xf18: 84, - 0xf19: 84, - 0xf35: 84, - 0xf37: 84, - 0xf39: 84, - 0xf71: 84, - 0xf72: 84, - 0xf73: 84, - 0xf74: 84, - 0xf75: 84, - 0xf76: 84, - 0xf77: 84, - 0xf78: 84, - 0xf79: 84, - 0xf7a: 84, - 0xf7b: 84, - 0xf7c: 84, - 0xf7d: 84, - 0xf7e: 84, - 0xf80: 84, - 0xf81: 84, - 0xf82: 84, - 0xf83: 84, - 0xf84: 84, - 0xf86: 84, - 0xf87: 84, - 0xf8d: 84, - 0xf8e: 84, - 0xf8f: 84, - 0xf90: 84, - 0xf91: 84, - 0xf92: 84, - 0xf93: 84, - 0xf94: 84, - 0xf95: 84, - 0xf96: 84, - 0xf97: 84, - 0xf99: 84, - 0xf9a: 84, - 0xf9b: 84, - 0xf9c: 84, - 0xf9d: 84, - 0xf9e: 84, - 0xf9f: 84, - 0xfa0: 84, - 0xfa1: 84, - 0xfa2: 84, - 0xfa3: 84, - 0xfa4: 84, - 0xfa5: 84, - 0xfa6: 84, - 0xfa7: 84, - 0xfa8: 84, - 0xfa9: 84, - 0xfaa: 84, - 0xfab: 84, - 0xfac: 84, - 0xfad: 84, - 0xfae: 84, - 0xfaf: 84, - 0xfb0: 84, - 0xfb1: 84, - 0xfb2: 84, - 0xfb3: 84, - 0xfb4: 84, - 0xfb5: 84, - 0xfb6: 84, - 0xfb7: 84, - 0xfb8: 84, - 0xfb9: 84, - 0xfba: 84, - 0xfbb: 84, - 0xfbc: 84, - 0xfc6: 84, - 0x102d: 84, - 0x102e: 84, - 0x102f: 84, - 0x1030: 84, - 0x1032: 84, - 0x1033: 84, - 0x1034: 84, - 0x1035: 84, - 0x1036: 84, - 0x1037: 84, - 0x1039: 84, - 0x103a: 84, - 0x103d: 84, - 0x103e: 84, - 0x1058: 84, - 0x1059: 84, - 0x105e: 84, - 0x105f: 84, - 0x1060: 84, - 0x1071: 84, - 0x1072: 84, - 0x1073: 84, - 0x1074: 84, - 0x1082: 84, - 0x1085: 84, - 0x1086: 84, - 0x108d: 84, - 0x109d: 84, - 0x135d: 84, - 0x135e: 84, - 0x135f: 84, - 0x1712: 84, - 0x1713: 84, - 0x1714: 84, - 0x1732: 84, - 0x1733: 84, - 0x1752: 84, - 0x1753: 84, - 0x1772: 84, - 0x1773: 84, - 0x17b4: 84, - 0x17b5: 84, - 0x17b7: 84, - 0x17b8: 84, - 0x17b9: 84, - 0x17ba: 84, - 0x17bb: 84, - 0x17bc: 84, - 0x17bd: 84, - 0x17c6: 84, - 0x17c9: 84, - 0x17ca: 84, - 0x17cb: 84, - 0x17cc: 84, - 0x17cd: 84, - 0x17ce: 84, - 0x17cf: 84, - 0x17d0: 84, - 0x17d1: 84, - 0x17d2: 84, - 0x17d3: 84, - 0x17dd: 84, - 0x1807: 68, - 0x180a: 67, - 0x180b: 84, - 0x180c: 84, - 0x180d: 84, - 0x180f: 84, - 0x1820: 68, - 0x1821: 68, - 0x1822: 68, - 0x1823: 68, - 0x1824: 68, - 0x1825: 68, - 0x1826: 68, - 0x1827: 68, - 0x1828: 68, - 0x1829: 68, - 0x182a: 68, - 0x182b: 68, - 0x182c: 68, - 0x182d: 68, - 0x182e: 68, - 0x182f: 68, - 0x1830: 68, - 0x1831: 68, - 0x1832: 68, - 0x1833: 68, - 0x1834: 68, - 0x1835: 68, - 0x1836: 68, - 0x1837: 68, - 0x1838: 68, - 0x1839: 68, - 0x183a: 68, - 0x183b: 68, - 0x183c: 68, - 0x183d: 68, - 0x183e: 68, - 0x183f: 68, - 0x1840: 68, - 0x1841: 68, - 0x1842: 68, - 0x1843: 68, - 0x1844: 68, - 0x1845: 68, - 0x1846: 68, - 0x1847: 68, - 0x1848: 68, - 0x1849: 68, - 0x184a: 68, - 0x184b: 68, - 0x184c: 68, - 0x184d: 68, - 0x184e: 68, - 0x184f: 68, - 0x1850: 68, - 0x1851: 68, - 0x1852: 68, - 0x1853: 68, - 0x1854: 68, - 0x1855: 68, - 0x1856: 68, - 0x1857: 68, - 0x1858: 68, - 0x1859: 68, - 0x185a: 68, - 0x185b: 68, - 0x185c: 68, - 0x185d: 68, - 0x185e: 68, - 0x185f: 68, - 0x1860: 68, - 0x1861: 68, - 0x1862: 68, - 0x1863: 68, - 0x1864: 68, - 0x1865: 68, - 0x1866: 68, - 0x1867: 68, - 0x1868: 68, - 0x1869: 68, - 0x186a: 68, - 0x186b: 68, - 0x186c: 68, - 0x186d: 68, - 0x186e: 68, - 0x186f: 68, - 0x1870: 68, - 0x1871: 68, - 0x1872: 68, - 0x1873: 68, - 0x1874: 68, - 0x1875: 68, - 0x1876: 68, - 0x1877: 68, - 0x1878: 68, - 0x1885: 84, - 0x1886: 84, - 0x1887: 68, - 0x1888: 68, - 0x1889: 68, - 0x188a: 68, - 0x188b: 68, - 0x188c: 68, - 0x188d: 68, - 0x188e: 68, - 0x188f: 68, - 0x1890: 68, - 0x1891: 68, - 0x1892: 68, - 0x1893: 68, - 0x1894: 68, - 0x1895: 68, - 0x1896: 68, - 0x1897: 68, - 0x1898: 68, - 0x1899: 68, - 0x189a: 68, - 0x189b: 68, - 0x189c: 68, - 0x189d: 68, - 0x189e: 68, - 0x189f: 68, - 0x18a0: 68, - 0x18a1: 68, - 0x18a2: 68, - 0x18a3: 68, - 0x18a4: 68, - 0x18a5: 68, - 0x18a6: 68, - 0x18a7: 68, - 0x18a8: 68, - 0x18a9: 84, - 0x18aa: 68, - 0x1920: 84, - 0x1921: 84, - 0x1922: 84, - 0x1927: 84, - 0x1928: 84, - 0x1932: 84, - 0x1939: 84, - 0x193a: 84, - 0x193b: 84, - 0x1a17: 84, - 0x1a18: 84, - 0x1a1b: 84, - 0x1a56: 84, - 0x1a58: 84, - 0x1a59: 84, - 0x1a5a: 84, - 0x1a5b: 84, - 0x1a5c: 84, - 0x1a5d: 84, - 0x1a5e: 84, - 0x1a60: 84, - 0x1a62: 84, - 0x1a65: 84, - 0x1a66: 84, - 0x1a67: 84, - 0x1a68: 84, - 0x1a69: 84, - 0x1a6a: 84, - 0x1a6b: 84, - 0x1a6c: 84, - 0x1a73: 84, - 0x1a74: 84, - 0x1a75: 84, - 0x1a76: 84, - 0x1a77: 84, - 0x1a78: 84, - 0x1a79: 84, - 0x1a7a: 84, - 0x1a7b: 84, - 0x1a7c: 84, - 0x1a7f: 84, - 0x1ab0: 84, - 0x1ab1: 84, - 0x1ab2: 84, - 0x1ab3: 84, - 0x1ab4: 84, - 0x1ab5: 84, - 0x1ab6: 84, - 0x1ab7: 84, - 0x1ab8: 84, - 0x1ab9: 84, - 0x1aba: 84, - 0x1abb: 84, - 0x1abc: 84, - 0x1abd: 84, - 0x1abe: 84, - 0x1abf: 84, - 0x1ac0: 84, - 0x1ac1: 84, - 0x1ac2: 84, - 0x1ac3: 84, - 0x1ac4: 84, - 0x1ac5: 84, - 0x1ac6: 84, - 0x1ac7: 84, - 0x1ac8: 84, - 0x1ac9: 84, - 0x1aca: 84, - 0x1acb: 84, - 0x1acc: 84, - 0x1acd: 84, - 0x1ace: 84, - 0x1b00: 84, - 0x1b01: 84, - 0x1b02: 84, - 0x1b03: 84, - 0x1b34: 84, - 0x1b36: 84, - 0x1b37: 84, - 0x1b38: 84, - 0x1b39: 84, - 0x1b3a: 84, - 0x1b3c: 84, - 0x1b42: 84, - 0x1b6b: 84, - 0x1b6c: 84, - 0x1b6d: 84, - 0x1b6e: 84, - 0x1b6f: 84, - 0x1b70: 84, - 0x1b71: 84, - 0x1b72: 84, - 0x1b73: 84, - 0x1b80: 84, - 0x1b81: 84, - 0x1ba2: 84, - 0x1ba3: 84, - 0x1ba4: 84, - 0x1ba5: 84, - 0x1ba8: 84, - 0x1ba9: 84, - 0x1bab: 84, - 0x1bac: 84, - 0x1bad: 84, - 0x1be6: 84, - 0x1be8: 84, - 0x1be9: 84, - 0x1bed: 84, - 0x1bef: 84, - 0x1bf0: 84, - 0x1bf1: 84, - 0x1c2c: 84, - 0x1c2d: 84, - 0x1c2e: 84, - 0x1c2f: 84, - 0x1c30: 84, - 0x1c31: 84, - 0x1c32: 84, - 0x1c33: 84, - 0x1c36: 84, - 0x1c37: 84, - 0x1cd0: 84, - 0x1cd1: 84, - 0x1cd2: 84, - 0x1cd4: 84, - 0x1cd5: 84, - 0x1cd6: 84, - 0x1cd7: 84, - 0x1cd8: 84, - 0x1cd9: 84, - 0x1cda: 84, - 0x1cdb: 84, - 0x1cdc: 84, - 0x1cdd: 84, - 0x1cde: 84, - 0x1cdf: 84, - 0x1ce0: 84, - 0x1ce2: 84, - 0x1ce3: 84, - 0x1ce4: 84, - 0x1ce5: 84, - 0x1ce6: 84, - 0x1ce7: 84, - 0x1ce8: 84, - 0x1ced: 84, - 0x1cf4: 84, - 0x1cf8: 84, - 0x1cf9: 84, - 0x1dc0: 84, - 0x1dc1: 84, - 0x1dc2: 84, - 0x1dc3: 84, - 0x1dc4: 84, - 0x1dc5: 84, - 0x1dc6: 84, - 0x1dc7: 84, - 0x1dc8: 84, - 0x1dc9: 84, - 0x1dca: 84, - 0x1dcb: 84, - 0x1dcc: 84, - 0x1dcd: 84, - 0x1dce: 84, - 0x1dcf: 84, - 0x1dd0: 84, - 0x1dd1: 84, - 0x1dd2: 84, - 0x1dd3: 84, - 0x1dd4: 84, - 0x1dd5: 84, - 0x1dd6: 84, - 0x1dd7: 84, - 0x1dd8: 84, - 0x1dd9: 84, - 0x1dda: 84, - 0x1ddb: 84, - 0x1ddc: 84, - 0x1ddd: 84, - 0x1dde: 84, - 0x1ddf: 84, - 0x1de0: 84, - 0x1de1: 84, - 0x1de2: 84, - 0x1de3: 84, - 0x1de4: 84, - 0x1de5: 84, - 0x1de6: 84, - 0x1de7: 84, - 0x1de8: 84, - 0x1de9: 84, - 0x1dea: 84, - 0x1deb: 84, - 0x1dec: 84, - 0x1ded: 84, - 0x1dee: 84, - 0x1def: 84, - 0x1df0: 84, - 0x1df1: 84, - 0x1df2: 84, - 0x1df3: 84, - 0x1df4: 84, - 0x1df5: 84, - 0x1df6: 84, - 0x1df7: 84, - 0x1df8: 84, - 0x1df9: 84, - 0x1dfa: 84, - 0x1dfb: 84, - 0x1dfc: 84, - 0x1dfd: 84, - 0x1dfe: 84, - 0x1dff: 84, - 0x200b: 84, - 0x200d: 67, - 0x200e: 84, - 0x200f: 84, - 0x202a: 84, - 0x202b: 84, - 0x202c: 84, - 0x202d: 84, - 0x202e: 84, - 0x2060: 84, - 0x2061: 84, - 0x2062: 84, - 0x2063: 84, - 0x2064: 84, - 0x206a: 84, - 0x206b: 84, - 0x206c: 84, - 0x206d: 84, - 0x206e: 84, - 0x206f: 84, - 0x20d0: 84, - 0x20d1: 84, - 0x20d2: 84, - 0x20d3: 84, - 0x20d4: 84, - 0x20d5: 84, - 0x20d6: 84, - 0x20d7: 84, - 0x20d8: 84, - 0x20d9: 84, - 0x20da: 84, - 0x20db: 84, - 0x20dc: 84, - 0x20dd: 84, - 0x20de: 84, - 0x20df: 84, - 0x20e0: 84, - 0x20e1: 84, - 0x20e2: 84, - 0x20e3: 84, - 0x20e4: 84, - 0x20e5: 84, - 0x20e6: 84, - 0x20e7: 84, - 0x20e8: 84, - 0x20e9: 84, - 0x20ea: 84, - 0x20eb: 84, - 0x20ec: 84, - 0x20ed: 84, - 0x20ee: 84, - 0x20ef: 84, - 0x20f0: 84, - 0x2cef: 84, - 0x2cf0: 84, - 0x2cf1: 84, - 0x2d7f: 84, - 0x2de0: 84, - 0x2de1: 84, - 0x2de2: 84, - 0x2de3: 84, - 0x2de4: 84, - 0x2de5: 84, - 0x2de6: 84, - 0x2de7: 84, - 0x2de8: 84, - 0x2de9: 84, - 0x2dea: 84, - 0x2deb: 84, - 0x2dec: 84, - 0x2ded: 84, - 0x2dee: 84, - 0x2def: 84, - 0x2df0: 84, - 0x2df1: 84, - 0x2df2: 84, - 0x2df3: 84, - 0x2df4: 84, - 0x2df5: 84, - 0x2df6: 84, - 0x2df7: 84, - 0x2df8: 84, - 0x2df9: 84, - 0x2dfa: 84, - 0x2dfb: 84, - 0x2dfc: 84, - 0x2dfd: 84, - 0x2dfe: 84, - 0x2dff: 84, - 0x302a: 84, - 0x302b: 84, - 0x302c: 84, - 0x302d: 84, - 0x3099: 84, - 0x309a: 84, - 0xa66f: 84, - 0xa670: 84, - 0xa671: 84, - 0xa672: 84, - 0xa674: 84, - 0xa675: 84, - 0xa676: 84, - 0xa677: 84, - 0xa678: 84, - 0xa679: 84, - 0xa67a: 84, - 0xa67b: 84, - 0xa67c: 84, - 0xa67d: 84, - 0xa69e: 84, - 0xa69f: 84, - 0xa6f0: 84, - 0xa6f1: 84, - 0xa802: 84, - 0xa806: 84, - 0xa80b: 84, - 0xa825: 84, - 0xa826: 84, - 0xa82c: 84, - 0xa840: 68, - 0xa841: 68, - 0xa842: 68, - 0xa843: 68, - 0xa844: 68, - 0xa845: 68, - 0xa846: 68, - 0xa847: 68, - 0xa848: 68, - 0xa849: 68, - 0xa84a: 68, - 0xa84b: 68, - 0xa84c: 68, - 0xa84d: 68, - 0xa84e: 68, - 0xa84f: 68, - 0xa850: 68, - 0xa851: 68, - 0xa852: 68, - 0xa853: 68, - 0xa854: 68, - 0xa855: 68, - 0xa856: 68, - 0xa857: 68, - 0xa858: 68, - 0xa859: 68, - 0xa85a: 68, - 0xa85b: 68, - 0xa85c: 68, - 0xa85d: 68, - 0xa85e: 68, - 0xa85f: 68, - 0xa860: 68, - 0xa861: 68, - 0xa862: 68, - 0xa863: 68, - 0xa864: 68, - 0xa865: 68, - 0xa866: 68, - 0xa867: 68, - 0xa868: 68, - 0xa869: 68, - 0xa86a: 68, - 0xa86b: 68, - 0xa86c: 68, - 0xa86d: 68, - 0xa86e: 68, - 0xa86f: 68, - 0xa870: 68, - 0xa871: 68, - 0xa872: 76, - 0xa8c4: 84, - 0xa8c5: 84, - 0xa8e0: 84, - 0xa8e1: 84, - 0xa8e2: 84, - 0xa8e3: 84, - 0xa8e4: 84, - 0xa8e5: 84, - 0xa8e6: 84, - 0xa8e7: 84, - 0xa8e8: 84, - 0xa8e9: 84, - 0xa8ea: 84, - 0xa8eb: 84, - 0xa8ec: 84, - 0xa8ed: 84, - 0xa8ee: 84, - 0xa8ef: 84, - 0xa8f0: 84, - 0xa8f1: 84, - 0xa8ff: 84, - 0xa926: 84, - 0xa927: 84, - 0xa928: 84, - 0xa929: 84, - 0xa92a: 84, - 0xa92b: 84, - 0xa92c: 84, - 0xa92d: 84, - 0xa947: 84, - 0xa948: 84, - 0xa949: 84, - 0xa94a: 84, - 0xa94b: 84, - 0xa94c: 84, - 0xa94d: 84, - 0xa94e: 84, - 0xa94f: 84, - 0xa950: 84, - 0xa951: 84, - 0xa980: 84, - 0xa981: 84, - 0xa982: 84, - 0xa9b3: 84, - 0xa9b6: 84, - 0xa9b7: 84, - 0xa9b8: 84, - 0xa9b9: 84, - 0xa9bc: 84, - 0xa9bd: 84, - 0xa9e5: 84, - 0xaa29: 84, - 0xaa2a: 84, - 0xaa2b: 84, - 0xaa2c: 84, - 0xaa2d: 84, - 0xaa2e: 84, - 0xaa31: 84, - 0xaa32: 84, - 0xaa35: 84, - 0xaa36: 84, - 0xaa43: 84, - 0xaa4c: 84, - 0xaa7c: 84, - 0xaab0: 84, - 0xaab2: 84, - 0xaab3: 84, - 0xaab4: 84, - 0xaab7: 84, - 0xaab8: 84, - 0xaabe: 84, - 0xaabf: 84, - 0xaac1: 84, - 0xaaec: 84, - 0xaaed: 84, - 0xaaf6: 84, - 0xabe5: 84, - 0xabe8: 84, - 0xabed: 84, - 0xfb1e: 84, - 0xfe00: 84, - 0xfe01: 84, - 0xfe02: 84, - 0xfe03: 84, - 0xfe04: 84, - 0xfe05: 84, - 0xfe06: 84, - 0xfe07: 84, - 0xfe08: 84, - 0xfe09: 84, - 0xfe0a: 84, - 0xfe0b: 84, - 0xfe0c: 84, - 0xfe0d: 84, - 0xfe0e: 84, - 0xfe0f: 84, - 0xfe20: 84, - 0xfe21: 84, - 0xfe22: 84, - 0xfe23: 84, - 0xfe24: 84, - 0xfe25: 84, - 0xfe26: 84, - 0xfe27: 84, - 0xfe28: 84, - 0xfe29: 84, - 0xfe2a: 84, - 0xfe2b: 84, - 0xfe2c: 84, - 0xfe2d: 84, - 0xfe2e: 84, - 0xfe2f: 84, - 0xfeff: 84, - 0xfff9: 84, - 0xfffa: 84, - 0xfffb: 84, - 0x101fd: 84, - 0x102e0: 84, - 0x10376: 84, - 0x10377: 84, - 0x10378: 84, - 0x10379: 84, - 0x1037a: 84, - 0x10a01: 84, - 0x10a02: 84, - 0x10a03: 84, - 0x10a05: 84, - 0x10a06: 84, - 0x10a0c: 84, - 0x10a0d: 84, - 0x10a0e: 84, - 0x10a0f: 84, - 0x10a38: 84, - 0x10a39: 84, - 0x10a3a: 84, - 0x10a3f: 84, - 0x10ac0: 68, - 0x10ac1: 68, - 0x10ac2: 68, - 0x10ac3: 68, - 0x10ac4: 68, - 0x10ac5: 82, - 0x10ac7: 82, - 0x10ac9: 82, - 0x10aca: 82, - 0x10acd: 76, - 0x10ace: 82, - 0x10acf: 82, - 0x10ad0: 82, - 0x10ad1: 82, - 0x10ad2: 82, - 0x10ad3: 68, - 0x10ad4: 68, - 0x10ad5: 68, - 0x10ad6: 68, - 0x10ad7: 76, - 0x10ad8: 68, - 0x10ad9: 68, - 0x10ada: 68, - 0x10adb: 68, - 0x10adc: 68, - 0x10add: 82, - 0x10ade: 68, - 0x10adf: 68, - 0x10ae0: 68, - 0x10ae1: 82, - 0x10ae4: 82, - 0x10ae5: 84, - 0x10ae6: 84, - 0x10aeb: 68, - 0x10aec: 68, - 0x10aed: 68, - 0x10aee: 68, - 0x10aef: 82, - 0x10b80: 68, - 0x10b81: 82, - 0x10b82: 68, - 0x10b83: 82, - 0x10b84: 82, - 0x10b85: 82, - 0x10b86: 68, - 0x10b87: 68, - 0x10b88: 68, - 0x10b89: 82, - 0x10b8a: 68, - 0x10b8b: 68, - 0x10b8c: 82, - 0x10b8d: 68, - 0x10b8e: 82, - 0x10b8f: 82, - 0x10b90: 68, - 0x10b91: 82, - 0x10ba9: 82, - 0x10baa: 82, - 0x10bab: 82, - 0x10bac: 82, - 0x10bad: 68, - 0x10bae: 68, - 0x10d00: 76, - 0x10d01: 68, - 0x10d02: 68, - 0x10d03: 68, - 0x10d04: 68, - 0x10d05: 68, - 0x10d06: 68, - 0x10d07: 68, - 0x10d08: 68, - 0x10d09: 68, - 0x10d0a: 68, - 0x10d0b: 68, - 0x10d0c: 68, - 0x10d0d: 68, - 0x10d0e: 68, - 0x10d0f: 68, - 0x10d10: 68, - 0x10d11: 68, - 0x10d12: 68, - 0x10d13: 68, - 0x10d14: 68, - 0x10d15: 68, - 0x10d16: 68, - 0x10d17: 68, - 0x10d18: 68, - 0x10d19: 68, - 0x10d1a: 68, - 0x10d1b: 68, - 0x10d1c: 68, - 0x10d1d: 68, - 0x10d1e: 68, - 0x10d1f: 68, - 0x10d20: 68, - 0x10d21: 68, - 0x10d22: 82, - 0x10d23: 68, - 0x10d24: 84, - 0x10d25: 84, - 0x10d26: 84, - 0x10d27: 84, - 0x10eab: 84, - 0x10eac: 84, - 0x10efd: 84, - 0x10efe: 84, - 0x10eff: 84, - 0x10f30: 68, - 0x10f31: 68, - 0x10f32: 68, - 0x10f33: 82, - 0x10f34: 68, - 0x10f35: 68, - 0x10f36: 68, - 0x10f37: 68, - 0x10f38: 68, - 0x10f39: 68, - 0x10f3a: 68, - 0x10f3b: 68, - 0x10f3c: 68, - 0x10f3d: 68, - 0x10f3e: 68, - 0x10f3f: 68, - 0x10f40: 68, - 0x10f41: 68, - 0x10f42: 68, - 0x10f43: 68, - 0x10f44: 68, - 0x10f46: 84, - 0x10f47: 84, - 0x10f48: 84, - 0x10f49: 84, - 0x10f4a: 84, - 0x10f4b: 84, - 0x10f4c: 84, - 0x10f4d: 84, - 0x10f4e: 84, - 0x10f4f: 84, - 0x10f50: 84, - 0x10f51: 68, - 0x10f52: 68, - 0x10f53: 68, - 0x10f54: 82, - 0x10f70: 68, - 0x10f71: 68, - 0x10f72: 68, - 0x10f73: 68, - 0x10f74: 82, - 0x10f75: 82, - 0x10f76: 68, - 0x10f77: 68, - 0x10f78: 68, - 0x10f79: 68, - 0x10f7a: 68, - 0x10f7b: 68, - 0x10f7c: 68, - 0x10f7d: 68, - 0x10f7e: 68, - 0x10f7f: 68, - 0x10f80: 68, - 0x10f81: 68, - 0x10f82: 84, - 0x10f83: 84, - 0x10f84: 84, - 0x10f85: 84, - 0x10fb0: 68, - 0x10fb2: 68, - 0x10fb3: 68, - 0x10fb4: 82, - 0x10fb5: 82, - 0x10fb6: 82, - 0x10fb8: 68, - 0x10fb9: 82, - 0x10fba: 82, - 0x10fbb: 68, - 0x10fbc: 68, - 0x10fbd: 82, - 0x10fbe: 68, - 0x10fbf: 68, - 0x10fc1: 68, - 0x10fc2: 82, - 0x10fc3: 82, - 0x10fc4: 68, - 0x10fc9: 82, - 0x10fca: 68, - 0x10fcb: 76, - 0x11001: 84, - 0x11038: 84, - 0x11039: 84, - 0x1103a: 84, - 0x1103b: 84, - 0x1103c: 84, - 0x1103d: 84, - 0x1103e: 84, - 0x1103f: 84, - 0x11040: 84, - 0x11041: 84, - 0x11042: 84, - 0x11043: 84, - 0x11044: 84, - 0x11045: 84, - 0x11046: 84, - 0x11070: 84, - 0x11073: 84, - 0x11074: 84, - 0x1107f: 84, - 0x11080: 84, - 0x11081: 84, - 0x110b3: 84, - 0x110b4: 84, - 0x110b5: 84, - 0x110b6: 84, - 0x110b9: 84, - 0x110ba: 84, - 0x110c2: 84, - 0x11100: 84, - 0x11101: 84, - 0x11102: 84, - 0x11127: 84, - 0x11128: 84, - 0x11129: 84, - 0x1112a: 84, - 0x1112b: 84, - 0x1112d: 84, - 0x1112e: 84, - 0x1112f: 84, - 0x11130: 84, - 0x11131: 84, - 0x11132: 84, - 0x11133: 84, - 0x11134: 84, - 0x11173: 84, - 0x11180: 84, - 0x11181: 84, - 0x111b6: 84, - 0x111b7: 84, - 0x111b8: 84, - 0x111b9: 84, - 0x111ba: 84, - 0x111bb: 84, - 0x111bc: 84, - 0x111bd: 84, - 0x111be: 84, - 0x111c9: 84, - 0x111ca: 84, - 0x111cb: 84, - 0x111cc: 84, - 0x111cf: 84, - 0x1122f: 84, - 0x11230: 84, - 0x11231: 84, - 0x11234: 84, - 0x11236: 84, - 0x11237: 84, - 0x1123e: 84, - 0x11241: 84, - 0x112df: 84, - 0x112e3: 84, - 0x112e4: 84, - 0x112e5: 84, - 0x112e6: 84, - 0x112e7: 84, - 0x112e8: 84, - 0x112e9: 84, - 0x112ea: 84, - 0x11300: 84, - 0x11301: 84, - 0x1133b: 84, - 0x1133c: 84, - 0x11340: 84, - 0x11366: 84, - 0x11367: 84, - 0x11368: 84, - 0x11369: 84, - 0x1136a: 84, - 0x1136b: 84, - 0x1136c: 84, - 0x11370: 84, - 0x11371: 84, - 0x11372: 84, - 0x11373: 84, - 0x11374: 84, - 0x11438: 84, - 0x11439: 84, - 0x1143a: 84, - 0x1143b: 84, - 0x1143c: 84, - 0x1143d: 84, - 0x1143e: 84, - 0x1143f: 84, - 0x11442: 84, - 0x11443: 84, - 0x11444: 84, - 0x11446: 84, - 0x1145e: 84, - 0x114b3: 84, - 0x114b4: 84, - 0x114b5: 84, - 0x114b6: 84, - 0x114b7: 84, - 0x114b8: 84, - 0x114ba: 84, - 0x114bf: 84, - 0x114c0: 84, - 0x114c2: 84, - 0x114c3: 84, - 0x115b2: 84, - 0x115b3: 84, - 0x115b4: 84, - 0x115b5: 84, - 0x115bc: 84, - 0x115bd: 84, - 0x115bf: 84, - 0x115c0: 84, - 0x115dc: 84, - 0x115dd: 84, - 0x11633: 84, - 0x11634: 84, - 0x11635: 84, - 0x11636: 84, - 0x11637: 84, - 0x11638: 84, - 0x11639: 84, - 0x1163a: 84, - 0x1163d: 84, - 0x1163f: 84, - 0x11640: 84, - 0x116ab: 84, - 0x116ad: 84, - 0x116b0: 84, - 0x116b1: 84, - 0x116b2: 84, - 0x116b3: 84, - 0x116b4: 84, - 0x116b5: 84, - 0x116b7: 84, - 0x1171d: 84, - 0x1171e: 84, - 0x1171f: 84, - 0x11722: 84, - 0x11723: 84, - 0x11724: 84, - 0x11725: 84, - 0x11727: 84, - 0x11728: 84, - 0x11729: 84, - 0x1172a: 84, - 0x1172b: 84, - 0x1182f: 84, - 0x11830: 84, - 0x11831: 84, - 0x11832: 84, - 0x11833: 84, - 0x11834: 84, - 0x11835: 84, - 0x11836: 84, - 0x11837: 84, - 0x11839: 84, - 0x1183a: 84, - 0x1193b: 84, - 0x1193c: 84, - 0x1193e: 84, - 0x11943: 84, - 0x119d4: 84, - 0x119d5: 84, - 0x119d6: 84, - 0x119d7: 84, - 0x119da: 84, - 0x119db: 84, - 0x119e0: 84, - 0x11a01: 84, - 0x11a02: 84, - 0x11a03: 84, - 0x11a04: 84, - 0x11a05: 84, - 0x11a06: 84, - 0x11a07: 84, - 0x11a08: 84, - 0x11a09: 84, - 0x11a0a: 84, - 0x11a33: 84, - 0x11a34: 84, - 0x11a35: 84, - 0x11a36: 84, - 0x11a37: 84, - 0x11a38: 84, - 0x11a3b: 84, - 0x11a3c: 84, - 0x11a3d: 84, - 0x11a3e: 84, - 0x11a47: 84, - 0x11a51: 84, - 0x11a52: 84, - 0x11a53: 84, - 0x11a54: 84, - 0x11a55: 84, - 0x11a56: 84, - 0x11a59: 84, - 0x11a5a: 84, - 0x11a5b: 84, - 0x11a8a: 84, - 0x11a8b: 84, - 0x11a8c: 84, - 0x11a8d: 84, - 0x11a8e: 84, - 0x11a8f: 84, - 0x11a90: 84, - 0x11a91: 84, - 0x11a92: 84, - 0x11a93: 84, - 0x11a94: 84, - 0x11a95: 84, - 0x11a96: 84, - 0x11a98: 84, - 0x11a99: 84, - 0x11c30: 84, - 0x11c31: 84, - 0x11c32: 84, - 0x11c33: 84, - 0x11c34: 84, - 0x11c35: 84, - 0x11c36: 84, - 0x11c38: 84, - 0x11c39: 84, - 0x11c3a: 84, - 0x11c3b: 84, - 0x11c3c: 84, - 0x11c3d: 84, - 0x11c3f: 84, - 0x11c92: 84, - 0x11c93: 84, - 0x11c94: 84, - 0x11c95: 84, - 0x11c96: 84, - 0x11c97: 84, - 0x11c98: 84, - 0x11c99: 84, - 0x11c9a: 84, - 0x11c9b: 84, - 0x11c9c: 84, - 0x11c9d: 84, - 0x11c9e: 84, - 0x11c9f: 84, - 0x11ca0: 84, - 0x11ca1: 84, - 0x11ca2: 84, - 0x11ca3: 84, - 0x11ca4: 84, - 0x11ca5: 84, - 0x11ca6: 84, - 0x11ca7: 84, - 0x11caa: 84, - 0x11cab: 84, - 0x11cac: 84, - 0x11cad: 84, - 0x11cae: 84, - 0x11caf: 84, - 0x11cb0: 84, - 0x11cb2: 84, - 0x11cb3: 84, - 0x11cb5: 84, - 0x11cb6: 84, - 0x11d31: 84, - 0x11d32: 84, - 0x11d33: 84, - 0x11d34: 84, - 0x11d35: 84, - 0x11d36: 84, - 0x11d3a: 84, - 0x11d3c: 84, - 0x11d3d: 84, - 0x11d3f: 84, - 0x11d40: 84, - 0x11d41: 84, - 0x11d42: 84, - 0x11d43: 84, - 0x11d44: 84, - 0x11d45: 84, - 0x11d47: 84, - 0x11d90: 84, - 0x11d91: 84, - 0x11d95: 84, - 0x11d97: 84, - 0x11ef3: 84, - 0x11ef4: 84, - 0x11f00: 84, - 0x11f01: 84, - 0x11f36: 84, - 0x11f37: 84, - 0x11f38: 84, - 0x11f39: 84, - 0x11f3a: 84, - 0x11f40: 84, - 0x11f42: 84, - 0x13430: 84, - 0x13431: 84, - 0x13432: 84, - 0x13433: 84, - 0x13434: 84, - 0x13435: 84, - 0x13436: 84, - 0x13437: 84, - 0x13438: 84, - 0x13439: 84, - 0x1343a: 84, - 0x1343b: 84, - 0x1343c: 84, - 0x1343d: 84, - 0x1343e: 84, - 0x1343f: 84, - 0x13440: 84, - 0x13447: 84, - 0x13448: 84, - 0x13449: 84, - 0x1344a: 84, - 0x1344b: 84, - 0x1344c: 84, - 0x1344d: 84, - 0x1344e: 84, - 0x1344f: 84, - 0x13450: 84, - 0x13451: 84, - 0x13452: 84, - 0x13453: 84, - 0x13454: 84, - 0x13455: 84, - 0x16af0: 84, - 0x16af1: 84, - 0x16af2: 84, - 0x16af3: 84, - 0x16af4: 84, - 0x16b30: 84, - 0x16b31: 84, - 0x16b32: 84, - 0x16b33: 84, - 0x16b34: 84, - 0x16b35: 84, - 0x16b36: 84, - 0x16f4f: 84, - 0x16f8f: 84, - 0x16f90: 84, - 0x16f91: 84, - 0x16f92: 84, - 0x16fe4: 84, - 0x1bc9d: 84, - 0x1bc9e: 84, - 0x1bca0: 84, - 0x1bca1: 84, - 0x1bca2: 84, - 0x1bca3: 84, - 0x1cf00: 84, - 0x1cf01: 84, - 0x1cf02: 84, - 0x1cf03: 84, - 0x1cf04: 84, - 0x1cf05: 84, - 0x1cf06: 84, - 0x1cf07: 84, - 0x1cf08: 84, - 0x1cf09: 84, - 0x1cf0a: 84, - 0x1cf0b: 84, - 0x1cf0c: 84, - 0x1cf0d: 84, - 0x1cf0e: 84, - 0x1cf0f: 84, - 0x1cf10: 84, - 0x1cf11: 84, - 0x1cf12: 84, - 0x1cf13: 84, - 0x1cf14: 84, - 0x1cf15: 84, - 0x1cf16: 84, - 0x1cf17: 84, - 0x1cf18: 84, - 0x1cf19: 84, - 0x1cf1a: 84, - 0x1cf1b: 84, - 0x1cf1c: 84, - 0x1cf1d: 84, - 0x1cf1e: 84, - 0x1cf1f: 84, - 0x1cf20: 84, - 0x1cf21: 84, - 0x1cf22: 84, - 0x1cf23: 84, - 0x1cf24: 84, - 0x1cf25: 84, - 0x1cf26: 84, - 0x1cf27: 84, - 0x1cf28: 84, - 0x1cf29: 84, - 0x1cf2a: 84, - 0x1cf2b: 84, - 0x1cf2c: 84, - 0x1cf2d: 84, - 0x1cf30: 84, - 0x1cf31: 84, - 0x1cf32: 84, - 0x1cf33: 84, - 0x1cf34: 84, - 0x1cf35: 84, - 0x1cf36: 84, - 0x1cf37: 84, - 0x1cf38: 84, - 0x1cf39: 84, - 0x1cf3a: 84, - 0x1cf3b: 84, - 0x1cf3c: 84, - 0x1cf3d: 84, - 0x1cf3e: 84, - 0x1cf3f: 84, - 0x1cf40: 84, - 0x1cf41: 84, - 0x1cf42: 84, - 0x1cf43: 84, - 0x1cf44: 84, - 0x1cf45: 84, - 0x1cf46: 84, - 0x1d167: 84, - 0x1d168: 84, - 0x1d169: 84, - 0x1d173: 84, - 0x1d174: 84, - 0x1d175: 84, - 0x1d176: 84, - 0x1d177: 84, - 0x1d178: 84, - 0x1d179: 84, - 0x1d17a: 84, - 0x1d17b: 84, - 0x1d17c: 84, - 0x1d17d: 84, - 0x1d17e: 84, - 0x1d17f: 84, - 0x1d180: 84, - 0x1d181: 84, - 0x1d182: 84, - 0x1d185: 84, - 0x1d186: 84, - 0x1d187: 84, - 0x1d188: 84, - 0x1d189: 84, - 0x1d18a: 84, - 0x1d18b: 84, - 0x1d1aa: 84, - 0x1d1ab: 84, - 0x1d1ac: 84, - 0x1d1ad: 84, - 0x1d242: 84, - 0x1d243: 84, - 0x1d244: 84, - 0x1da00: 84, - 0x1da01: 84, - 0x1da02: 84, - 0x1da03: 84, - 0x1da04: 84, - 0x1da05: 84, - 0x1da06: 84, - 0x1da07: 84, - 0x1da08: 84, - 0x1da09: 84, - 0x1da0a: 84, - 0x1da0b: 84, - 0x1da0c: 84, - 0x1da0d: 84, - 0x1da0e: 84, - 0x1da0f: 84, - 0x1da10: 84, - 0x1da11: 84, - 0x1da12: 84, - 0x1da13: 84, - 0x1da14: 84, - 0x1da15: 84, - 0x1da16: 84, - 0x1da17: 84, - 0x1da18: 84, - 0x1da19: 84, - 0x1da1a: 84, - 0x1da1b: 84, - 0x1da1c: 84, - 0x1da1d: 84, - 0x1da1e: 84, - 0x1da1f: 84, - 0x1da20: 84, - 0x1da21: 84, - 0x1da22: 84, - 0x1da23: 84, - 0x1da24: 84, - 0x1da25: 84, - 0x1da26: 84, - 0x1da27: 84, - 0x1da28: 84, - 0x1da29: 84, - 0x1da2a: 84, - 0x1da2b: 84, - 0x1da2c: 84, - 0x1da2d: 84, - 0x1da2e: 84, - 0x1da2f: 84, - 0x1da30: 84, - 0x1da31: 84, - 0x1da32: 84, - 0x1da33: 84, - 0x1da34: 84, - 0x1da35: 84, - 0x1da36: 84, - 0x1da3b: 84, - 0x1da3c: 84, - 0x1da3d: 84, - 0x1da3e: 84, - 0x1da3f: 84, - 0x1da40: 84, - 0x1da41: 84, - 0x1da42: 84, - 0x1da43: 84, - 0x1da44: 84, - 0x1da45: 84, - 0x1da46: 84, - 0x1da47: 84, - 0x1da48: 84, - 0x1da49: 84, - 0x1da4a: 84, - 0x1da4b: 84, - 0x1da4c: 84, - 0x1da4d: 84, - 0x1da4e: 84, - 0x1da4f: 84, - 0x1da50: 84, - 0x1da51: 84, - 0x1da52: 84, - 0x1da53: 84, - 0x1da54: 84, - 0x1da55: 84, - 0x1da56: 84, - 0x1da57: 84, - 0x1da58: 84, - 0x1da59: 84, - 0x1da5a: 84, - 0x1da5b: 84, - 0x1da5c: 84, - 0x1da5d: 84, - 0x1da5e: 84, - 0x1da5f: 84, - 0x1da60: 84, - 0x1da61: 84, - 0x1da62: 84, - 0x1da63: 84, - 0x1da64: 84, - 0x1da65: 84, - 0x1da66: 84, - 0x1da67: 84, - 0x1da68: 84, - 0x1da69: 84, - 0x1da6a: 84, - 0x1da6b: 84, - 0x1da6c: 84, - 0x1da75: 84, - 0x1da84: 84, - 0x1da9b: 84, - 0x1da9c: 84, - 0x1da9d: 84, - 0x1da9e: 84, - 0x1da9f: 84, - 0x1daa1: 84, - 0x1daa2: 84, - 0x1daa3: 84, - 0x1daa4: 84, - 0x1daa5: 84, - 0x1daa6: 84, - 0x1daa7: 84, - 0x1daa8: 84, - 0x1daa9: 84, - 0x1daaa: 84, - 0x1daab: 84, - 0x1daac: 84, - 0x1daad: 84, - 0x1daae: 84, - 0x1daaf: 84, - 0x1e000: 84, - 0x1e001: 84, - 0x1e002: 84, - 0x1e003: 84, - 0x1e004: 84, - 0x1e005: 84, - 0x1e006: 84, - 0x1e008: 84, - 0x1e009: 84, - 0x1e00a: 84, - 0x1e00b: 84, - 0x1e00c: 84, - 0x1e00d: 84, - 0x1e00e: 84, - 0x1e00f: 84, - 0x1e010: 84, - 0x1e011: 84, - 0x1e012: 84, - 0x1e013: 84, - 0x1e014: 84, - 0x1e015: 84, - 0x1e016: 84, - 0x1e017: 84, - 0x1e018: 84, - 0x1e01b: 84, - 0x1e01c: 84, - 0x1e01d: 84, - 0x1e01e: 84, - 0x1e01f: 84, - 0x1e020: 84, - 0x1e021: 84, - 0x1e023: 84, - 0x1e024: 84, - 0x1e026: 84, - 0x1e027: 84, - 0x1e028: 84, - 0x1e029: 84, - 0x1e02a: 84, - 0x1e08f: 84, - 0x1e130: 84, - 0x1e131: 84, - 0x1e132: 84, - 0x1e133: 84, - 0x1e134: 84, - 0x1e135: 84, - 0x1e136: 84, - 0x1e2ae: 84, - 0x1e2ec: 84, - 0x1e2ed: 84, - 0x1e2ee: 84, - 0x1e2ef: 84, - 0x1e4ec: 84, - 0x1e4ed: 84, - 0x1e4ee: 84, - 0x1e4ef: 84, - 0x1e8d0: 84, - 0x1e8d1: 84, - 0x1e8d2: 84, - 0x1e8d3: 84, - 0x1e8d4: 84, - 0x1e8d5: 84, - 0x1e8d6: 84, - 0x1e900: 68, - 0x1e901: 68, - 0x1e902: 68, - 0x1e903: 68, - 0x1e904: 68, - 0x1e905: 68, - 0x1e906: 68, - 0x1e907: 68, - 0x1e908: 68, - 0x1e909: 68, - 0x1e90a: 68, - 0x1e90b: 68, - 0x1e90c: 68, - 0x1e90d: 68, - 0x1e90e: 68, - 0x1e90f: 68, - 0x1e910: 68, - 0x1e911: 68, - 0x1e912: 68, - 0x1e913: 68, - 0x1e914: 68, - 0x1e915: 68, - 0x1e916: 68, - 0x1e917: 68, - 0x1e918: 68, - 0x1e919: 68, - 0x1e91a: 68, - 0x1e91b: 68, - 0x1e91c: 68, - 0x1e91d: 68, - 0x1e91e: 68, - 0x1e91f: 68, - 0x1e920: 68, - 0x1e921: 68, - 0x1e922: 68, - 0x1e923: 68, - 0x1e924: 68, - 0x1e925: 68, - 0x1e926: 68, - 0x1e927: 68, - 0x1e928: 68, - 0x1e929: 68, - 0x1e92a: 68, - 0x1e92b: 68, - 0x1e92c: 68, - 0x1e92d: 68, - 0x1e92e: 68, - 0x1e92f: 68, - 0x1e930: 68, - 0x1e931: 68, - 0x1e932: 68, - 0x1e933: 68, - 0x1e934: 68, - 0x1e935: 68, - 0x1e936: 68, - 0x1e937: 68, - 0x1e938: 68, - 0x1e939: 68, - 0x1e93a: 68, - 0x1e93b: 68, - 0x1e93c: 68, - 0x1e93d: 68, - 0x1e93e: 68, - 0x1e93f: 68, - 0x1e940: 68, - 0x1e941: 68, - 0x1e942: 68, - 0x1e943: 68, - 0x1e944: 84, - 0x1e945: 84, - 0x1e946: 84, - 0x1e947: 84, - 0x1e948: 84, - 0x1e949: 84, - 0x1e94a: 84, - 0x1e94b: 84, - 0xe0001: 84, - 0xe0020: 84, - 0xe0021: 84, - 0xe0022: 84, - 0xe0023: 84, - 0xe0024: 84, - 0xe0025: 84, - 0xe0026: 84, - 0xe0027: 84, - 0xe0028: 84, - 0xe0029: 84, - 0xe002a: 84, - 0xe002b: 84, - 0xe002c: 84, - 0xe002d: 84, - 0xe002e: 84, - 0xe002f: 84, - 0xe0030: 84, - 0xe0031: 84, - 0xe0032: 84, - 0xe0033: 84, - 0xe0034: 84, - 0xe0035: 84, - 0xe0036: 84, - 0xe0037: 84, - 0xe0038: 84, - 0xe0039: 84, - 0xe003a: 84, - 0xe003b: 84, - 0xe003c: 84, - 0xe003d: 84, - 0xe003e: 84, - 0xe003f: 84, - 0xe0040: 84, - 0xe0041: 84, - 0xe0042: 84, - 0xe0043: 84, - 0xe0044: 84, - 0xe0045: 84, - 0xe0046: 84, - 0xe0047: 84, - 0xe0048: 84, - 0xe0049: 84, - 0xe004a: 84, - 0xe004b: 84, - 0xe004c: 84, - 0xe004d: 84, - 0xe004e: 84, - 0xe004f: 84, - 0xe0050: 84, - 0xe0051: 84, - 0xe0052: 84, - 0xe0053: 84, - 0xe0054: 84, - 0xe0055: 84, - 0xe0056: 84, - 0xe0057: 84, - 0xe0058: 84, - 0xe0059: 84, - 0xe005a: 84, - 0xe005b: 84, - 0xe005c: 84, - 0xe005d: 84, - 0xe005e: 84, - 0xe005f: 84, - 0xe0060: 84, - 0xe0061: 84, - 0xe0062: 84, - 0xe0063: 84, - 0xe0064: 84, - 0xe0065: 84, - 0xe0066: 84, - 0xe0067: 84, - 0xe0068: 84, - 0xe0069: 84, - 0xe006a: 84, - 0xe006b: 84, - 0xe006c: 84, - 0xe006d: 84, - 0xe006e: 84, - 0xe006f: 84, - 0xe0070: 84, - 0xe0071: 84, - 0xe0072: 84, - 0xe0073: 84, - 0xe0074: 84, - 0xe0075: 84, - 0xe0076: 84, - 0xe0077: 84, - 0xe0078: 84, - 0xe0079: 84, - 0xe007a: 84, - 0xe007b: 84, - 0xe007c: 84, - 0xe007d: 84, - 0xe007e: 84, - 0xe007f: 84, - 0xe0100: 84, - 0xe0101: 84, - 0xe0102: 84, - 0xe0103: 84, - 0xe0104: 84, - 0xe0105: 84, - 0xe0106: 84, - 0xe0107: 84, - 0xe0108: 84, - 0xe0109: 84, - 0xe010a: 84, - 0xe010b: 84, - 0xe010c: 84, - 0xe010d: 84, - 0xe010e: 84, - 0xe010f: 84, - 0xe0110: 84, - 0xe0111: 84, - 0xe0112: 84, - 0xe0113: 84, - 0xe0114: 84, - 0xe0115: 84, - 0xe0116: 84, - 0xe0117: 84, - 0xe0118: 84, - 0xe0119: 84, - 0xe011a: 84, - 0xe011b: 84, - 0xe011c: 84, - 0xe011d: 84, - 0xe011e: 84, - 0xe011f: 84, - 0xe0120: 84, - 0xe0121: 84, - 0xe0122: 84, - 0xe0123: 84, - 0xe0124: 84, - 0xe0125: 84, - 0xe0126: 84, - 0xe0127: 84, - 0xe0128: 84, - 0xe0129: 84, - 0xe012a: 84, - 0xe012b: 84, - 0xe012c: 84, - 0xe012d: 84, - 0xe012e: 84, - 0xe012f: 84, - 0xe0130: 84, - 0xe0131: 84, - 0xe0132: 84, - 0xe0133: 84, - 0xe0134: 84, - 0xe0135: 84, - 0xe0136: 84, - 0xe0137: 84, - 0xe0138: 84, - 0xe0139: 84, - 0xe013a: 84, - 0xe013b: 84, - 0xe013c: 84, - 0xe013d: 84, - 0xe013e: 84, - 0xe013f: 84, - 0xe0140: 84, - 0xe0141: 84, - 0xe0142: 84, - 0xe0143: 84, - 0xe0144: 84, - 0xe0145: 84, - 0xe0146: 84, - 0xe0147: 84, - 0xe0148: 84, - 0xe0149: 84, - 0xe014a: 84, - 0xe014b: 84, - 0xe014c: 84, - 0xe014d: 84, - 0xe014e: 84, - 0xe014f: 84, - 0xe0150: 84, - 0xe0151: 84, - 0xe0152: 84, - 0xe0153: 84, - 0xe0154: 84, - 0xe0155: 84, - 0xe0156: 84, - 0xe0157: 84, - 0xe0158: 84, - 0xe0159: 84, - 0xe015a: 84, - 0xe015b: 84, - 0xe015c: 84, - 0xe015d: 84, - 0xe015e: 84, - 0xe015f: 84, - 0xe0160: 84, - 0xe0161: 84, - 0xe0162: 84, - 0xe0163: 84, - 0xe0164: 84, - 0xe0165: 84, - 0xe0166: 84, - 0xe0167: 84, - 0xe0168: 84, - 0xe0169: 84, - 0xe016a: 84, - 0xe016b: 84, - 0xe016c: 84, - 0xe016d: 84, - 0xe016e: 84, - 0xe016f: 84, - 0xe0170: 84, - 0xe0171: 84, - 0xe0172: 84, - 0xe0173: 84, - 0xe0174: 84, - 0xe0175: 84, - 0xe0176: 84, - 0xe0177: 84, - 0xe0178: 84, - 0xe0179: 84, - 0xe017a: 84, - 0xe017b: 84, - 0xe017c: 84, - 0xe017d: 84, - 0xe017e: 84, - 0xe017f: 84, - 0xe0180: 84, - 0xe0181: 84, - 0xe0182: 84, - 0xe0183: 84, - 0xe0184: 84, - 0xe0185: 84, - 0xe0186: 84, - 0xe0187: 84, - 0xe0188: 84, - 0xe0189: 84, - 0xe018a: 84, - 0xe018b: 84, - 0xe018c: 84, - 0xe018d: 84, - 0xe018e: 84, - 0xe018f: 84, - 0xe0190: 84, - 0xe0191: 84, - 0xe0192: 84, - 0xe0193: 84, - 0xe0194: 84, - 0xe0195: 84, - 0xe0196: 84, - 0xe0197: 84, - 0xe0198: 84, - 0xe0199: 84, - 0xe019a: 84, - 0xe019b: 84, - 0xe019c: 84, - 0xe019d: 84, - 0xe019e: 84, - 0xe019f: 84, - 0xe01a0: 84, - 0xe01a1: 84, - 0xe01a2: 84, - 0xe01a3: 84, - 0xe01a4: 84, - 0xe01a5: 84, - 0xe01a6: 84, - 0xe01a7: 84, - 0xe01a8: 84, - 0xe01a9: 84, - 0xe01aa: 84, - 0xe01ab: 84, - 0xe01ac: 84, - 0xe01ad: 84, - 0xe01ae: 84, - 0xe01af: 84, - 0xe01b0: 84, - 0xe01b1: 84, - 0xe01b2: 84, - 0xe01b3: 84, - 0xe01b4: 84, - 0xe01b5: 84, - 0xe01b6: 84, - 0xe01b7: 84, - 0xe01b8: 84, - 0xe01b9: 84, - 0xe01ba: 84, - 0xe01bb: 84, - 0xe01bc: 84, - 0xe01bd: 84, - 0xe01be: 84, - 0xe01bf: 84, - 0xe01c0: 84, - 0xe01c1: 84, - 0xe01c2: 84, - 0xe01c3: 84, - 0xe01c4: 84, - 0xe01c5: 84, - 0xe01c6: 84, - 0xe01c7: 84, - 0xe01c8: 84, - 0xe01c9: 84, - 0xe01ca: 84, - 0xe01cb: 84, - 0xe01cc: 84, - 0xe01cd: 84, - 0xe01ce: 84, - 0xe01cf: 84, - 0xe01d0: 84, - 0xe01d1: 84, - 0xe01d2: 84, - 0xe01d3: 84, - 0xe01d4: 84, - 0xe01d5: 84, - 0xe01d6: 84, - 0xe01d7: 84, - 0xe01d8: 84, - 0xe01d9: 84, - 0xe01da: 84, - 0xe01db: 84, - 0xe01dc: 84, - 0xe01dd: 84, - 0xe01de: 84, - 0xe01df: 84, - 0xe01e0: 84, - 0xe01e1: 84, - 0xe01e2: 84, - 0xe01e3: 84, - 0xe01e4: 84, - 0xe01e5: 84, - 0xe01e6: 84, - 0xe01e7: 84, - 0xe01e8: 84, - 0xe01e9: 84, - 0xe01ea: 84, - 0xe01eb: 84, - 0xe01ec: 84, - 0xe01ed: 84, - 0xe01ee: 84, - 0xe01ef: 84, -} -codepoint_classes = { - 'PVALID': ( - 0x2d0000002e, - 0x300000003a, - 0x610000007b, - 0xdf000000f7, - 0xf800000100, - 0x10100000102, - 0x10300000104, - 0x10500000106, - 0x10700000108, - 0x1090000010a, - 0x10b0000010c, - 0x10d0000010e, - 0x10f00000110, - 0x11100000112, - 0x11300000114, - 0x11500000116, - 0x11700000118, - 0x1190000011a, - 0x11b0000011c, - 0x11d0000011e, - 0x11f00000120, - 0x12100000122, - 0x12300000124, - 0x12500000126, - 0x12700000128, - 0x1290000012a, - 0x12b0000012c, - 0x12d0000012e, - 0x12f00000130, - 0x13100000132, - 0x13500000136, - 0x13700000139, - 0x13a0000013b, - 0x13c0000013d, - 0x13e0000013f, - 0x14200000143, - 0x14400000145, - 0x14600000147, - 0x14800000149, - 0x14b0000014c, - 0x14d0000014e, - 0x14f00000150, - 0x15100000152, - 0x15300000154, - 0x15500000156, - 0x15700000158, - 0x1590000015a, - 0x15b0000015c, - 0x15d0000015e, - 0x15f00000160, - 0x16100000162, - 0x16300000164, - 0x16500000166, - 0x16700000168, - 0x1690000016a, - 0x16b0000016c, - 0x16d0000016e, - 0x16f00000170, - 0x17100000172, - 0x17300000174, - 0x17500000176, - 0x17700000178, - 0x17a0000017b, - 0x17c0000017d, - 0x17e0000017f, - 0x18000000181, - 0x18300000184, - 0x18500000186, - 0x18800000189, - 0x18c0000018e, - 0x19200000193, - 0x19500000196, - 0x1990000019c, - 0x19e0000019f, - 0x1a1000001a2, - 0x1a3000001a4, - 0x1a5000001a6, - 0x1a8000001a9, - 0x1aa000001ac, - 0x1ad000001ae, - 0x1b0000001b1, - 0x1b4000001b5, - 0x1b6000001b7, - 0x1b9000001bc, - 0x1bd000001c4, - 0x1ce000001cf, - 0x1d0000001d1, - 0x1d2000001d3, - 0x1d4000001d5, - 0x1d6000001d7, - 0x1d8000001d9, - 0x1da000001db, - 0x1dc000001de, - 0x1df000001e0, - 0x1e1000001e2, - 0x1e3000001e4, - 0x1e5000001e6, - 0x1e7000001e8, - 0x1e9000001ea, - 0x1eb000001ec, - 0x1ed000001ee, - 0x1ef000001f1, - 0x1f5000001f6, - 0x1f9000001fa, - 0x1fb000001fc, - 0x1fd000001fe, - 0x1ff00000200, - 0x20100000202, - 0x20300000204, - 0x20500000206, - 0x20700000208, - 0x2090000020a, - 0x20b0000020c, - 0x20d0000020e, - 0x20f00000210, - 0x21100000212, - 0x21300000214, - 0x21500000216, - 0x21700000218, - 0x2190000021a, - 0x21b0000021c, - 0x21d0000021e, - 0x21f00000220, - 0x22100000222, - 0x22300000224, - 0x22500000226, - 0x22700000228, - 0x2290000022a, - 0x22b0000022c, - 0x22d0000022e, - 0x22f00000230, - 0x23100000232, - 0x2330000023a, - 0x23c0000023d, - 0x23f00000241, - 0x24200000243, - 0x24700000248, - 0x2490000024a, - 0x24b0000024c, - 0x24d0000024e, - 0x24f000002b0, - 0x2b9000002c2, - 0x2c6000002d2, - 0x2ec000002ed, - 0x2ee000002ef, - 0x30000000340, - 0x34200000343, - 0x3460000034f, - 0x35000000370, - 0x37100000372, - 0x37300000374, - 0x37700000378, - 0x37b0000037e, - 0x39000000391, - 0x3ac000003cf, - 0x3d7000003d8, - 0x3d9000003da, - 0x3db000003dc, - 0x3dd000003de, - 0x3df000003e0, - 0x3e1000003e2, - 0x3e3000003e4, - 0x3e5000003e6, - 0x3e7000003e8, - 0x3e9000003ea, - 0x3eb000003ec, - 0x3ed000003ee, - 0x3ef000003f0, - 0x3f3000003f4, - 0x3f8000003f9, - 0x3fb000003fd, - 0x43000000460, - 0x46100000462, - 0x46300000464, - 0x46500000466, - 0x46700000468, - 0x4690000046a, - 0x46b0000046c, - 0x46d0000046e, - 0x46f00000470, - 0x47100000472, - 0x47300000474, - 0x47500000476, - 0x47700000478, - 0x4790000047a, - 0x47b0000047c, - 0x47d0000047e, - 0x47f00000480, - 0x48100000482, - 0x48300000488, - 0x48b0000048c, - 0x48d0000048e, - 0x48f00000490, - 0x49100000492, - 0x49300000494, - 0x49500000496, - 0x49700000498, - 0x4990000049a, - 0x49b0000049c, - 0x49d0000049e, - 0x49f000004a0, - 0x4a1000004a2, - 0x4a3000004a4, - 0x4a5000004a6, - 0x4a7000004a8, - 0x4a9000004aa, - 0x4ab000004ac, - 0x4ad000004ae, - 0x4af000004b0, - 0x4b1000004b2, - 0x4b3000004b4, - 0x4b5000004b6, - 0x4b7000004b8, - 0x4b9000004ba, - 0x4bb000004bc, - 0x4bd000004be, - 0x4bf000004c0, - 0x4c2000004c3, - 0x4c4000004c5, - 0x4c6000004c7, - 0x4c8000004c9, - 0x4ca000004cb, - 0x4cc000004cd, - 0x4ce000004d0, - 0x4d1000004d2, - 0x4d3000004d4, - 0x4d5000004d6, - 0x4d7000004d8, - 0x4d9000004da, - 0x4db000004dc, - 0x4dd000004de, - 0x4df000004e0, - 0x4e1000004e2, - 0x4e3000004e4, - 0x4e5000004e6, - 0x4e7000004e8, - 0x4e9000004ea, - 0x4eb000004ec, - 0x4ed000004ee, - 0x4ef000004f0, - 0x4f1000004f2, - 0x4f3000004f4, - 0x4f5000004f6, - 0x4f7000004f8, - 0x4f9000004fa, - 0x4fb000004fc, - 0x4fd000004fe, - 0x4ff00000500, - 0x50100000502, - 0x50300000504, - 0x50500000506, - 0x50700000508, - 0x5090000050a, - 0x50b0000050c, - 0x50d0000050e, - 0x50f00000510, - 0x51100000512, - 0x51300000514, - 0x51500000516, - 0x51700000518, - 0x5190000051a, - 0x51b0000051c, - 0x51d0000051e, - 0x51f00000520, - 0x52100000522, - 0x52300000524, - 0x52500000526, - 0x52700000528, - 0x5290000052a, - 0x52b0000052c, - 0x52d0000052e, - 0x52f00000530, - 0x5590000055a, - 0x56000000587, - 0x58800000589, - 0x591000005be, - 0x5bf000005c0, - 0x5c1000005c3, - 0x5c4000005c6, - 0x5c7000005c8, - 0x5d0000005eb, - 0x5ef000005f3, - 0x6100000061b, - 0x62000000640, - 0x64100000660, - 0x66e00000675, - 0x679000006d4, - 0x6d5000006dd, - 0x6df000006e9, - 0x6ea000006f0, - 0x6fa00000700, - 0x7100000074b, - 0x74d000007b2, - 0x7c0000007f6, - 0x7fd000007fe, - 0x8000000082e, - 0x8400000085c, - 0x8600000086b, - 0x87000000888, - 0x8890000088f, - 0x898000008e2, - 0x8e300000958, - 0x96000000964, - 0x96600000970, - 0x97100000984, - 0x9850000098d, - 0x98f00000991, - 0x993000009a9, - 0x9aa000009b1, - 0x9b2000009b3, - 0x9b6000009ba, - 0x9bc000009c5, - 0x9c7000009c9, - 0x9cb000009cf, - 0x9d7000009d8, - 0x9e0000009e4, - 0x9e6000009f2, - 0x9fc000009fd, - 0x9fe000009ff, - 0xa0100000a04, - 0xa0500000a0b, - 0xa0f00000a11, - 0xa1300000a29, - 0xa2a00000a31, - 0xa3200000a33, - 0xa3500000a36, - 0xa3800000a3a, - 0xa3c00000a3d, - 0xa3e00000a43, - 0xa4700000a49, - 0xa4b00000a4e, - 0xa5100000a52, - 0xa5c00000a5d, - 0xa6600000a76, - 0xa8100000a84, - 0xa8500000a8e, - 0xa8f00000a92, - 0xa9300000aa9, - 0xaaa00000ab1, - 0xab200000ab4, - 0xab500000aba, - 0xabc00000ac6, - 0xac700000aca, - 0xacb00000ace, - 0xad000000ad1, - 0xae000000ae4, - 0xae600000af0, - 0xaf900000b00, - 0xb0100000b04, - 0xb0500000b0d, - 0xb0f00000b11, - 0xb1300000b29, - 0xb2a00000b31, - 0xb3200000b34, - 0xb3500000b3a, - 0xb3c00000b45, - 0xb4700000b49, - 0xb4b00000b4e, - 0xb5500000b58, - 0xb5f00000b64, - 0xb6600000b70, - 0xb7100000b72, - 0xb8200000b84, - 0xb8500000b8b, - 0xb8e00000b91, - 0xb9200000b96, - 0xb9900000b9b, - 0xb9c00000b9d, - 0xb9e00000ba0, - 0xba300000ba5, - 0xba800000bab, - 0xbae00000bba, - 0xbbe00000bc3, - 0xbc600000bc9, - 0xbca00000bce, - 0xbd000000bd1, - 0xbd700000bd8, - 0xbe600000bf0, - 0xc0000000c0d, - 0xc0e00000c11, - 0xc1200000c29, - 0xc2a00000c3a, - 0xc3c00000c45, - 0xc4600000c49, - 0xc4a00000c4e, - 0xc5500000c57, - 0xc5800000c5b, - 0xc5d00000c5e, - 0xc6000000c64, - 0xc6600000c70, - 0xc8000000c84, - 0xc8500000c8d, - 0xc8e00000c91, - 0xc9200000ca9, - 0xcaa00000cb4, - 0xcb500000cba, - 0xcbc00000cc5, - 0xcc600000cc9, - 0xcca00000cce, - 0xcd500000cd7, - 0xcdd00000cdf, - 0xce000000ce4, - 0xce600000cf0, - 0xcf100000cf4, - 0xd0000000d0d, - 0xd0e00000d11, - 0xd1200000d45, - 0xd4600000d49, - 0xd4a00000d4f, - 0xd5400000d58, - 0xd5f00000d64, - 0xd6600000d70, - 0xd7a00000d80, - 0xd8100000d84, - 0xd8500000d97, - 0xd9a00000db2, - 0xdb300000dbc, - 0xdbd00000dbe, - 0xdc000000dc7, - 0xdca00000dcb, - 0xdcf00000dd5, - 0xdd600000dd7, - 0xdd800000de0, - 0xde600000df0, - 0xdf200000df4, - 0xe0100000e33, - 0xe3400000e3b, - 0xe4000000e4f, - 0xe5000000e5a, - 0xe8100000e83, - 0xe8400000e85, - 0xe8600000e8b, - 0xe8c00000ea4, - 0xea500000ea6, - 0xea700000eb3, - 0xeb400000ebe, - 0xec000000ec5, - 0xec600000ec7, - 0xec800000ecf, - 0xed000000eda, - 0xede00000ee0, - 0xf0000000f01, - 0xf0b00000f0c, - 0xf1800000f1a, - 0xf2000000f2a, - 0xf3500000f36, - 0xf3700000f38, - 0xf3900000f3a, - 0xf3e00000f43, - 0xf4400000f48, - 0xf4900000f4d, - 0xf4e00000f52, - 0xf5300000f57, - 0xf5800000f5c, - 0xf5d00000f69, - 0xf6a00000f6d, - 0xf7100000f73, - 0xf7400000f75, - 0xf7a00000f81, - 0xf8200000f85, - 0xf8600000f93, - 0xf9400000f98, - 0xf9900000f9d, - 0xf9e00000fa2, - 0xfa300000fa7, - 0xfa800000fac, - 0xfad00000fb9, - 0xfba00000fbd, - 0xfc600000fc7, - 0x10000000104a, - 0x10500000109e, - 0x10d0000010fb, - 0x10fd00001100, - 0x120000001249, - 0x124a0000124e, - 0x125000001257, - 0x125800001259, - 0x125a0000125e, - 0x126000001289, - 0x128a0000128e, - 0x1290000012b1, - 0x12b2000012b6, - 0x12b8000012bf, - 0x12c0000012c1, - 0x12c2000012c6, - 0x12c8000012d7, - 0x12d800001311, - 0x131200001316, - 0x13180000135b, - 0x135d00001360, - 0x138000001390, - 0x13a0000013f6, - 0x14010000166d, - 0x166f00001680, - 0x16810000169b, - 0x16a0000016eb, - 0x16f1000016f9, - 0x170000001716, - 0x171f00001735, - 0x174000001754, - 0x17600000176d, - 0x176e00001771, - 0x177200001774, - 0x1780000017b4, - 0x17b6000017d4, - 0x17d7000017d8, - 0x17dc000017de, - 0x17e0000017ea, - 0x18100000181a, - 0x182000001879, - 0x1880000018ab, - 0x18b0000018f6, - 0x19000000191f, - 0x19200000192c, - 0x19300000193c, - 0x19460000196e, - 0x197000001975, - 0x1980000019ac, - 0x19b0000019ca, - 0x19d0000019da, - 0x1a0000001a1c, - 0x1a2000001a5f, - 0x1a6000001a7d, - 0x1a7f00001a8a, - 0x1a9000001a9a, - 0x1aa700001aa8, - 0x1ab000001abe, - 0x1abf00001acf, - 0x1b0000001b4d, - 0x1b5000001b5a, - 0x1b6b00001b74, - 0x1b8000001bf4, - 0x1c0000001c38, - 0x1c4000001c4a, - 0x1c4d00001c7e, - 0x1cd000001cd3, - 0x1cd400001cfb, - 0x1d0000001d2c, - 0x1d2f00001d30, - 0x1d3b00001d3c, - 0x1d4e00001d4f, - 0x1d6b00001d78, - 0x1d7900001d9b, - 0x1dc000001e00, - 0x1e0100001e02, - 0x1e0300001e04, - 0x1e0500001e06, - 0x1e0700001e08, - 0x1e0900001e0a, - 0x1e0b00001e0c, - 0x1e0d00001e0e, - 0x1e0f00001e10, - 0x1e1100001e12, - 0x1e1300001e14, - 0x1e1500001e16, - 0x1e1700001e18, - 0x1e1900001e1a, - 0x1e1b00001e1c, - 0x1e1d00001e1e, - 0x1e1f00001e20, - 0x1e2100001e22, - 0x1e2300001e24, - 0x1e2500001e26, - 0x1e2700001e28, - 0x1e2900001e2a, - 0x1e2b00001e2c, - 0x1e2d00001e2e, - 0x1e2f00001e30, - 0x1e3100001e32, - 0x1e3300001e34, - 0x1e3500001e36, - 0x1e3700001e38, - 0x1e3900001e3a, - 0x1e3b00001e3c, - 0x1e3d00001e3e, - 0x1e3f00001e40, - 0x1e4100001e42, - 0x1e4300001e44, - 0x1e4500001e46, - 0x1e4700001e48, - 0x1e4900001e4a, - 0x1e4b00001e4c, - 0x1e4d00001e4e, - 0x1e4f00001e50, - 0x1e5100001e52, - 0x1e5300001e54, - 0x1e5500001e56, - 0x1e5700001e58, - 0x1e5900001e5a, - 0x1e5b00001e5c, - 0x1e5d00001e5e, - 0x1e5f00001e60, - 0x1e6100001e62, - 0x1e6300001e64, - 0x1e6500001e66, - 0x1e6700001e68, - 0x1e6900001e6a, - 0x1e6b00001e6c, - 0x1e6d00001e6e, - 0x1e6f00001e70, - 0x1e7100001e72, - 0x1e7300001e74, - 0x1e7500001e76, - 0x1e7700001e78, - 0x1e7900001e7a, - 0x1e7b00001e7c, - 0x1e7d00001e7e, - 0x1e7f00001e80, - 0x1e8100001e82, - 0x1e8300001e84, - 0x1e8500001e86, - 0x1e8700001e88, - 0x1e8900001e8a, - 0x1e8b00001e8c, - 0x1e8d00001e8e, - 0x1e8f00001e90, - 0x1e9100001e92, - 0x1e9300001e94, - 0x1e9500001e9a, - 0x1e9c00001e9e, - 0x1e9f00001ea0, - 0x1ea100001ea2, - 0x1ea300001ea4, - 0x1ea500001ea6, - 0x1ea700001ea8, - 0x1ea900001eaa, - 0x1eab00001eac, - 0x1ead00001eae, - 0x1eaf00001eb0, - 0x1eb100001eb2, - 0x1eb300001eb4, - 0x1eb500001eb6, - 0x1eb700001eb8, - 0x1eb900001eba, - 0x1ebb00001ebc, - 0x1ebd00001ebe, - 0x1ebf00001ec0, - 0x1ec100001ec2, - 0x1ec300001ec4, - 0x1ec500001ec6, - 0x1ec700001ec8, - 0x1ec900001eca, - 0x1ecb00001ecc, - 0x1ecd00001ece, - 0x1ecf00001ed0, - 0x1ed100001ed2, - 0x1ed300001ed4, - 0x1ed500001ed6, - 0x1ed700001ed8, - 0x1ed900001eda, - 0x1edb00001edc, - 0x1edd00001ede, - 0x1edf00001ee0, - 0x1ee100001ee2, - 0x1ee300001ee4, - 0x1ee500001ee6, - 0x1ee700001ee8, - 0x1ee900001eea, - 0x1eeb00001eec, - 0x1eed00001eee, - 0x1eef00001ef0, - 0x1ef100001ef2, - 0x1ef300001ef4, - 0x1ef500001ef6, - 0x1ef700001ef8, - 0x1ef900001efa, - 0x1efb00001efc, - 0x1efd00001efe, - 0x1eff00001f08, - 0x1f1000001f16, - 0x1f2000001f28, - 0x1f3000001f38, - 0x1f4000001f46, - 0x1f5000001f58, - 0x1f6000001f68, - 0x1f7000001f71, - 0x1f7200001f73, - 0x1f7400001f75, - 0x1f7600001f77, - 0x1f7800001f79, - 0x1f7a00001f7b, - 0x1f7c00001f7d, - 0x1fb000001fb2, - 0x1fb600001fb7, - 0x1fc600001fc7, - 0x1fd000001fd3, - 0x1fd600001fd8, - 0x1fe000001fe3, - 0x1fe400001fe8, - 0x1ff600001ff7, - 0x214e0000214f, - 0x218400002185, - 0x2c3000002c60, - 0x2c6100002c62, - 0x2c6500002c67, - 0x2c6800002c69, - 0x2c6a00002c6b, - 0x2c6c00002c6d, - 0x2c7100002c72, - 0x2c7300002c75, - 0x2c7600002c7c, - 0x2c8100002c82, - 0x2c8300002c84, - 0x2c8500002c86, - 0x2c8700002c88, - 0x2c8900002c8a, - 0x2c8b00002c8c, - 0x2c8d00002c8e, - 0x2c8f00002c90, - 0x2c9100002c92, - 0x2c9300002c94, - 0x2c9500002c96, - 0x2c9700002c98, - 0x2c9900002c9a, - 0x2c9b00002c9c, - 0x2c9d00002c9e, - 0x2c9f00002ca0, - 0x2ca100002ca2, - 0x2ca300002ca4, - 0x2ca500002ca6, - 0x2ca700002ca8, - 0x2ca900002caa, - 0x2cab00002cac, - 0x2cad00002cae, - 0x2caf00002cb0, - 0x2cb100002cb2, - 0x2cb300002cb4, - 0x2cb500002cb6, - 0x2cb700002cb8, - 0x2cb900002cba, - 0x2cbb00002cbc, - 0x2cbd00002cbe, - 0x2cbf00002cc0, - 0x2cc100002cc2, - 0x2cc300002cc4, - 0x2cc500002cc6, - 0x2cc700002cc8, - 0x2cc900002cca, - 0x2ccb00002ccc, - 0x2ccd00002cce, - 0x2ccf00002cd0, - 0x2cd100002cd2, - 0x2cd300002cd4, - 0x2cd500002cd6, - 0x2cd700002cd8, - 0x2cd900002cda, - 0x2cdb00002cdc, - 0x2cdd00002cde, - 0x2cdf00002ce0, - 0x2ce100002ce2, - 0x2ce300002ce5, - 0x2cec00002ced, - 0x2cee00002cf2, - 0x2cf300002cf4, - 0x2d0000002d26, - 0x2d2700002d28, - 0x2d2d00002d2e, - 0x2d3000002d68, - 0x2d7f00002d97, - 0x2da000002da7, - 0x2da800002daf, - 0x2db000002db7, - 0x2db800002dbf, - 0x2dc000002dc7, - 0x2dc800002dcf, - 0x2dd000002dd7, - 0x2dd800002ddf, - 0x2de000002e00, - 0x2e2f00002e30, - 0x300500003008, - 0x302a0000302e, - 0x303c0000303d, - 0x304100003097, - 0x30990000309b, - 0x309d0000309f, - 0x30a1000030fb, - 0x30fc000030ff, - 0x310500003130, - 0x31a0000031c0, - 0x31f000003200, - 0x340000004dc0, - 0x4e000000a48d, - 0xa4d00000a4fe, - 0xa5000000a60d, - 0xa6100000a62c, - 0xa6410000a642, - 0xa6430000a644, - 0xa6450000a646, - 0xa6470000a648, - 0xa6490000a64a, - 0xa64b0000a64c, - 0xa64d0000a64e, - 0xa64f0000a650, - 0xa6510000a652, - 0xa6530000a654, - 0xa6550000a656, - 0xa6570000a658, - 0xa6590000a65a, - 0xa65b0000a65c, - 0xa65d0000a65e, - 0xa65f0000a660, - 0xa6610000a662, - 0xa6630000a664, - 0xa6650000a666, - 0xa6670000a668, - 0xa6690000a66a, - 0xa66b0000a66c, - 0xa66d0000a670, - 0xa6740000a67e, - 0xa67f0000a680, - 0xa6810000a682, - 0xa6830000a684, - 0xa6850000a686, - 0xa6870000a688, - 0xa6890000a68a, - 0xa68b0000a68c, - 0xa68d0000a68e, - 0xa68f0000a690, - 0xa6910000a692, - 0xa6930000a694, - 0xa6950000a696, - 0xa6970000a698, - 0xa6990000a69a, - 0xa69b0000a69c, - 0xa69e0000a6e6, - 0xa6f00000a6f2, - 0xa7170000a720, - 0xa7230000a724, - 0xa7250000a726, - 0xa7270000a728, - 0xa7290000a72a, - 0xa72b0000a72c, - 0xa72d0000a72e, - 0xa72f0000a732, - 0xa7330000a734, - 0xa7350000a736, - 0xa7370000a738, - 0xa7390000a73a, - 0xa73b0000a73c, - 0xa73d0000a73e, - 0xa73f0000a740, - 0xa7410000a742, - 0xa7430000a744, - 0xa7450000a746, - 0xa7470000a748, - 0xa7490000a74a, - 0xa74b0000a74c, - 0xa74d0000a74e, - 0xa74f0000a750, - 0xa7510000a752, - 0xa7530000a754, - 0xa7550000a756, - 0xa7570000a758, - 0xa7590000a75a, - 0xa75b0000a75c, - 0xa75d0000a75e, - 0xa75f0000a760, - 0xa7610000a762, - 0xa7630000a764, - 0xa7650000a766, - 0xa7670000a768, - 0xa7690000a76a, - 0xa76b0000a76c, - 0xa76d0000a76e, - 0xa76f0000a770, - 0xa7710000a779, - 0xa77a0000a77b, - 0xa77c0000a77d, - 0xa77f0000a780, - 0xa7810000a782, - 0xa7830000a784, - 0xa7850000a786, - 0xa7870000a789, - 0xa78c0000a78d, - 0xa78e0000a790, - 0xa7910000a792, - 0xa7930000a796, - 0xa7970000a798, - 0xa7990000a79a, - 0xa79b0000a79c, - 0xa79d0000a79e, - 0xa79f0000a7a0, - 0xa7a10000a7a2, - 0xa7a30000a7a4, - 0xa7a50000a7a6, - 0xa7a70000a7a8, - 0xa7a90000a7aa, - 0xa7af0000a7b0, - 0xa7b50000a7b6, - 0xa7b70000a7b8, - 0xa7b90000a7ba, - 0xa7bb0000a7bc, - 0xa7bd0000a7be, - 0xa7bf0000a7c0, - 0xa7c10000a7c2, - 0xa7c30000a7c4, - 0xa7c80000a7c9, - 0xa7ca0000a7cb, - 0xa7d10000a7d2, - 0xa7d30000a7d4, - 0xa7d50000a7d6, - 0xa7d70000a7d8, - 0xa7d90000a7da, - 0xa7f60000a7f8, - 0xa7fa0000a828, - 0xa82c0000a82d, - 0xa8400000a874, - 0xa8800000a8c6, - 0xa8d00000a8da, - 0xa8e00000a8f8, - 0xa8fb0000a8fc, - 0xa8fd0000a92e, - 0xa9300000a954, - 0xa9800000a9c1, - 0xa9cf0000a9da, - 0xa9e00000a9ff, - 0xaa000000aa37, - 0xaa400000aa4e, - 0xaa500000aa5a, - 0xaa600000aa77, - 0xaa7a0000aac3, - 0xaadb0000aade, - 0xaae00000aaf0, - 0xaaf20000aaf7, - 0xab010000ab07, - 0xab090000ab0f, - 0xab110000ab17, - 0xab200000ab27, - 0xab280000ab2f, - 0xab300000ab5b, - 0xab600000ab69, - 0xabc00000abeb, - 0xabec0000abee, - 0xabf00000abfa, - 0xac000000d7a4, - 0xfa0e0000fa10, - 0xfa110000fa12, - 0xfa130000fa15, - 0xfa1f0000fa20, - 0xfa210000fa22, - 0xfa230000fa25, - 0xfa270000fa2a, - 0xfb1e0000fb1f, - 0xfe200000fe30, - 0xfe730000fe74, - 0x100000001000c, - 0x1000d00010027, - 0x100280001003b, - 0x1003c0001003e, - 0x1003f0001004e, - 0x100500001005e, - 0x10080000100fb, - 0x101fd000101fe, - 0x102800001029d, - 0x102a0000102d1, - 0x102e0000102e1, - 0x1030000010320, - 0x1032d00010341, - 0x103420001034a, - 0x103500001037b, - 0x103800001039e, - 0x103a0000103c4, - 0x103c8000103d0, - 0x104280001049e, - 0x104a0000104aa, - 0x104d8000104fc, - 0x1050000010528, - 0x1053000010564, - 0x10597000105a2, - 0x105a3000105b2, - 0x105b3000105ba, - 0x105bb000105bd, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1078000010781, - 0x1080000010806, - 0x1080800010809, - 0x1080a00010836, - 0x1083700010839, - 0x1083c0001083d, - 0x1083f00010856, - 0x1086000010877, - 0x108800001089f, - 0x108e0000108f3, - 0x108f4000108f6, - 0x1090000010916, - 0x109200001093a, - 0x10980000109b8, - 0x109be000109c0, - 0x10a0000010a04, - 0x10a0500010a07, - 0x10a0c00010a14, - 0x10a1500010a18, - 0x10a1900010a36, - 0x10a3800010a3b, - 0x10a3f00010a40, - 0x10a6000010a7d, - 0x10a8000010a9d, - 0x10ac000010ac8, - 0x10ac900010ae7, - 0x10b0000010b36, - 0x10b4000010b56, - 0x10b6000010b73, - 0x10b8000010b92, - 0x10c0000010c49, - 0x10cc000010cf3, - 0x10d0000010d28, - 0x10d3000010d3a, - 0x10e8000010eaa, - 0x10eab00010ead, - 0x10eb000010eb2, - 0x10efd00010f1d, - 0x10f2700010f28, - 0x10f3000010f51, - 0x10f7000010f86, - 0x10fb000010fc5, - 0x10fe000010ff7, - 0x1100000011047, - 0x1106600011076, - 0x1107f000110bb, - 0x110c2000110c3, - 0x110d0000110e9, - 0x110f0000110fa, - 0x1110000011135, - 0x1113600011140, - 0x1114400011148, - 0x1115000011174, - 0x1117600011177, - 0x11180000111c5, - 0x111c9000111cd, - 0x111ce000111db, - 0x111dc000111dd, - 0x1120000011212, - 0x1121300011238, - 0x1123e00011242, - 0x1128000011287, - 0x1128800011289, - 0x1128a0001128e, - 0x1128f0001129e, - 0x1129f000112a9, - 0x112b0000112eb, - 0x112f0000112fa, - 0x1130000011304, - 0x113050001130d, - 0x1130f00011311, - 0x1131300011329, - 0x1132a00011331, - 0x1133200011334, - 0x113350001133a, - 0x1133b00011345, - 0x1134700011349, - 0x1134b0001134e, - 0x1135000011351, - 0x1135700011358, - 0x1135d00011364, - 0x113660001136d, - 0x1137000011375, - 0x114000001144b, - 0x114500001145a, - 0x1145e00011462, - 0x11480000114c6, - 0x114c7000114c8, - 0x114d0000114da, - 0x11580000115b6, - 0x115b8000115c1, - 0x115d8000115de, - 0x1160000011641, - 0x1164400011645, - 0x116500001165a, - 0x11680000116b9, - 0x116c0000116ca, - 0x117000001171b, - 0x1171d0001172c, - 0x117300001173a, - 0x1174000011747, - 0x118000001183b, - 0x118c0000118ea, - 0x118ff00011907, - 0x119090001190a, - 0x1190c00011914, - 0x1191500011917, - 0x1191800011936, - 0x1193700011939, - 0x1193b00011944, - 0x119500001195a, - 0x119a0000119a8, - 0x119aa000119d8, - 0x119da000119e2, - 0x119e3000119e5, - 0x11a0000011a3f, - 0x11a4700011a48, - 0x11a5000011a9a, - 0x11a9d00011a9e, - 0x11ab000011af9, - 0x11c0000011c09, - 0x11c0a00011c37, - 0x11c3800011c41, - 0x11c5000011c5a, - 0x11c7200011c90, - 0x11c9200011ca8, - 0x11ca900011cb7, - 0x11d0000011d07, - 0x11d0800011d0a, - 0x11d0b00011d37, - 0x11d3a00011d3b, - 0x11d3c00011d3e, - 0x11d3f00011d48, - 0x11d5000011d5a, - 0x11d6000011d66, - 0x11d6700011d69, - 0x11d6a00011d8f, - 0x11d9000011d92, - 0x11d9300011d99, - 0x11da000011daa, - 0x11ee000011ef7, - 0x11f0000011f11, - 0x11f1200011f3b, - 0x11f3e00011f43, - 0x11f5000011f5a, - 0x11fb000011fb1, - 0x120000001239a, - 0x1248000012544, - 0x12f9000012ff1, - 0x1300000013430, - 0x1344000013456, - 0x1440000014647, - 0x1680000016a39, - 0x16a4000016a5f, - 0x16a6000016a6a, - 0x16a7000016abf, - 0x16ac000016aca, - 0x16ad000016aee, - 0x16af000016af5, - 0x16b0000016b37, - 0x16b4000016b44, - 0x16b5000016b5a, - 0x16b6300016b78, - 0x16b7d00016b90, - 0x16e6000016e80, - 0x16f0000016f4b, - 0x16f4f00016f88, - 0x16f8f00016fa0, - 0x16fe000016fe2, - 0x16fe300016fe5, - 0x16ff000016ff2, - 0x17000000187f8, - 0x1880000018cd6, - 0x18d0000018d09, - 0x1aff00001aff4, - 0x1aff50001affc, - 0x1affd0001afff, - 0x1b0000001b123, - 0x1b1320001b133, - 0x1b1500001b153, - 0x1b1550001b156, - 0x1b1640001b168, - 0x1b1700001b2fc, - 0x1bc000001bc6b, - 0x1bc700001bc7d, - 0x1bc800001bc89, - 0x1bc900001bc9a, - 0x1bc9d0001bc9f, - 0x1cf000001cf2e, - 0x1cf300001cf47, - 0x1da000001da37, - 0x1da3b0001da6d, - 0x1da750001da76, - 0x1da840001da85, - 0x1da9b0001daa0, - 0x1daa10001dab0, - 0x1df000001df1f, - 0x1df250001df2b, - 0x1e0000001e007, - 0x1e0080001e019, - 0x1e01b0001e022, - 0x1e0230001e025, - 0x1e0260001e02b, - 0x1e08f0001e090, - 0x1e1000001e12d, - 0x1e1300001e13e, - 0x1e1400001e14a, - 0x1e14e0001e14f, - 0x1e2900001e2af, - 0x1e2c00001e2fa, - 0x1e4d00001e4fa, - 0x1e7e00001e7e7, - 0x1e7e80001e7ec, - 0x1e7ed0001e7ef, - 0x1e7f00001e7ff, - 0x1e8000001e8c5, - 0x1e8d00001e8d7, - 0x1e9220001e94c, - 0x1e9500001e95a, - 0x200000002a6e0, - 0x2a7000002b73a, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - 0x2ebf00002ee5e, - 0x300000003134b, - 0x31350000323b0, - ), - 'CONTEXTJ': ( - 0x200c0000200e, - ), - 'CONTEXTO': ( - 0xb7000000b8, - 0x37500000376, - 0x5f3000005f5, - 0x6600000066a, - 0x6f0000006fa, - 0x30fb000030fc, - ), -} diff --git a/.flatpak-builder/cache/objects/5f/4f11228031ec0bca43e5e5240a3961c6394371afd9620fa78b468d0adb7a0c.file b/.flatpak-builder/cache/objects/5f/4f11228031ec0bca43e5e5240a3961c6394371afd9620fa78b468d0adb7a0c.file deleted file mode 100644 index d25c51e6399708c78255a6a67265b447b642872d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17345 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 T=hkn`JJ#~M^4#43TT1^2NSbW3 diff --git a/.flatpak-builder/cache/objects/5f/541a7baef8537d78456bede60c93421274370b9ed47965c5142ddaaa89d3b5.file b/.flatpak-builder/cache/objects/5f/541a7baef8537d78456bede60c93421274370b9ed47965c5142ddaaa89d3b5.file deleted file mode 100644 index a760b9c..0000000 --- a/.flatpak-builder/cache/objects/5f/541a7baef8537d78456bede60c93421274370b9ed47965c5142ddaaa89d3b5.file +++ /dev/null @@ -1,340 +0,0 @@ -from encodings.aliases import aliases -from hashlib import sha256 -from json import dumps -from typing import Any, Dict, Iterator, List, Optional, Tuple, Union - -from .constant import TOO_BIG_SEQUENCE -from .utils import iana_name, is_multi_byte_encoding, unicode_range - - -class CharsetMatch: - def __init__( - self, - payload: bytes, - guessed_encoding: str, - mean_mess_ratio: float, - has_sig_or_bom: bool, - languages: "CoherenceMatches", - decoded_payload: Optional[str] = None, - ): - self._payload: bytes = payload - - self._encoding: str = guessed_encoding - self._mean_mess_ratio: float = mean_mess_ratio - self._languages: CoherenceMatches = languages - self._has_sig_or_bom: bool = has_sig_or_bom - self._unicode_ranges: Optional[List[str]] = None - - self._leaves: List[CharsetMatch] = [] - self._mean_coherence_ratio: float = 0.0 - - self._output_payload: Optional[bytes] = None - self._output_encoding: Optional[str] = None - - self._string: Optional[str] = decoded_payload - - def __eq__(self, other: object) -> bool: - if not isinstance(other, CharsetMatch): - raise TypeError( - "__eq__ cannot be invoked on {} and {}.".format( - str(other.__class__), str(self.__class__) - ) - ) - return self.encoding == other.encoding and self.fingerprint == other.fingerprint - - def __lt__(self, other: object) -> bool: - """ - Implemented to make sorted available upon CharsetMatches items. - """ - if not isinstance(other, CharsetMatch): - raise ValueError - - chaos_difference: float = abs(self.chaos - other.chaos) - coherence_difference: float = abs(self.coherence - other.coherence) - - # Below 1% difference --> Use Coherence - if chaos_difference < 0.01 and coherence_difference > 0.02: - return self.coherence > other.coherence - elif chaos_difference < 0.01 and coherence_difference <= 0.02: - # When having a difficult decision, use the result that decoded as many multi-byte as possible. - # preserve RAM usage! - if len(self._payload) >= TOO_BIG_SEQUENCE: - return self.chaos < other.chaos - return self.multi_byte_usage > other.multi_byte_usage - - return self.chaos < other.chaos - - @property - def multi_byte_usage(self) -> float: - return 1.0 - (len(str(self)) / len(self.raw)) - - def __str__(self) -> str: - # Lazy Str Loading - if self._string is None: - self._string = str(self._payload, self._encoding, "strict") - return self._string - - def __repr__(self) -> str: - return "".format(self.encoding, self.fingerprint) - - def add_submatch(self, other: "CharsetMatch") -> None: - if not isinstance(other, CharsetMatch) or other == self: - raise ValueError( - "Unable to add instance <{}> as a submatch of a CharsetMatch".format( - other.__class__ - ) - ) - - other._string = None # Unload RAM usage; dirty trick. - self._leaves.append(other) - - @property - def encoding(self) -> str: - return self._encoding - - @property - def encoding_aliases(self) -> List[str]: - """ - Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. - """ - also_known_as: List[str] = [] - for u, p in aliases.items(): - if self.encoding == u: - also_known_as.append(p) - elif self.encoding == p: - also_known_as.append(u) - return also_known_as - - @property - def bom(self) -> bool: - return self._has_sig_or_bom - - @property - def byte_order_mark(self) -> bool: - return self._has_sig_or_bom - - @property - def languages(self) -> List[str]: - """ - Return the complete list of possible languages found in decoded sequence. - Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. - """ - return [e[0] for e in self._languages] - - @property - def language(self) -> str: - """ - Most probable language found in decoded sequence. If none were detected or inferred, the property will return - "Unknown". - """ - if not self._languages: - # Trying to infer the language based on the given encoding - # Its either English or we should not pronounce ourselves in certain cases. - if "ascii" in self.could_be_from_charset: - return "English" - - # doing it there to avoid circular import - from charset_normalizer.cd import encoding_languages, mb_encoding_languages - - languages = ( - mb_encoding_languages(self.encoding) - if is_multi_byte_encoding(self.encoding) - else encoding_languages(self.encoding) - ) - - if len(languages) == 0 or "Latin Based" in languages: - return "Unknown" - - return languages[0] - - return self._languages[0][0] - - @property - def chaos(self) -> float: - return self._mean_mess_ratio - - @property - def coherence(self) -> float: - if not self._languages: - return 0.0 - return self._languages[0][1] - - @property - def percent_chaos(self) -> float: - return round(self.chaos * 100, ndigits=3) - - @property - def percent_coherence(self) -> float: - return round(self.coherence * 100, ndigits=3) - - @property - def raw(self) -> bytes: - """ - Original untouched bytes. - """ - return self._payload - - @property - def submatch(self) -> List["CharsetMatch"]: - return self._leaves - - @property - def has_submatch(self) -> bool: - return len(self._leaves) > 0 - - @property - def alphabets(self) -> List[str]: - if self._unicode_ranges is not None: - return self._unicode_ranges - # list detected ranges - detected_ranges: List[Optional[str]] = [ - unicode_range(char) for char in str(self) - ] - # filter and sort - self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) - return self._unicode_ranges - - @property - def could_be_from_charset(self) -> List[str]: - """ - The complete list of encoding that output the exact SAME str result and therefore could be the originating - encoding. - This list does include the encoding available in property 'encoding'. - """ - return [self._encoding] + [m.encoding for m in self._leaves] - - def output(self, encoding: str = "utf_8") -> bytes: - """ - Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. - Any errors will be simply ignored by the encoder NOT replaced. - """ - if self._output_encoding is None or self._output_encoding != encoding: - self._output_encoding = encoding - self._output_payload = str(self).encode(encoding, "replace") - - return self._output_payload # type: ignore - - @property - def fingerprint(self) -> str: - """ - Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. - """ - return sha256(self.output()).hexdigest() - - -class CharsetMatches: - """ - Container with every CharsetMatch items ordered by default from most probable to the less one. - Act like a list(iterable) but does not implements all related methods. - """ - - def __init__(self, results: Optional[List[CharsetMatch]] = None): - self._results: List[CharsetMatch] = sorted(results) if results else [] - - def __iter__(self) -> Iterator[CharsetMatch]: - yield from self._results - - def __getitem__(self, item: Union[int, str]) -> CharsetMatch: - """ - Retrieve a single item either by its position or encoding name (alias may be used here). - Raise KeyError upon invalid index or encoding not present in results. - """ - if isinstance(item, int): - return self._results[item] - if isinstance(item, str): - item = iana_name(item, False) - for result in self._results: - if item in result.could_be_from_charset: - return result - raise KeyError - - def __len__(self) -> int: - return len(self._results) - - def __bool__(self) -> bool: - return len(self._results) > 0 - - def append(self, item: CharsetMatch) -> None: - """ - Insert a single match. Will be inserted accordingly to preserve sort. - Can be inserted as a submatch. - """ - if not isinstance(item, CharsetMatch): - raise ValueError( - "Cannot append instance '{}' to CharsetMatches".format( - str(item.__class__) - ) - ) - # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) - if len(item.raw) <= TOO_BIG_SEQUENCE: - for match in self._results: - if match.fingerprint == item.fingerprint and match.chaos == item.chaos: - match.add_submatch(item) - return - self._results.append(item) - self._results = sorted(self._results) - - def best(self) -> Optional["CharsetMatch"]: - """ - Simply return the first match. Strict equivalent to matches[0]. - """ - if not self._results: - return None - return self._results[0] - - def first(self) -> Optional["CharsetMatch"]: - """ - Redundant method, call the method best(). Kept for BC reasons. - """ - return self.best() - - -CoherenceMatch = Tuple[str, float] -CoherenceMatches = List[CoherenceMatch] - - -class CliDetectionResult: - def __init__( - self, - path: str, - encoding: Optional[str], - encoding_aliases: List[str], - alternative_encodings: List[str], - language: str, - alphabets: List[str], - has_sig_or_bom: bool, - chaos: float, - coherence: float, - unicode_path: Optional[str], - is_preferred: bool, - ): - self.path: str = path - self.unicode_path: Optional[str] = unicode_path - self.encoding: Optional[str] = encoding - self.encoding_aliases: List[str] = encoding_aliases - self.alternative_encodings: List[str] = alternative_encodings - self.language: str = language - self.alphabets: List[str] = alphabets - self.has_sig_or_bom: bool = has_sig_or_bom - self.chaos: float = chaos - self.coherence: float = coherence - self.is_preferred: bool = is_preferred - - @property - def __dict__(self) -> Dict[str, Any]: # type: ignore - return { - "path": self.path, - "encoding": self.encoding, - "encoding_aliases": self.encoding_aliases, - "alternative_encodings": self.alternative_encodings, - "language": self.language, - "alphabets": self.alphabets, - "has_sig_or_bom": self.has_sig_or_bom, - "chaos": self.chaos, - "coherence": self.coherence, - "unicode_path": self.unicode_path, - "is_preferred": self.is_preferred, - } - - def to_json(self) -> str: - return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/.flatpak-builder/cache/objects/5f/5e1d9e4f51d2b75ccdbb8baab4ba8b61cbad9f8b903101671a0144c58217d7.file b/.flatpak-builder/cache/objects/5f/5e1d9e4f51d2b75ccdbb8baab4ba8b61cbad9f8b903101671a0144c58217d7.file deleted file mode 100644 index 3c69206a57adf420f271cbb9b670698609739cea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21045 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 diff --git a/.flatpak-builder/cache/objects/5f/a545d3e058c6a3594a2a27f9f4045c815cdc2c05a1f52caa2b133cf20a7d87.file b/.flatpak-builder/cache/objects/5f/a545d3e058c6a3594a2a27f9f4045c815cdc2c05a1f52caa2b133cf20a7d87.file deleted file mode 100644 index 3e258a5..0000000 --- a/.flatpak-builder/cache/objects/5f/a545d3e058c6a3594a2a27f9f4045c815cdc2c05a1f52caa2b133cf20a7d87.file +++ /dev/null @@ -1,341 +0,0 @@ -from __future__ import annotations - -import email.utils -import mimetypes -import typing - -_TYPE_FIELD_VALUE = typing.Union[str, bytes] -_TYPE_FIELD_VALUE_TUPLE = typing.Union[ - _TYPE_FIELD_VALUE, - typing.Tuple[str, _TYPE_FIELD_VALUE], - typing.Tuple[str, _TYPE_FIELD_VALUE, str], -] - - -def guess_content_type( - filename: str | None, default: str = "application/octet-stream" -) -> str: - """ - Guess the "Content-Type" of a file. - - :param filename: - The filename to guess the "Content-Type" of using :mod:`mimetypes`. - :param default: - If no "Content-Type" can be guessed, default to `default`. - """ - if filename: - return mimetypes.guess_type(filename)[0] or default - return default - - -def format_header_param_rfc2231(name: str, value: _TYPE_FIELD_VALUE) -> str: - """ - Helper function to format and quote a single header parameter using the - strategy defined in RFC 2231. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows - `RFC 2388 Section 4.4 `_. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as ``bytes`` or `str``. - :returns: - An RFC-2231-formatted unicode string. - - .. deprecated:: 2.0.0 - Will be removed in urllib3 v2.1.0. This is not valid for - ``multipart/form-data`` header parameters. - """ - import warnings - - warnings.warn( - "'format_header_param_rfc2231' is deprecated and will be " - "removed in urllib3 v2.1.0. This is not valid for " - "multipart/form-data header parameters.", - DeprecationWarning, - stacklevel=2, - ) - - if isinstance(value, bytes): - value = value.decode("utf-8") - - if not any(ch in value for ch in '"\\\r\n'): - result = f'{name}="{value}"' - try: - result.encode("ascii") - except (UnicodeEncodeError, UnicodeDecodeError): - pass - else: - return result - - value = email.utils.encode_rfc2231(value, "utf-8") - value = f"{name}*={value}" - - return value - - -def format_multipart_header_param(name: str, value: _TYPE_FIELD_VALUE) -> str: - """ - Format and quote a single multipart header parameter. - - This follows the `WHATWG HTML Standard`_ as of 2021/06/10, matching - the behavior of current browser and curl versions. Values are - assumed to be UTF-8. The ``\\n``, ``\\r``, and ``"`` characters are - percent encoded. - - .. _WHATWG HTML Standard: - https://html.spec.whatwg.org/multipage/ - form-control-infrastructure.html#multipart-form-data - - :param name: - The name of the parameter, an ASCII-only ``str``. - :param value: - The value of the parameter, a ``str`` or UTF-8 encoded - ``bytes``. - :returns: - A string ``name="value"`` with the escaped value. - - .. versionchanged:: 2.0.0 - Matches the WHATWG HTML Standard as of 2021/06/10. Control - characters are no longer percent encoded. - - .. versionchanged:: 2.0.0 - Renamed from ``format_header_param_html5`` and - ``format_header_param``. The old names will be removed in - urllib3 v2.1.0. - """ - if isinstance(value, bytes): - value = value.decode("utf-8") - - # percent encode \n \r " - value = value.translate({10: "%0A", 13: "%0D", 34: "%22"}) - return f'{name}="{value}"' - - -def format_header_param_html5(name: str, value: _TYPE_FIELD_VALUE) -> str: - """ - .. deprecated:: 2.0.0 - Renamed to :func:`format_multipart_header_param`. Will be - removed in urllib3 v2.1.0. - """ - import warnings - - warnings.warn( - "'format_header_param_html5' has been renamed to " - "'format_multipart_header_param'. The old name will be " - "removed in urllib3 v2.1.0.", - DeprecationWarning, - stacklevel=2, - ) - return format_multipart_header_param(name, value) - - -def format_header_param(name: str, value: _TYPE_FIELD_VALUE) -> str: - """ - .. deprecated:: 2.0.0 - Renamed to :func:`format_multipart_header_param`. Will be - removed in urllib3 v2.1.0. - """ - import warnings - - warnings.warn( - "'format_header_param' has been renamed to " - "'format_multipart_header_param'. The old name will be " - "removed in urllib3 v2.1.0.", - DeprecationWarning, - stacklevel=2, - ) - return format_multipart_header_param(name, value) - - -class RequestField: - """ - A data container for request body parameters. - - :param name: - The name of this request field. Must be unicode. - :param data: - The data/value body. - :param filename: - An optional filename of the request field. Must be unicode. - :param headers: - An optional dict-like object of headers to initially use for the field. - - .. versionchanged:: 2.0.0 - The ``header_formatter`` parameter is deprecated and will - be removed in urllib3 v2.1.0. - """ - - def __init__( - self, - name: str, - data: _TYPE_FIELD_VALUE, - filename: str | None = None, - headers: typing.Mapping[str, str] | None = None, - header_formatter: typing.Callable[[str, _TYPE_FIELD_VALUE], str] | None = None, - ): - self._name = name - self._filename = filename - self.data = data - self.headers: dict[str, str | None] = {} - if headers: - self.headers = dict(headers) - - if header_formatter is not None: - import warnings - - warnings.warn( - "The 'header_formatter' parameter is deprecated and " - "will be removed in urllib3 v2.1.0.", - DeprecationWarning, - stacklevel=2, - ) - self.header_formatter = header_formatter - else: - self.header_formatter = format_multipart_header_param - - @classmethod - def from_tuples( - cls, - fieldname: str, - value: _TYPE_FIELD_VALUE_TUPLE, - header_formatter: typing.Callable[[str, _TYPE_FIELD_VALUE], str] | None = None, - ) -> RequestField: - """ - A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - - Supports constructing :class:`~urllib3.fields.RequestField` from - parameter of key/value strings AND key/filetuple. A filetuple is a - (filename, data, MIME type) tuple where the MIME type is optional. - For example:: - - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - - Field names and filenames must be unicode. - """ - filename: str | None - content_type: str | None - data: _TYPE_FIELD_VALUE - - if isinstance(value, tuple): - if len(value) == 3: - filename, data, content_type = value - else: - filename, data = value - content_type = guess_content_type(filename) - else: - filename = None - content_type = None - data = value - - request_param = cls( - fieldname, data, filename=filename, header_formatter=header_formatter - ) - request_param.make_multipart(content_type=content_type) - - return request_param - - def _render_part(self, name: str, value: _TYPE_FIELD_VALUE) -> str: - """ - Override this method to change how each multipart header - parameter is formatted. By default, this calls - :func:`format_multipart_header_param`. - - :param name: - The name of the parameter, an ASCII-only ``str``. - :param value: - The value of the parameter, a ``str`` or UTF-8 encoded - ``bytes``. - - :meta public: - """ - return self.header_formatter(name, value) - - def _render_parts( - self, - header_parts: ( - dict[str, _TYPE_FIELD_VALUE | None] - | typing.Sequence[tuple[str, _TYPE_FIELD_VALUE | None]] - ), - ) -> str: - """ - Helper function to format and quote a single header. - - Useful for single headers that are composed of multiple items. E.g., - 'Content-Disposition' fields. - - :param header_parts: - A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format - as `k1="v1"; k2="v2"; ...`. - """ - iterable: typing.Iterable[tuple[str, _TYPE_FIELD_VALUE | None]] - - parts = [] - if isinstance(header_parts, dict): - iterable = header_parts.items() - else: - iterable = header_parts - - for name, value in iterable: - if value is not None: - parts.append(self._render_part(name, value)) - - return "; ".join(parts) - - def render_headers(self) -> str: - """ - Renders the headers for this request field. - """ - lines = [] - - sort_keys = ["Content-Disposition", "Content-Type", "Content-Location"] - for sort_key in sort_keys: - if self.headers.get(sort_key, False): - lines.append(f"{sort_key}: {self.headers[sort_key]}") - - for header_name, header_value in self.headers.items(): - if header_name not in sort_keys: - if header_value: - lines.append(f"{header_name}: {header_value}") - - lines.append("\r\n") - return "\r\n".join(lines) - - def make_multipart( - self, - content_disposition: str | None = None, - content_type: str | None = None, - content_location: str | None = None, - ) -> None: - """ - Makes this request field into a multipart request field. - - This method overrides "Content-Disposition", "Content-Type" and - "Content-Location" headers to the request parameter. - - :param content_disposition: - The 'Content-Disposition' of the request body. Defaults to 'form-data' - :param content_type: - The 'Content-Type' of the request body. - :param content_location: - The 'Content-Location' of the request body. - - """ - content_disposition = (content_disposition or "form-data") + "; ".join( - [ - "", - self._render_parts( - (("name", self._name), ("filename", self._filename)) - ), - ] - ) - - self.headers["Content-Disposition"] = content_disposition - self.headers["Content-Type"] = content_type - self.headers["Content-Location"] = content_location diff --git a/.flatpak-builder/cache/objects/5f/b5b6ec95d4896585e8b2c482eee14e68b44f83beaa11d877e46c81bd9f7687.dirtree b/.flatpak-builder/cache/objects/5f/b5b6ec95d4896585e8b2c482eee14e68b44f83beaa11d877e46c81bd9f7687.dirtree deleted file mode 100644 index 637cbb07ce8647256aa89827d9296d48d8e74e98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmV-Y0ImOXX>?^RaA9L>VP|D?0F$|{aIy2XY;lL<%P%Y?zVOMq!QKabM`5S>kDjDh%OFL0MLdiiU0rr diff --git a/.flatpak-builder/cache/objects/5f/ef7fd9a6bbcc4f4a6ef49b2f906ec67dcc07990710608c854a4d0a11ea1ef1.file b/.flatpak-builder/cache/objects/5f/ef7fd9a6bbcc4f4a6ef49b2f906ec67dcc07990710608c854a4d0a11ea1ef1.file deleted file mode 100644 index ed81113..0000000 --- a/.flatpak-builder/cache/objects/5f/ef7fd9a6bbcc4f4a6ef49b2f906ec67dcc07990710608c854a4d0a11ea1ef1.file +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = '3.7' - diff --git a/.flatpak-builder/cache/objects/60/09ea4de391851ec1921bc81a58776638829e0886432d665c1f724d452c9fa0.file b/.flatpak-builder/cache/objects/60/09ea4de391851ec1921bc81a58776638829e0886432d665c1f724d452c9fa0.file deleted file mode 100644 index b0792f0..0000000 --- a/.flatpak-builder/cache/objects/60/09ea4de391851ec1921bc81a58776638829e0886432d665c1f724d452c9fa0.file +++ /dev/null @@ -1,321 +0,0 @@ -from __future__ import annotations - -import socket -import typing -import warnings -from email.errors import MessageDefect -from http.client import IncompleteRead as httplib_IncompleteRead - -if typing.TYPE_CHECKING: - from .connection import HTTPConnection - from .connectionpool import ConnectionPool - from .response import HTTPResponse - from .util.retry import Retry - -# Base Exceptions - - -class HTTPError(Exception): - """Base exception used by this module.""" - - -class HTTPWarning(Warning): - """Base warning used by this module.""" - - -_TYPE_REDUCE_RESULT = typing.Tuple[ - typing.Callable[..., object], typing.Tuple[object, ...] -] - - -class PoolError(HTTPError): - """Base exception for errors caused within a pool.""" - - def __init__(self, pool: ConnectionPool, message: str) -> None: - self.pool = pool - super().__init__(f"{pool}: {message}") - - def __reduce__(self) -> _TYPE_REDUCE_RESULT: - # For pickling purposes. - return self.__class__, (None, None) - - -class RequestError(PoolError): - """Base exception for PoolErrors that have associated URLs.""" - - def __init__(self, pool: ConnectionPool, url: str, message: str) -> None: - self.url = url - super().__init__(pool, message) - - def __reduce__(self) -> _TYPE_REDUCE_RESULT: - # For pickling purposes. - return self.__class__, (None, self.url, None) - - -class SSLError(HTTPError): - """Raised when SSL certificate fails in an HTTPS connection.""" - - -class ProxyError(HTTPError): - """Raised when the connection to a proxy fails.""" - - # The original error is also available as __cause__. - original_error: Exception - - def __init__(self, message: str, error: Exception) -> None: - super().__init__(message, error) - self.original_error = error - - -class DecodeError(HTTPError): - """Raised when automatic decoding based on Content-Type fails.""" - - -class ProtocolError(HTTPError): - """Raised when something unexpected happens mid-request/response.""" - - -#: Renamed to ProtocolError but aliased for backwards compatibility. -ConnectionError = ProtocolError - - -# Leaf Exceptions - - -class MaxRetryError(RequestError): - """Raised when the maximum number of retries is exceeded. - - :param pool: The connection pool - :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` - :param str url: The requested Url - :param reason: The underlying error - :type reason: :class:`Exception` - - """ - - def __init__( - self, pool: ConnectionPool, url: str, reason: Exception | None = None - ) -> None: - self.reason = reason - - message = f"Max retries exceeded with url: {url} (Caused by {reason!r})" - - super().__init__(pool, url, message) - - -class HostChangedError(RequestError): - """Raised when an existing pool gets a request for a foreign host.""" - - def __init__( - self, pool: ConnectionPool, url: str, retries: Retry | int = 3 - ) -> None: - message = f"Tried to open a foreign host with url: {url}" - super().__init__(pool, url, message) - self.retries = retries - - -class TimeoutStateError(HTTPError): - """Raised when passing an invalid state to a timeout""" - - -class TimeoutError(HTTPError): - """Raised when a socket timeout error occurs. - - Catching this error will catch both :exc:`ReadTimeoutErrors - ` and :exc:`ConnectTimeoutErrors `. - """ - - -class ReadTimeoutError(TimeoutError, RequestError): - """Raised when a socket timeout occurs while receiving data from a server""" - - -# This timeout error does not have a URL attached and needs to inherit from the -# base HTTPError -class ConnectTimeoutError(TimeoutError): - """Raised when a socket timeout occurs while connecting to a server""" - - -class NewConnectionError(ConnectTimeoutError, HTTPError): - """Raised when we fail to establish a new connection. Usually ECONNREFUSED.""" - - def __init__(self, conn: HTTPConnection, message: str) -> None: - self.conn = conn - super().__init__(f"{conn}: {message}") - - @property - def pool(self) -> HTTPConnection: - warnings.warn( - "The 'pool' property is deprecated and will be removed " - "in urllib3 v2.1.0. Use 'conn' instead.", - DeprecationWarning, - stacklevel=2, - ) - - return self.conn - - -class NameResolutionError(NewConnectionError): - """Raised when host name resolution fails.""" - - def __init__(self, host: str, conn: HTTPConnection, reason: socket.gaierror): - message = f"Failed to resolve '{host}' ({reason})" - super().__init__(conn, message) - - -class EmptyPoolError(PoolError): - """Raised when a pool runs out of connections and no more are allowed.""" - - -class FullPoolError(PoolError): - """Raised when we try to add a connection to a full pool in blocking mode.""" - - -class ClosedPoolError(PoolError): - """Raised when a request enters a pool after the pool has been closed.""" - - -class LocationValueError(ValueError, HTTPError): - """Raised when there is something wrong with a given URL input.""" - - -class LocationParseError(LocationValueError): - """Raised when get_host or similar fails to parse the URL input.""" - - def __init__(self, location: str) -> None: - message = f"Failed to parse: {location}" - super().__init__(message) - - self.location = location - - -class URLSchemeUnknown(LocationValueError): - """Raised when a URL input has an unsupported scheme.""" - - def __init__(self, scheme: str): - message = f"Not supported URL scheme {scheme}" - super().__init__(message) - - self.scheme = scheme - - -class ResponseError(HTTPError): - """Used as a container for an error reason supplied in a MaxRetryError.""" - - GENERIC_ERROR = "too many error responses" - SPECIFIC_ERROR = "too many {status_code} error responses" - - -class SecurityWarning(HTTPWarning): - """Warned when performing security reducing actions""" - - -class InsecureRequestWarning(SecurityWarning): - """Warned when making an unverified HTTPS request.""" - - -class NotOpenSSLWarning(SecurityWarning): - """Warned when using unsupported SSL library""" - - -class SystemTimeWarning(SecurityWarning): - """Warned when system time is suspected to be wrong""" - - -class InsecurePlatformWarning(SecurityWarning): - """Warned when certain TLS/SSL configuration is not available on a platform.""" - - -class DependencyWarning(HTTPWarning): - """ - Warned when an attempt is made to import a module with missing optional - dependencies. - """ - - -class ResponseNotChunked(ProtocolError, ValueError): - """Response needs to be chunked in order to read it as chunks.""" - - -class BodyNotHttplibCompatible(HTTPError): - """ - Body should be :class:`http.client.HTTPResponse` like - (have an fp attribute which returns raw chunks) for read_chunked(). - """ - - -class IncompleteRead(HTTPError, httplib_IncompleteRead): - """ - Response length doesn't match expected Content-Length - - Subclass of :class:`http.client.IncompleteRead` to allow int value - for ``partial`` to avoid creating large objects on streamed reads. - """ - - partial: int # type: ignore[assignment] - expected: int - - def __init__(self, partial: int, expected: int) -> None: - self.partial = partial - self.expected = expected - - def __repr__(self) -> str: - return "IncompleteRead(%i bytes read, %i more expected)" % ( - self.partial, - self.expected, - ) - - -class InvalidChunkLength(HTTPError, httplib_IncompleteRead): - """Invalid chunk length in a chunked response.""" - - def __init__(self, response: HTTPResponse, length: bytes) -> None: - self.partial: int = response.tell() # type: ignore[assignment] - self.expected: int | None = response.length_remaining - self.response = response - self.length = length - - def __repr__(self) -> str: - return "InvalidChunkLength(got length %r, %i bytes read)" % ( - self.length, - self.partial, - ) - - -class InvalidHeader(HTTPError): - """The header provided was somehow invalid.""" - - -class ProxySchemeUnknown(AssertionError, URLSchemeUnknown): - """ProxyManager does not support the supplied scheme""" - - # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. - - def __init__(self, scheme: str | None) -> None: - # 'localhost' is here because our URL parser parses - # localhost:8080 -> scheme=localhost, remove if we fix this. - if scheme == "localhost": - scheme = None - if scheme is None: - message = "Proxy URL had no scheme, should start with http:// or https://" - else: - message = f"Proxy URL had unsupported scheme {scheme}, should use http:// or https://" - super().__init__(message) - - -class ProxySchemeUnsupported(ValueError): - """Fetching HTTPS resources through HTTPS proxies is unsupported""" - - -class HeaderParsingError(HTTPError): - """Raised by assert_header_parsing, but we convert it to a log.warning statement.""" - - def __init__( - self, defects: list[MessageDefect], unparsed_data: bytes | str | None - ) -> None: - message = f"{defects or 'Unknown'}, unparsed data: {unparsed_data!r}" - super().__init__(message) - - -class UnrewindableBodyError(HTTPError): - """urllib3 encountered an error when trying to rewind a body""" diff --git a/.flatpak-builder/cache/objects/60/2dfb7298673aedbbd711cb5d022641df95d439ab495f789f09574827a3fb6c.file b/.flatpak-builder/cache/objects/60/2dfb7298673aedbbd711cb5d022641df95d439ab495f789f09574827a3fb6c.file deleted file mode 100644 index 043156e..0000000 --- a/.flatpak-builder/cache/objects/60/2dfb7298673aedbbd711cb5d022641df95d439ab495f789f09574827a3fb6c.file +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import annotations - -import sys - -from .features import pilinfo - -pilinfo(supported_formats="--report" not in sys.argv) diff --git a/.flatpak-builder/cache/objects/60/63ed8c3382375c91978f8a8a4a7dbe5ec994bac18cecd7869c08849c94e4db.file b/.flatpak-builder/cache/objects/60/63ed8c3382375c91978f8a8a4a7dbe5ec994bac18cecd7869c08849c94e4db.file deleted file mode 100644 index 13eeb4879bfd9b25b93f4ccc1bb25c70fc9bce0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13447 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 diff --git a/.flatpak-builder/cache/objects/60/6b6e08e1cf6b48cc5c1948c781df8215107c335223d8a8602af370e9c5044b.file b/.flatpak-builder/cache/objects/60/6b6e08e1cf6b48cc5c1948c781df8215107c335223d8a8602af370e9c5044b.file deleted file mode 100644 index a0c2e92c9a76e87bd1b94a3e39771825c870fa4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5608 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 C4z^MN diff --git a/.flatpak-builder/cache/objects/61/aa8cf0854abac049eaea32fdc55d0047c110862ebde62f10243d99aac77d70.dirtree b/.flatpak-builder/cache/objects/61/aa8cf0854abac049eaea32fdc55d0047c110862ebde62f10243d99aac77d70.dirtree deleted file mode 100644 index 37a53723dad72cf333fe8245f0daa5a33d41ed12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmV;{04e`TPE%AtOiV>m0Bm&C?T93vyl?TQQy7v3@ioMy$OBqR?vu`l!@5X+!3s=C zLq$$gMJ{b*0DEXuf8?k-DvtCWdfLuJzz$AkyTM=~tw$II?tr}nNefLyR6#^RR6zi{ z&%vzV&&l>H5hCec%P>dq^S-PBJGo;?*LeX zukE9=eU%jjMZ)JGc Q@JI!;?O+BgSAnU})i9u8aR2}S diff --git a/.flatpak-builder/cache/objects/61/c06cdc269583a178a925832b5fa6c1a95697ed5f92ab90a4410f8be143325c.dirtree b/.flatpak-builder/cache/objects/61/c06cdc269583a178a925832b5fa6c1a95697ed5f92ab90a4410f8be143325c.dirtree deleted file mode 100644 index 9574137fb975ee5633ec09b97e562263cbecfa77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71 zcmV-N0J#5hbpR_){F-x$gq1k;V8zn@pk+tUeFbx&w9Yu03JoUAsf~r=hi0cb%REQ%3MF1ZBBlZ9Q diff --git a/.flatpak-builder/cache/objects/61/f4a8178281816a6a11aada803ad9a44b75ca3554f0e5ae0b333f1895bd1212.file b/.flatpak-builder/cache/objects/61/f4a8178281816a6a11aada803ad9a44b75ca3554f0e5ae0b333f1895bd1212.file deleted file mode 100644 index baef0aa..0000000 --- a/.flatpak-builder/cache/objects/61/f4a8178281816a6a11aada803ad9a44b75ca3554f0e5ae0b333f1895bd1212.file +++ /dev/null @@ -1,3983 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# the Image class wrapper -# -# partial release history: -# 1995-09-09 fl Created -# 1996-03-11 fl PIL release 0.0 (proof of concept) -# 1996-04-30 fl PIL release 0.1b1 -# 1999-07-28 fl PIL release 1.0 final -# 2000-06-07 fl PIL release 1.1 -# 2000-10-20 fl PIL release 1.1.1 -# 2001-05-07 fl PIL release 1.1.2 -# 2002-03-15 fl PIL release 1.1.3 -# 2003-05-10 fl PIL release 1.1.4 -# 2005-03-28 fl PIL release 1.1.5 -# 2006-12-02 fl PIL release 1.1.6 -# 2009-11-15 fl PIL release 1.1.7 -# -# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-2009 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -from __future__ import annotations - -import abc -import atexit -import builtins -import io -import logging -import math -import os -import re -import struct -import sys -import tempfile -import warnings -from collections.abc import Callable, MutableMapping -from enum import IntEnum -from types import ModuleType -from typing import IO, TYPE_CHECKING, Any - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -from . import ( - ExifTags, - ImageMode, - TiffTags, - UnidentifiedImageError, - __version__, - _plugins, -) -from ._binary import i32le, o32be, o32le -from ._typing import TypeGuard -from ._util import DeferredError, is_path - -ElementTree: ModuleType | None -try: - from defusedxml import ElementTree -except ImportError: - ElementTree = None - -logger = logging.getLogger(__name__) - - -class DecompressionBombWarning(RuntimeWarning): - pass - - -class DecompressionBombError(Exception): - pass - - -# Limit to around a quarter gigabyte for a 24-bit (3 bpp) image -MAX_IMAGE_PIXELS: int | None = int(1024 * 1024 * 1024 // 4 // 3) - - -try: - # If the _imaging C module is not present, Pillow will not load. - # Note that other modules should not refer to _imaging directly; - # import Image and use the Image.core variable instead. - # Also note that Image.core is not a publicly documented interface, - # and should be considered private and subject to change. - from . import _imaging as core - - if __version__ != getattr(core, "PILLOW_VERSION", None): - msg = ( - "The _imaging extension was built for another version of Pillow or PIL:\n" - f"Core version: {getattr(core, 'PILLOW_VERSION', None)}\n" - f"Pillow version: {__version__}" - ) - raise ImportError(msg) - -except ImportError as v: - core = DeferredError.new(ImportError("The _imaging C module is not installed.")) - # Explanations for ways that we know we might have an import error - if str(v).startswith("Module use of python"): - # The _imaging C module is present, but not compiled for - # the right version (windows only). Print a warning, if - # possible. - warnings.warn( - "The _imaging extension was built for another version of Python.", - RuntimeWarning, - ) - elif str(v).startswith("The _imaging extension"): - warnings.warn(str(v), RuntimeWarning) - # Fail here anyway. Don't let people run with a mostly broken Pillow. - # see docs/porting.rst - raise - - -USE_CFFI_ACCESS = False -cffi: ModuleType | None -try: - import cffi -except ImportError: - cffi = None - - -def isImageType(t: Any) -> TypeGuard[Image]: - """ - Checks if an object is an image object. - - .. warning:: - - This function is for internal use only. - - :param t: object to check if it's an image - :returns: True if the object is an image - """ - return hasattr(t, "im") - - -# -# Constants - - -# transpose -class Transpose(IntEnum): - FLIP_LEFT_RIGHT = 0 - FLIP_TOP_BOTTOM = 1 - ROTATE_90 = 2 - ROTATE_180 = 3 - ROTATE_270 = 4 - TRANSPOSE = 5 - TRANSVERSE = 6 - - -# transforms (also defined in Imaging.h) -class Transform(IntEnum): - AFFINE = 0 - EXTENT = 1 - PERSPECTIVE = 2 - QUAD = 3 - MESH = 4 - - -# resampling filters (also defined in Imaging.h) -class Resampling(IntEnum): - NEAREST = 0 - BOX = 4 - BILINEAR = 2 - HAMMING = 5 - BICUBIC = 3 - LANCZOS = 1 - - -_filters_support = { - Resampling.BOX: 0.5, - Resampling.BILINEAR: 1.0, - Resampling.HAMMING: 1.0, - Resampling.BICUBIC: 2.0, - Resampling.LANCZOS: 3.0, -} - - -# dithers -class Dither(IntEnum): - NONE = 0 - ORDERED = 1 # Not yet implemented - RASTERIZE = 2 # Not yet implemented - FLOYDSTEINBERG = 3 # default - - -# palettes/quantizers -class Palette(IntEnum): - WEB = 0 - ADAPTIVE = 1 - - -class Quantize(IntEnum): - MEDIANCUT = 0 - MAXCOVERAGE = 1 - FASTOCTREE = 2 - LIBIMAGEQUANT = 3 - - -module = sys.modules[__name__] -for enum in (Transpose, Transform, Resampling, Dither, Palette, Quantize): - for item in enum: - setattr(module, item.name, item.value) - - -if hasattr(core, "DEFAULT_STRATEGY"): - DEFAULT_STRATEGY = core.DEFAULT_STRATEGY - FILTERED = core.FILTERED - HUFFMAN_ONLY = core.HUFFMAN_ONLY - RLE = core.RLE - FIXED = core.FIXED - - -# -------------------------------------------------------------------- -# Registries - -if TYPE_CHECKING: - from . import ImageFile -ID: list[str] = [] -OPEN: dict[ - str, - tuple[ - Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], - Callable[[bytes], bool] | None, - ], -] = {} -MIME: dict[str, str] = {} -SAVE: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} -SAVE_ALL: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} -EXTENSION: dict[str, str] = {} -DECODERS: dict[str, type[ImageFile.PyDecoder]] = {} -ENCODERS: dict[str, type[ImageFile.PyEncoder]] = {} - -# -------------------------------------------------------------------- -# Modes - -_ENDIAN = "<" if sys.byteorder == "little" else ">" - - -def _conv_type_shape(im): - m = ImageMode.getmode(im.mode) - shape = (im.height, im.width) - extra = len(m.bands) - if extra != 1: - shape += (extra,) - return shape, m.typestr - - -MODES = ["1", "CMYK", "F", "HSV", "I", "L", "LAB", "P", "RGB", "RGBA", "RGBX", "YCbCr"] - -# raw modes that may be memory mapped. NOTE: if you change this, you -# may have to modify the stride calculation in map.c too! -_MAPMODES = ("L", "P", "RGBX", "RGBA", "CMYK", "I;16", "I;16L", "I;16B") - - -def getmodebase(mode: str) -> str: - """ - Gets the "base" mode for given mode. This function returns "L" for - images that contain grayscale data, and "RGB" for images that - contain color data. - - :param mode: Input mode. - :returns: "L" or "RGB". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basemode - - -def getmodetype(mode: str) -> str: - """ - Gets the storage type mode. Given a mode, this function returns a - single-layer mode suitable for storing individual bands. - - :param mode: Input mode. - :returns: "L", "I", or "F". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basetype - - -def getmodebandnames(mode: str) -> tuple[str, ...]: - """ - Gets a list of individual band names. Given a mode, this function returns - a tuple containing the names of individual bands (use - :py:method:`~PIL.Image.getmodetype` to get the mode used to store each - individual band. - - :param mode: Input mode. - :returns: A tuple containing band names. The length of the tuple - gives the number of bands in an image of the given mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).bands - - -def getmodebands(mode: str) -> int: - """ - Gets the number of individual bands for this mode. - - :param mode: Input mode. - :returns: The number of bands in this mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return len(ImageMode.getmode(mode).bands) - - -# -------------------------------------------------------------------- -# Helpers - -_initialized = 0 - - -def preinit() -> None: - """ - Explicitly loads BMP, GIF, JPEG, PPM and PPM file format drivers. - - It is called when opening or saving images. - """ - - global _initialized - if _initialized >= 1: - return - - try: - from . import BmpImagePlugin - - assert BmpImagePlugin - except ImportError: - pass - try: - from . import GifImagePlugin - - assert GifImagePlugin - except ImportError: - pass - try: - from . import JpegImagePlugin - - assert JpegImagePlugin - except ImportError: - pass - try: - from . import PpmImagePlugin - - assert PpmImagePlugin - except ImportError: - pass - try: - from . import PngImagePlugin - - assert PngImagePlugin - except ImportError: - pass - - _initialized = 1 - - -def init(): - """ - Explicitly initializes the Python Imaging Library. This function - loads all available file format drivers. - - It is called when opening or saving images if :py:meth:`~preinit()` is - insufficient, and by :py:meth:`~PIL.features.pilinfo`. - """ - - global _initialized - if _initialized >= 2: - return 0 - - parent_name = __name__.rpartition(".")[0] - for plugin in _plugins: - try: - logger.debug("Importing %s", plugin) - __import__(f"{parent_name}.{plugin}", globals(), locals(), []) - except ImportError as e: - logger.debug("Image: failed to import %s: %s", plugin, e) - - if OPEN or SAVE: - _initialized = 2 - return 1 - - -# -------------------------------------------------------------------- -# Codec factories (used by tobytes/frombytes and ImageFile.load) - - -def _getdecoder(mode, decoder_name, args, extra=()): - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - decoder = DECODERS[decoder_name] - except KeyError: - pass - else: - return decoder(mode, *args + extra) - - try: - # get decoder - decoder = getattr(core, decoder_name + "_decoder") - except AttributeError as e: - msg = f"decoder {decoder_name} not available" - raise OSError(msg) from e - return decoder(mode, *args + extra) - - -def _getencoder(mode, encoder_name, args, extra=()): - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - encoder = ENCODERS[encoder_name] - except KeyError: - pass - else: - return encoder(mode, *args + extra) - - try: - # get encoder - encoder = getattr(core, encoder_name + "_encoder") - except AttributeError as e: - msg = f"encoder {encoder_name} not available" - raise OSError(msg) from e - return encoder(mode, *args + extra) - - -# -------------------------------------------------------------------- -# Simple expression analyzer - - -class _E: - def __init__(self, scale, offset) -> None: - self.scale = scale - self.offset = offset - - def __neg__(self): - return _E(-self.scale, -self.offset) - - def __add__(self, other): - if isinstance(other, _E): - return _E(self.scale + other.scale, self.offset + other.offset) - return _E(self.scale, self.offset + other) - - __radd__ = __add__ - - def __sub__(self, other): - return self + -other - - def __rsub__(self, other): - return other + -self - - def __mul__(self, other): - if isinstance(other, _E): - return NotImplemented - return _E(self.scale * other, self.offset * other) - - __rmul__ = __mul__ - - def __truediv__(self, other): - if isinstance(other, _E): - return NotImplemented - return _E(self.scale / other, self.offset / other) - - -def _getscaleoffset(expr): - a = expr(_E(1, 0)) - return (a.scale, a.offset) if isinstance(a, _E) else (0, a) - - -# -------------------------------------------------------------------- -# Implementation wrapper - - -class Image: - """ - This class represents an image object. To create - :py:class:`~PIL.Image.Image` objects, use the appropriate factory - functions. There's hardly ever any reason to call the Image constructor - directly. - - * :py:func:`~PIL.Image.open` - * :py:func:`~PIL.Image.new` - * :py:func:`~PIL.Image.frombytes` - """ - - format: str | None = None - format_description: str | None = None - _close_exclusive_fp_after_loading = True - - def __init__(self): - # FIXME: take "new" parameters / other image? - # FIXME: turn mode and size into delegating properties? - self.im = None - self._mode = "" - self._size = (0, 0) - self.palette = None - self.info = {} - self.readonly = 0 - self.pyaccess = None - self._exif = None - - @property - def width(self) -> int: - return self.size[0] - - @property - def height(self) -> int: - return self.size[1] - - @property - def size(self) -> tuple[int, int]: - return self._size - - @property - def mode(self): - return self._mode - - def _new(self, im) -> Image: - new = Image() - new.im = im - new._mode = im.mode - new._size = im.size - if im.mode in ("P", "PA"): - if self.palette: - new.palette = self.palette.copy() - else: - from . import ImagePalette - - new.palette = ImagePalette.ImagePalette() - new.info = self.info.copy() - return new - - # Context manager support - def __enter__(self): - return self - - def _close_fp(self): - if getattr(self, "_fp", False): - if self._fp != self.fp: - self._fp.close() - self._fp = DeferredError(ValueError("Operation on closed image")) - if self.fp: - self.fp.close() - - def __exit__(self, *args): - if hasattr(self, "fp"): - if getattr(self, "_exclusive_fp", False): - self._close_fp() - self.fp = None - - def close(self) -> None: - """ - Closes the file pointer, if possible. - - This operation will destroy the image core and release its memory. - The image data will be unusable afterward. - - This function is required to close images that have multiple frames or - have not had their file read and closed by the - :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for - more information. - """ - if hasattr(self, "fp"): - try: - self._close_fp() - self.fp = None - except Exception as msg: - logger.debug("Error closing: %s", msg) - - if getattr(self, "map", None): - self.map = None - - # Instead of simply setting to None, we're setting up a - # deferred error that will better explain that the core image - # object is gone. - self.im = DeferredError(ValueError("Operation on closed image")) - - def _copy(self) -> None: - self.load() - self.im = self.im.copy() - self.pyaccess = None - self.readonly = 0 - - def _ensure_mutable(self) -> None: - if self.readonly: - self._copy() - else: - self.load() - - def _dump( - self, file: str | None = None, format: str | None = None, **options - ) -> str: - suffix = "" - if format: - suffix = "." + format - - if not file: - f, filename = tempfile.mkstemp(suffix) - os.close(f) - else: - filename = file - if not filename.endswith(suffix): - filename = filename + suffix - - self.load() - - if not format or format == "PPM": - self.im.save_ppm(filename) - else: - self.save(filename, format, **options) - - return filename - - def __eq__(self, other): - return ( - self.__class__ is other.__class__ - and self.mode == other.mode - and self.size == other.size - and self.info == other.info - and self.getpalette() == other.getpalette() - and self.tobytes() == other.tobytes() - ) - - def __repr__(self) -> str: - return "<%s.%s image mode=%s size=%dx%d at 0x%X>" % ( - self.__class__.__module__, - self.__class__.__name__, - self.mode, - self.size[0], - self.size[1], - id(self), - ) - - def _repr_pretty_(self, p, cycle) -> None: - """IPython plain text display support""" - - # Same as __repr__ but without unpredictable id(self), - # to keep Jupyter notebook `text/plain` output stable. - p.text( - "<%s.%s image mode=%s size=%dx%d>" - % ( - self.__class__.__module__, - self.__class__.__name__, - self.mode, - self.size[0], - self.size[1], - ) - ) - - def _repr_image(self, image_format, **kwargs): - """Helper function for iPython display hook. - - :param image_format: Image format. - :returns: image as bytes, saved into the given format. - """ - b = io.BytesIO() - try: - self.save(b, image_format, **kwargs) - except Exception: - return None - return b.getvalue() - - def _repr_png_(self): - """iPython display hook support for PNG format. - - :returns: PNG version of the image as bytes - """ - return self._repr_image("PNG", compress_level=1) - - def _repr_jpeg_(self): - """iPython display hook support for JPEG format. - - :returns: JPEG version of the image as bytes - """ - return self._repr_image("JPEG") - - @property - def __array_interface__(self): - # numpy array interface support - new = {"version": 3} - try: - if self.mode == "1": - # Binary images need to be extended from bits to bytes - # See: https://github.com/python-pillow/Pillow/issues/350 - new["data"] = self.tobytes("raw", "L") - else: - new["data"] = self.tobytes() - except Exception as e: - if not isinstance(e, (MemoryError, RecursionError)): - try: - import numpy - from packaging.version import parse as parse_version - except ImportError: - pass - else: - if parse_version(numpy.__version__) < parse_version("1.23"): - warnings.warn(str(e)) - raise - new["shape"], new["typestr"] = _conv_type_shape(self) - return new - - def __getstate__(self): - im_data = self.tobytes() # load image first - return [self.info, self.mode, self.size, self.getpalette(), im_data] - - def __setstate__(self, state) -> None: - Image.__init__(self) - info, mode, size, palette, data = state - self.info = info - self._mode = mode - self._size = size - self.im = core.new(mode, size) - if mode in ("L", "LA", "P", "PA") and palette: - self.putpalette(palette) - self.frombytes(data) - - def tobytes(self, encoder_name: str = "raw", *args) -> bytes: - """ - Return image as a bytes object. - - .. warning:: - - This method returns the raw image data from the internal - storage. For compressed image data (e.g. PNG, JPEG) use - :meth:`~.save`, with a BytesIO parameter for in-memory - data. - - :param encoder_name: What encoder to use. The default is to - use the standard "raw" encoder. - - A list of C encoders can be seen under - codecs section of the function array in - :file:`_imaging.c`. Python encoders are - registered within the relevant plugins. - :param args: Extra arguments to the encoder. - :returns: A :py:class:`bytes` object. - """ - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if encoder_name == "raw" and args == (): - args = self.mode - - self.load() - - if self.width == 0 or self.height == 0: - return b"" - - # unpack data - e = _getencoder(self.mode, encoder_name, args) - e.setimage(self.im) - - bufsize = max(65536, self.size[0] * 4) # see RawEncode.c - - output = [] - while True: - bytes_consumed, errcode, data = e.encode(bufsize) - output.append(data) - if errcode: - break - if errcode < 0: - msg = f"encoder error {errcode} in tobytes" - raise RuntimeError(msg) - - return b"".join(output) - - def tobitmap(self, name: str = "image") -> bytes: - """ - Returns the image converted to an X11 bitmap. - - .. note:: This method only works for mode "1" images. - - :param name: The name prefix to use for the bitmap variables. - :returns: A string containing an X11 bitmap. - :raises ValueError: If the mode is not "1" - """ - - self.load() - if self.mode != "1": - msg = "not a bitmap" - raise ValueError(msg) - data = self.tobytes("xbm") - return b"".join( - [ - f"#define {name}_width {self.size[0]}\n".encode("ascii"), - f"#define {name}_height {self.size[1]}\n".encode("ascii"), - f"static char {name}_bits[] = {{\n".encode("ascii"), - data, - b"};", - ] - ) - - def frombytes(self, data: bytes, decoder_name: str = "raw", *args) -> None: - """ - Loads this image with pixel data from a bytes object. - - This method is similar to the :py:func:`~PIL.Image.frombytes` function, - but loads data into this image instead of creating a new image object. - """ - - if self.width == 0 or self.height == 0: - return - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - # default format - if decoder_name == "raw" and args == (): - args = self.mode - - # unpack data - d = _getdecoder(self.mode, decoder_name, args) - d.setimage(self.im) - s = d.decode(data) - - if s[0] >= 0: - msg = "not enough image data" - raise ValueError(msg) - if s[1] != 0: - msg = "cannot decode image data" - raise ValueError(msg) - - def load(self): - """ - Allocates storage for the image and loads the pixel data. In - normal cases, you don't need to call this method, since the - Image class automatically loads an opened image when it is - accessed for the first time. - - If the file associated with the image was opened by Pillow, then this - method will close it. The exception to this is if the image has - multiple frames, in which case the file will be left open for seek - operations. See :ref:`file-handling` for more information. - - :returns: An image access object. - :rtype: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` - """ - if self.im is not None and self.palette and self.palette.dirty: - # realize palette - mode, arr = self.palette.getdata() - self.im.putpalette(mode, arr) - self.palette.dirty = 0 - self.palette.rawmode = None - if "transparency" in self.info and mode in ("LA", "PA"): - if isinstance(self.info["transparency"], int): - self.im.putpalettealpha(self.info["transparency"], 0) - else: - self.im.putpalettealphas(self.info["transparency"]) - self.palette.mode = "RGBA" - else: - palette_mode = "RGBA" if mode.startswith("RGBA") else "RGB" - self.palette.mode = palette_mode - self.palette.palette = self.im.getpalette(palette_mode, palette_mode) - - if self.im is not None: - if cffi and USE_CFFI_ACCESS: - if self.pyaccess: - return self.pyaccess - from . import PyAccess - - self.pyaccess = PyAccess.new(self, self.readonly) - if self.pyaccess: - return self.pyaccess - return self.im.pixel_access(self.readonly) - - def verify(self): - """ - Verifies the contents of a file. For data read from a file, this - method attempts to determine if the file is broken, without - actually decoding the image data. If this method finds any - problems, it raises suitable exceptions. If you need to load - the image after using this method, you must reopen the image - file. - """ - pass - - def convert( - self, - mode: str | None = None, - matrix: tuple[float, ...] | None = None, - dither: Dither | None = None, - palette: Palette = Palette.WEB, - colors: int = 256, - ) -> Image: - """ - Returns a converted copy of this image. For the "P" mode, this - method translates pixels through the palette. If mode is - omitted, a mode is chosen so that all information in the image - and the palette can be represented without a palette. - - This supports all possible conversions between "L", "RGB" and "CMYK". The - ``matrix`` argument only supports "L" and "RGB". - - When translating a color image to grayscale (mode "L"), - the library uses the ITU-R 601-2 luma transform:: - - L = R * 299/1000 + G * 587/1000 + B * 114/1000 - - The default method of converting a grayscale ("L") or "RGB" - image into a bilevel (mode "1") image uses Floyd-Steinberg - dither to approximate the original image luminosity levels. If - dither is ``None``, all values larger than 127 are set to 255 (white), - all other values to 0 (black). To use other thresholds, use the - :py:meth:`~PIL.Image.Image.point` method. - - When converting from "RGBA" to "P" without a ``matrix`` argument, - this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, - and ``dither`` and ``palette`` are ignored. - - When converting from "PA", if an "RGBA" palette is present, the alpha - channel from the image will be used instead of the values from the palette. - - :param mode: The requested mode. See: :ref:`concept-modes`. - :param matrix: An optional conversion matrix. If given, this - should be 4- or 12-tuple containing floating point values. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). Note that this is not used when ``matrix`` is supplied. - :param palette: Palette to use when converting from mode "RGB" - to "P". Available palettes are :data:`Palette.WEB` or - :data:`Palette.ADAPTIVE`. - :param colors: Number of colors to use for the :data:`Palette.ADAPTIVE` - palette. Defaults to 256. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - self.load() - - has_transparency = "transparency" in self.info - if not mode and self.mode == "P": - # determine default mode - if self.palette: - mode = self.palette.mode - else: - mode = "RGB" - if mode == "RGB" and has_transparency: - mode = "RGBA" - if not mode or (mode == self.mode and not matrix): - return self.copy() - - if matrix: - # matrix conversion - if mode not in ("L", "RGB"): - msg = "illegal conversion" - raise ValueError(msg) - im = self.im.convert_matrix(mode, matrix) - new_im = self._new(im) - if has_transparency and self.im.bands == 3: - transparency = new_im.info["transparency"] - - def convert_transparency(m, v): - v = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 - return max(0, min(255, int(v))) - - if mode == "L": - transparency = convert_transparency(matrix, transparency) - elif len(mode) == 3: - transparency = tuple( - convert_transparency(matrix[i * 4 : i * 4 + 4], transparency) - for i in range(0, len(transparency)) - ) - new_im.info["transparency"] = transparency - return new_im - - if mode == "P" and self.mode == "RGBA": - return self.quantize(colors) - - trns = None - delete_trns = False - # transparency handling - if has_transparency: - if (self.mode in ("1", "L", "I", "I;16") and mode in ("LA", "RGBA")) or ( - self.mode == "RGB" and mode in ("La", "LA", "RGBa", "RGBA") - ): - # Use transparent conversion to promote from transparent - # color to an alpha channel. - new_im = self._new( - self.im.convert_transparent(mode, self.info["transparency"]) - ) - del new_im.info["transparency"] - return new_im - elif self.mode in ("L", "RGB", "P") and mode in ("L", "RGB", "P"): - t = self.info["transparency"] - if isinstance(t, bytes): - # Dragons. This can't be represented by a single color - warnings.warn( - "Palette images with Transparency expressed in bytes should be " - "converted to RGBA images" - ) - delete_trns = True - else: - # get the new transparency color. - # use existing conversions - trns_im = new(self.mode, (1, 1)) - if self.mode == "P": - trns_im.putpalette(self.palette) - if isinstance(t, tuple): - err = "Couldn't allocate a palette color for transparency" - try: - t = trns_im.palette.getcolor(t, self) - except ValueError as e: - if str(e) == "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - t = None - else: - raise ValueError(err) from e - if t is None: - trns = None - else: - trns_im.putpixel((0, 0), t) - - if mode in ("L", "RGB"): - trns_im = trns_im.convert(mode) - else: - # can't just retrieve the palette number, got to do it - # after quantization. - trns_im = trns_im.convert("RGB") - trns = trns_im.getpixel((0, 0)) - - elif self.mode == "P" and mode in ("LA", "PA", "RGBA"): - t = self.info["transparency"] - delete_trns = True - - if isinstance(t, bytes): - self.im.putpalettealphas(t) - elif isinstance(t, int): - self.im.putpalettealpha(t, 0) - else: - msg = "Transparency for P mode should be bytes or int" - raise ValueError(msg) - - if mode == "P" and palette == Palette.ADAPTIVE: - im = self.im.quantize(colors) - new_im = self._new(im) - from . import ImagePalette - - new_im.palette = ImagePalette.ImagePalette( - "RGB", new_im.im.getpalette("RGB") - ) - if delete_trns: - # This could possibly happen if we requantize to fewer colors. - # The transparency would be totally off in that case. - del new_im.info["transparency"] - if trns is not None: - try: - new_im.info["transparency"] = new_im.palette.getcolor(trns, new_im) - except Exception: - # if we can't make a transparent color, don't leave the old - # transparency hanging around to mess us up. - del new_im.info["transparency"] - warnings.warn("Couldn't allocate palette entry for transparency") - return new_im - - if "LAB" in (self.mode, mode): - other_mode = mode if self.mode == "LAB" else self.mode - if other_mode in ("RGB", "RGBA", "RGBX"): - from . import ImageCms - - srgb = ImageCms.createProfile("sRGB") - lab = ImageCms.createProfile("LAB") - profiles = [lab, srgb] if self.mode == "LAB" else [srgb, lab] - transform = ImageCms.buildTransform( - profiles[0], profiles[1], self.mode, mode - ) - return transform.apply(self) - - # colorspace conversion - if dither is None: - dither = Dither.FLOYDSTEINBERG - - try: - im = self.im.convert(mode, dither) - except ValueError: - try: - # normalize source image and try again - modebase = getmodebase(self.mode) - if modebase == self.mode: - raise - im = self.im.convert(modebase) - im = im.convert(mode, dither) - except KeyError as e: - msg = "illegal conversion" - raise ValueError(msg) from e - - new_im = self._new(im) - if mode == "P" and palette != Palette.ADAPTIVE: - from . import ImagePalette - - new_im.palette = ImagePalette.ImagePalette("RGB", im.getpalette("RGB")) - if delete_trns: - # crash fail if we leave a bytes transparency in an rgb/l mode. - del new_im.info["transparency"] - if trns is not None: - if new_im.mode == "P": - try: - new_im.info["transparency"] = new_im.palette.getcolor(trns, new_im) - except ValueError as e: - del new_im.info["transparency"] - if str(e) != "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - warnings.warn( - "Couldn't allocate palette entry for transparency" - ) - else: - new_im.info["transparency"] = trns - return new_im - - def quantize( - self, - colors: int = 256, - method: Quantize | None = None, - kmeans: int = 0, - palette=None, - dither: Dither = Dither.FLOYDSTEINBERG, - ) -> Image: - """ - Convert the image to 'P' mode with the specified number - of colors. - - :param colors: The desired number of colors, <= 256 - :param method: :data:`Quantize.MEDIANCUT` (median cut), - :data:`Quantize.MAXCOVERAGE` (maximum coverage), - :data:`Quantize.FASTOCTREE` (fast octree), - :data:`Quantize.LIBIMAGEQUANT` (libimagequant; check support - using :py:func:`PIL.features.check_feature` with - ``feature="libimagequant"``). - - By default, :data:`Quantize.MEDIANCUT` will be used. - - The exception to this is RGBA images. :data:`Quantize.MEDIANCUT` - and :data:`Quantize.MAXCOVERAGE` do not support RGBA images, so - :data:`Quantize.FASTOCTREE` is used by default instead. - :param kmeans: Integer greater than or equal to zero. - :param palette: Quantize to the palette of given - :py:class:`PIL.Image.Image`. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). - :returns: A new image - """ - - self.load() - - if method is None: - # defaults: - method = Quantize.MEDIANCUT - if self.mode == "RGBA": - method = Quantize.FASTOCTREE - - if self.mode == "RGBA" and method not in ( - Quantize.FASTOCTREE, - Quantize.LIBIMAGEQUANT, - ): - # Caller specified an invalid mode. - msg = ( - "Fast Octree (method == 2) and libimagequant (method == 3) " - "are the only valid methods for quantizing RGBA images" - ) - raise ValueError(msg) - - if palette: - # use palette from reference image - palette.load() - if palette.mode != "P": - msg = "bad mode for palette image" - raise ValueError(msg) - if self.mode not in {"RGB", "L"}: - msg = "only RGB or L mode images can be quantized to a palette" - raise ValueError(msg) - im = self.im.convert("P", dither, palette.im) - new_im = self._new(im) - new_im.palette = palette.palette.copy() - return new_im - - if kmeans < 0: - msg = "kmeans must not be negative" - raise ValueError(msg) - - im = self._new(self.im.quantize(colors, method, kmeans)) - - from . import ImagePalette - - mode = im.im.getpalettemode() - palette = im.im.getpalette(mode, mode)[: colors * len(mode)] - im.palette = ImagePalette.ImagePalette(mode, palette) - - return im - - def copy(self) -> Image: - """ - Copies this image. Use this method if you wish to paste things - into an image, but still retain the original. - - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - self.load() - return self._new(self.im.copy()) - - __copy__ = copy - - def crop(self, box: tuple[int, int, int, int] | None = None) -> Image: - """ - Returns a rectangular region from this image. The box is a - 4-tuple defining the left, upper, right, and lower pixel - coordinate. See :ref:`coordinate-system`. - - Note: Prior to Pillow 3.4.0, this was a lazy operation. - - :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if box is None: - return self.copy() - - if box[2] < box[0]: - msg = "Coordinate 'right' is less than 'left'" - raise ValueError(msg) - elif box[3] < box[1]: - msg = "Coordinate 'lower' is less than 'upper'" - raise ValueError(msg) - - self.load() - return self._new(self._crop(self.im, box)) - - def _crop(self, im, box): - """ - Returns a rectangular region from the core image object im. - - This is equivalent to calling im.crop((x0, y0, x1, y1)), but - includes additional sanity checks. - - :param im: a core image object - :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. - :returns: A core image object. - """ - - x0, y0, x1, y1 = map(int, map(round, box)) - - absolute_values = (abs(x1 - x0), abs(y1 - y0)) - - _decompression_bomb_check(absolute_values) - - return im.crop((x0, y0, x1, y1)) - - def draft(self, mode, size): - """ - Configures the image file loader so it returns a version of the - image that as closely as possible matches the given mode and - size. For example, you can use this method to convert a color - JPEG to grayscale while loading it. - - If any changes are made, returns a tuple with the chosen ``mode`` and - ``box`` with coordinates of the original image within the altered one. - - Note that this method modifies the :py:class:`~PIL.Image.Image` object - in place. If the image has already been loaded, this method has no - effect. - - Note: This method is not implemented for most images. It is - currently implemented only for JPEG and MPO images. - - :param mode: The requested mode. - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - """ - pass - - def _expand(self, xmargin, ymargin=None): - if ymargin is None: - ymargin = xmargin - self.load() - return self._new(self.im.expand(xmargin, ymargin)) - - def filter(self, filter): - """ - Filters this image using the given filter. For a list of - available filters, see the :py:mod:`~PIL.ImageFilter` module. - - :param filter: Filter kernel. - :returns: An :py:class:`~PIL.Image.Image` object.""" - - from . import ImageFilter - - self.load() - - if isinstance(filter, Callable): - filter = filter() - if not hasattr(filter, "filter"): - msg = "filter argument should be ImageFilter.Filter instance or class" - raise TypeError(msg) - - multiband = isinstance(filter, ImageFilter.MultibandFilter) - if self.im.bands == 1 or multiband: - return self._new(filter.filter(self.im)) - - ims = [ - self._new(filter.filter(self.im.getband(c))) for c in range(self.im.bands) - ] - return merge(self.mode, ims) - - def getbands(self) -> tuple[str, ...]: - """ - Returns a tuple containing the name of each band in this image. - For example, ``getbands`` on an RGB image returns ("R", "G", "B"). - - :returns: A tuple containing band names. - :rtype: tuple - """ - return ImageMode.getmode(self.mode).bands - - def getbbox(self, *, alpha_only: bool = True) -> tuple[int, int, int, int]: - """ - Calculates the bounding box of the non-zero regions in the - image. - - :param alpha_only: Optional flag, defaulting to ``True``. - If ``True`` and the image has an alpha channel, trim transparent pixels. - Otherwise, trim pixels when all channels are zero. - Keyword-only argument. - :returns: The bounding box is returned as a 4-tuple defining the - left, upper, right, and lower pixel coordinate. See - :ref:`coordinate-system`. If the image is completely empty, this - method returns None. - - """ - - self.load() - return self.im.getbbox(alpha_only) - - def getcolors(self, maxcolors: int = 256): - """ - Returns a list of colors used in this image. - - The colors will be in the image's mode. For example, an RGB image will - return a tuple of (red, green, blue) color values, and a P image will - return the index of the color in the palette. - - :param maxcolors: Maximum number of colors. If this number is - exceeded, this method returns None. The default limit is - 256 colors. - :returns: An unsorted list of (count, pixel) values. - """ - - self.load() - if self.mode in ("1", "L", "P"): - h = self.im.histogram() - out = [(h[i], i) for i in range(256) if h[i]] - if len(out) > maxcolors: - return None - return out - return self.im.getcolors(maxcolors) - - def getdata(self, band: int | None = None): - """ - Returns the contents of this image as a sequence object - containing pixel values. The sequence object is flattened, so - that values for line one follow directly after the values of - line zero, and so on. - - Note that the sequence object returned by this method is an - internal PIL data type, which only supports certain sequence - operations. To convert it to an ordinary sequence (e.g. for - printing), use ``list(im.getdata())``. - - :param band: What band to return. The default is to return - all bands. To return a single band, pass in the index - value (e.g. 0 to get the "R" band from an "RGB" image). - :returns: A sequence-like object. - """ - - self.load() - if band is not None: - return self.im.getband(band) - return self.im # could be abused - - def getextrema(self) -> tuple[float, float] | tuple[tuple[int, int], ...]: - """ - Gets the minimum and maximum pixel values for each band in - the image. - - :returns: For a single-band image, a 2-tuple containing the - minimum and maximum pixel value. For a multi-band image, - a tuple containing one 2-tuple for each band. - """ - - self.load() - if self.im.bands > 1: - return tuple(self.im.getband(i).getextrema() for i in range(self.im.bands)) - return self.im.getextrema() - - def _getxmp(self, xmp_tags): - def get_name(tag): - return re.sub("^{[^}]+}", "", tag) - - def get_value(element): - value = {get_name(k): v for k, v in element.attrib.items()} - children = list(element) - if children: - for child in children: - name = get_name(child.tag) - child_value = get_value(child) - if name in value: - if not isinstance(value[name], list): - value[name] = [value[name]] - value[name].append(child_value) - else: - value[name] = child_value - elif value: - if element.text: - value["text"] = element.text - else: - return element.text - return value - - if ElementTree is None: - warnings.warn("XMP data cannot be read without defusedxml dependency") - return {} - else: - root = ElementTree.fromstring(xmp_tags) - return {get_name(root.tag): get_value(root)} - - def getexif(self) -> Exif: - """ - Gets EXIF data from the image. - - :returns: an :py:class:`~PIL.Image.Exif` object. - """ - if self._exif is None: - self._exif = Exif() - elif self._exif._loaded: - return self._exif - self._exif._loaded = True - - exif_info = self.info.get("exif") - if exif_info is None: - if "Raw profile type exif" in self.info: - exif_info = bytes.fromhex( - "".join(self.info["Raw profile type exif"].split("\n")[3:]) - ) - elif hasattr(self, "tag_v2"): - self._exif.bigtiff = self.tag_v2._bigtiff - self._exif.endian = self.tag_v2._endian - self._exif.load_from_fp(self.fp, self.tag_v2._offset) - if exif_info is not None: - self._exif.load(exif_info) - - # XMP tags - if ExifTags.Base.Orientation not in self._exif: - xmp_tags = self.info.get("XML:com.adobe.xmp") - if xmp_tags: - match = re.search(r'tiff:Orientation(="|>)([0-9])', xmp_tags) - if match: - self._exif[ExifTags.Base.Orientation] = int(match[2]) - - return self._exif - - def _reload_exif(self) -> None: - if self._exif is None or not self._exif._loaded: - return - self._exif._loaded = False - self.getexif() - - def get_child_images(self): - child_images = [] - exif = self.getexif() - ifds = [] - if ExifTags.Base.SubIFDs in exif: - subifd_offsets = exif[ExifTags.Base.SubIFDs] - if subifd_offsets: - if not isinstance(subifd_offsets, tuple): - subifd_offsets = (subifd_offsets,) - for subifd_offset in subifd_offsets: - ifds.append((exif._get_ifd_dict(subifd_offset), subifd_offset)) - ifd1 = exif.get_ifd(ExifTags.IFD.IFD1) - if ifd1 and ifd1.get(513): - ifds.append((ifd1, exif._info.next)) - - offset = None - for ifd, ifd_offset in ifds: - current_offset = self.fp.tell() - if offset is None: - offset = current_offset - - fp = self.fp - thumbnail_offset = ifd.get(513) - if thumbnail_offset is not None: - try: - thumbnail_offset += self._exif_offset - except AttributeError: - pass - self.fp.seek(thumbnail_offset) - data = self.fp.read(ifd.get(514)) - fp = io.BytesIO(data) - - with open(fp) as im: - if thumbnail_offset is None: - im._frame_pos = [ifd_offset] - im._seek(0) - im.load() - child_images.append(im) - - if offset is not None: - self.fp.seek(offset) - return child_images - - def getim(self): - """ - Returns a capsule that points to the internal image memory. - - :returns: A capsule object. - """ - - self.load() - return self.im.ptr - - def getpalette(self, rawmode: str | None = "RGB") -> list[int] | None: - """ - Returns the image palette as a list. - - :param rawmode: The mode in which to return the palette. ``None`` will - return the palette in its current mode. - - .. versionadded:: 9.1.0 - - :returns: A list of color values [r, g, b, ...], or None if the - image has no palette. - """ - - self.load() - try: - mode = self.im.getpalettemode() - except ValueError: - return None # no palette - if rawmode is None: - rawmode = mode - return list(self.im.getpalette(mode, rawmode)) - - @property - def has_transparency_data(self) -> bool: - """ - Determine if an image has transparency data, whether in the form of an - alpha channel, a palette with an alpha channel, or a "transparency" key - in the info dictionary. - - Note the image might still appear solid, if all of the values shown - within are opaque. - - :returns: A boolean. - """ - return ( - self.mode in ("LA", "La", "PA", "RGBA", "RGBa") - or (self.mode == "P" and self.palette.mode.endswith("A")) - or "transparency" in self.info - ) - - def apply_transparency(self): - """ - If a P mode image has a "transparency" key in the info dictionary, - remove the key and instead apply the transparency to the palette. - Otherwise, the image is unchanged. - """ - if self.mode != "P" or "transparency" not in self.info: - return - - from . import ImagePalette - - palette = self.getpalette("RGBA") - transparency = self.info["transparency"] - if isinstance(transparency, bytes): - for i, alpha in enumerate(transparency): - palette[i * 4 + 3] = alpha - else: - palette[transparency * 4 + 3] = 0 - self.palette = ImagePalette.ImagePalette("RGBA", bytes(palette)) - self.palette.dirty = 1 - - del self.info["transparency"] - - def getpixel(self, xy): - """ - Returns the pixel value at a given position. - - :param xy: The coordinate, given as (x, y). See - :ref:`coordinate-system`. - :returns: The pixel value. If the image is a multi-layer image, - this method returns a tuple. - """ - - self.load() - if self.pyaccess: - return self.pyaccess.getpixel(xy) - return self.im.getpixel(tuple(xy)) - - def getprojection(self) -> tuple[list[int], list[int]]: - """ - Get projection to x and y axes - - :returns: Two sequences, indicating where there are non-zero - pixels along the X-axis and the Y-axis, respectively. - """ - - self.load() - x, y = self.im.getprojection() - return list(x), list(y) - - def histogram(self, mask: Image | None = None, extrema=None) -> list[int]: - """ - Returns a histogram for the image. The histogram is returned as a - list of pixel counts, one for each pixel value in the source - image. Counts are grouped into 256 bins for each band, even if - the image has more than 8 bits per band. If the image has more - than one band, the histograms for all bands are concatenated (for - example, the histogram for an "RGB" image contains 768 values). - - A bilevel image (mode "1") is treated as a grayscale ("L") image - by this method. - - If a mask is provided, the method returns a histogram for those - parts of the image where the mask image is non-zero. The mask - image must have the same size as the image, and be either a - bi-level image (mode "1") or a grayscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A list containing pixel counts. - """ - self.load() - if mask: - mask.load() - return self.im.histogram((0, 0), mask.im) - if self.mode in ("I", "F"): - if extrema is None: - extrema = self.getextrema() - return self.im.histogram(extrema) - return self.im.histogram() - - def entropy(self, mask=None, extrema=None): - """ - Calculates and returns the entropy for the image. - - A bilevel image (mode "1") is treated as a grayscale ("L") - image by this method. - - If a mask is provided, the method employs the histogram for - those parts of the image where the mask image is non-zero. - The mask image must have the same size as the image, and be - either a bi-level image (mode "1") or a grayscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A float value representing the image entropy - """ - self.load() - if mask: - mask.load() - return self.im.entropy((0, 0), mask.im) - if self.mode in ("I", "F"): - if extrema is None: - extrema = self.getextrema() - return self.im.entropy(extrema) - return self.im.entropy() - - def paste(self, im, box=None, mask=None) -> None: - """ - Pastes another image into this image. The box argument is either - a 2-tuple giving the upper left corner, a 4-tuple defining the - left, upper, right, and lower pixel coordinate, or None (same as - (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size - of the pasted image must match the size of the region. - - If the modes don't match, the pasted image is converted to the mode of - this image (see the :py:meth:`~PIL.Image.Image.convert` method for - details). - - Instead of an image, the source can be a integer or tuple - containing pixel values. The method then fills the region - with the given color. When creating RGB images, you can - also use color strings as supported by the ImageColor module. - - If a mask is given, this method updates only the regions - indicated by the mask. You can use either "1", "L", "LA", "RGBA" - or "RGBa" images (if present, the alpha band is used as mask). - Where the mask is 255, the given image is copied as is. Where - the mask is 0, the current value is preserved. Intermediate - values will mix the two images together, including their alpha - channels if they have them. - - See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to - combine images with respect to their alpha channels. - - :param im: Source image or pixel value (integer or tuple). - :param box: An optional 4-tuple giving the region to paste into. - If a 2-tuple is used instead, it's treated as the upper left - corner. If omitted or None, the source is pasted into the - upper left corner. - - If an image is given as the second argument and there is no - third, the box defaults to (0, 0), and the second argument - is interpreted as a mask image. - :param mask: An optional mask image. - """ - - if isImageType(box) and mask is None: - # abbreviated paste(im, mask) syntax - mask = box - box = None - - if box is None: - box = (0, 0) - - if len(box) == 2: - # upper left corner given; get size from image or mask - if isImageType(im): - size = im.size - elif isImageType(mask): - size = mask.size - else: - # FIXME: use self.size here? - msg = "cannot determine region size; use 4-item box" - raise ValueError(msg) - box += (box[0] + size[0], box[1] + size[1]) - - if isinstance(im, str): - from . import ImageColor - - im = ImageColor.getcolor(im, self.mode) - - elif isImageType(im): - im.load() - if self.mode != im.mode: - if self.mode != "RGB" or im.mode not in ("LA", "RGBA", "RGBa"): - # should use an adapter for this! - im = im.convert(self.mode) - im = im.im - - self._ensure_mutable() - - if mask: - mask.load() - self.im.paste(im, box, mask.im) - else: - self.im.paste(im, box) - - def alpha_composite(self, im, dest=(0, 0), source=(0, 0)): - """'In-place' analog of Image.alpha_composite. Composites an image - onto this image. - - :param im: image to composite over this one - :param dest: Optional 2 tuple (left, top) specifying the upper - left corner in this (destination) image. - :param source: Optional 2 (left, top) tuple for the upper left - corner in the overlay source image, or 4 tuple (left, top, right, - bottom) for the bounds of the source rectangle - - Performance Note: Not currently implemented in-place in the core layer. - """ - - if not isinstance(source, (list, tuple)): - msg = "Source must be a tuple" - raise ValueError(msg) - if not isinstance(dest, (list, tuple)): - msg = "Destination must be a tuple" - raise ValueError(msg) - if len(source) not in (2, 4): - msg = "Source must be a 2 or 4-tuple" - raise ValueError(msg) - if not len(dest) == 2: - msg = "Destination must be a 2-tuple" - raise ValueError(msg) - if min(source) < 0: - msg = "Source must be non-negative" - raise ValueError(msg) - - if len(source) == 2: - source = source + im.size - - # over image, crop if it's not the whole thing. - if source == (0, 0) + im.size: - overlay = im - else: - overlay = im.crop(source) - - # target for the paste - box = dest + (dest[0] + overlay.width, dest[1] + overlay.height) - - # destination image. don't copy if we're using the whole image. - if box == (0, 0) + self.size: - background = self - else: - background = self.crop(box) - - result = alpha_composite(background, overlay) - self.paste(result, box) - - def point(self, lut, mode: str | None = None) -> Image: - """ - Maps this image through a lookup table or function. - - :param lut: A lookup table, containing 256 (or 65536 if - self.mode=="I" and mode == "L") values per band in the - image. A function can be used instead, it should take a - single argument. The function is called once for each - possible pixel value, and the resulting table is applied to - all bands of the image. - - It may also be an :py:class:`~PIL.Image.ImagePointHandler` - object:: - - class Example(Image.ImagePointHandler): - def point(self, data): - # Return result - :param mode: Output mode (default is same as input). This can only be used if - the source image has mode "L" or "P", and the output has mode "1" or the - source image mode is "I" and the output mode is "L". - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - self.load() - - if isinstance(lut, ImagePointHandler): - return lut.point(self) - - if callable(lut): - # if it isn't a list, it should be a function - if self.mode in ("I", "I;16", "F"): - # check if the function can be used with point_transform - # UNDONE wiredfool -- I think this prevents us from ever doing - # a gamma function point transform on > 8bit images. - scale, offset = _getscaleoffset(lut) - return self._new(self.im.point_transform(scale, offset)) - # for other modes, convert the function to a table - lut = [lut(i) for i in range(256)] * self.im.bands - - if self.mode == "F": - # FIXME: _imaging returns a confusing error message for this case - msg = "point operation not supported for this mode" - raise ValueError(msg) - - if mode != "F": - lut = [round(i) for i in lut] - return self._new(self.im.point(lut, mode)) - - def putalpha(self, alpha): - """ - Adds or replaces the alpha layer in this image. If the image - does not have an alpha layer, it's converted to "LA" or "RGBA". - The new layer must be either "L" or "1". - - :param alpha: The new alpha layer. This can either be an "L" or "1" - image having the same size as this image, or an integer or - other color value. - """ - - self._ensure_mutable() - - if self.mode not in ("LA", "PA", "RGBA"): - # attempt to promote self to a matching alpha mode - try: - mode = getmodebase(self.mode) + "A" - try: - self.im.setmode(mode) - except (AttributeError, ValueError) as e: - # do things the hard way - im = self.im.convert(mode) - if im.mode not in ("LA", "PA", "RGBA"): - msg = "alpha channel could not be added" - raise ValueError(msg) from e # sanity check - self.im = im - self.pyaccess = None - self._mode = self.im.mode - except KeyError as e: - msg = "illegal image mode" - raise ValueError(msg) from e - - if self.mode in ("LA", "PA"): - band = 1 - else: - band = 3 - - if isImageType(alpha): - # alpha layer - if alpha.mode not in ("1", "L"): - msg = "illegal image mode" - raise ValueError(msg) - alpha.load() - if alpha.mode == "1": - alpha = alpha.convert("L") - else: - # constant alpha - try: - self.im.fillband(band, alpha) - except (AttributeError, ValueError): - # do things the hard way - alpha = new("L", self.size, alpha) - else: - return - - self.im.putband(alpha.im, band) - - def putdata(self, data, scale=1.0, offset=0.0): - """ - Copies pixel data from a flattened sequence object into the image. The - values should start at the upper left corner (0, 0), continue to the - end of the line, followed directly by the first value of the second - line, and so on. Data will be read until either the image or the - sequence ends. The scale and offset values are used to adjust the - sequence values: **pixel = value*scale + offset**. - - :param data: A flattened sequence object. - :param scale: An optional scale value. The default is 1.0. - :param offset: An optional offset value. The default is 0.0. - """ - - self._ensure_mutable() - - self.im.putdata(data, scale, offset) - - def putpalette(self, data, rawmode="RGB") -> None: - """ - Attaches a palette to this image. The image must be a "P", "PA", "L" - or "LA" image. - - The palette sequence must contain at most 256 colors, made up of one - integer value for each channel in the raw mode. - For example, if the raw mode is "RGB", then it can contain at most 768 - values, made up of red, green and blue values for the corresponding pixel - index in the 256 colors. - If the raw mode is "RGBA", then it can contain at most 1024 values, - containing red, green, blue and alpha values. - - Alternatively, an 8-bit string may be used instead of an integer sequence. - - :param data: A palette sequence (either a list or a string). - :param rawmode: The raw mode of the palette. Either "RGB", "RGBA", or a mode - that can be transformed to "RGB" or "RGBA" (e.g. "R", "BGR;15", "RGBA;L"). - """ - from . import ImagePalette - - if self.mode not in ("L", "LA", "P", "PA"): - msg = "illegal image mode" - raise ValueError(msg) - if isinstance(data, ImagePalette.ImagePalette): - palette = ImagePalette.raw(data.rawmode, data.palette) - else: - if not isinstance(data, bytes): - data = bytes(data) - palette = ImagePalette.raw(rawmode, data) - self._mode = "PA" if "A" in self.mode else "P" - self.palette = palette - self.palette.mode = "RGB" - self.load() # install new palette - - def putpixel(self, xy, value): - """ - Modifies the pixel at the given position. The color is given as - a single numerical value for single-band images, and a tuple for - multi-band images. In addition to this, RGB and RGBA tuples are - accepted for P and PA images. - - Note that this method is relatively slow. For more extensive changes, - use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` - module instead. - - See: - - * :py:meth:`~PIL.Image.Image.paste` - * :py:meth:`~PIL.Image.Image.putdata` - * :py:mod:`~PIL.ImageDraw` - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :param value: The pixel value. - """ - - if self.readonly: - self._copy() - self.load() - - if self.pyaccess: - return self.pyaccess.putpixel(xy, value) - - if ( - self.mode in ("P", "PA") - and isinstance(value, (list, tuple)) - and len(value) in [3, 4] - ): - # RGB or RGBA value for a P or PA image - if self.mode == "PA": - alpha = value[3] if len(value) == 4 else 255 - value = value[:3] - value = self.palette.getcolor(value, self) - if self.mode == "PA": - value = (value, alpha) - return self.im.putpixel(xy, value) - - def remap_palette(self, dest_map, source_palette=None): - """ - Rewrites the image to reorder the palette. - - :param dest_map: A list of indexes into the original palette. - e.g. ``[1,0]`` would swap a two item palette, and ``list(range(256))`` - is the identity transform. - :param source_palette: Bytes or None. - :returns: An :py:class:`~PIL.Image.Image` object. - - """ - from . import ImagePalette - - if self.mode not in ("L", "P"): - msg = "illegal image mode" - raise ValueError(msg) - - bands = 3 - palette_mode = "RGB" - if source_palette is None: - if self.mode == "P": - self.load() - palette_mode = self.im.getpalettemode() - if palette_mode == "RGBA": - bands = 4 - source_palette = self.im.getpalette(palette_mode, palette_mode) - else: # L-mode - source_palette = bytearray(i // 3 for i in range(768)) - - palette_bytes = b"" - new_positions = [0] * 256 - - # pick only the used colors from the palette - for i, oldPosition in enumerate(dest_map): - palette_bytes += source_palette[ - oldPosition * bands : oldPosition * bands + bands - ] - new_positions[oldPosition] = i - - # replace the palette color id of all pixel with the new id - - # Palette images are [0..255], mapped through a 1 or 3 - # byte/color map. We need to remap the whole image - # from palette 1 to palette 2. New_positions is - # an array of indexes into palette 1. Palette 2 is - # palette 1 with any holes removed. - - # We're going to leverage the convert mechanism to use the - # C code to remap the image from palette 1 to palette 2, - # by forcing the source image into 'L' mode and adding a - # mapping 'L' mode palette, then converting back to 'L' - # sans palette thus converting the image bytes, then - # assigning the optimized RGB palette. - - # perf reference, 9500x4000 gif, w/~135 colors - # 14 sec prepatch, 1 sec postpatch with optimization forced. - - mapping_palette = bytearray(new_positions) - - m_im = self.copy() - m_im._mode = "P" - - m_im.palette = ImagePalette.ImagePalette( - palette_mode, palette=mapping_palette * bands - ) - # possibly set palette dirty, then - # m_im.putpalette(mapping_palette, 'L') # converts to 'P' - # or just force it. - # UNDONE -- this is part of the general issue with palettes - m_im.im.putpalette(palette_mode + ";L", m_im.palette.tobytes()) - - m_im = m_im.convert("L") - - m_im.putpalette(palette_bytes, palette_mode) - m_im.palette = ImagePalette.ImagePalette(palette_mode, palette=palette_bytes) - - if "transparency" in self.info: - try: - m_im.info["transparency"] = dest_map.index(self.info["transparency"]) - except ValueError: - if "transparency" in m_im.info: - del m_im.info["transparency"] - - return m_im - - def _get_safe_box(self, size, resample, box): - """Expands the box so it includes adjacent pixels - that may be used by resampling with the given resampling filter. - """ - filter_support = _filters_support[resample] - 0.5 - scale_x = (box[2] - box[0]) / size[0] - scale_y = (box[3] - box[1]) / size[1] - support_x = filter_support * scale_x - support_y = filter_support * scale_y - - return ( - max(0, int(box[0] - support_x)), - max(0, int(box[1] - support_y)), - min(self.size[0], math.ceil(box[2] + support_x)), - min(self.size[1], math.ceil(box[3] + support_y)), - ) - - def resize(self, size, resample=None, box=None, reducing_gap=None) -> Image: - """ - Returns a resized copy of this image. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param resample: An optional resampling filter. This can be - one of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, - :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, - :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. - If the image has mode "1" or "P", it is always set to - :py:data:`Resampling.NEAREST`. If the image mode specifies a number - of bits, such as "I;16", then the default filter is - :py:data:`Resampling.NEAREST`. Otherwise, the default filter is - :py:data:`Resampling.BICUBIC`. See: :ref:`concept-filters`. - :param box: An optional 4-tuple of floats providing - the source image region to be scaled. - The values must be within (0, 0, width, height) rectangle. - If omitted or None, the entire source is used. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce`. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is None (no optimization). - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if resample is None: - type_special = ";" in self.mode - resample = Resampling.NEAREST if type_special else Resampling.BICUBIC - elif resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - Resampling.LANCZOS, - Resampling.BOX, - Resampling.HAMMING, - ): - msg = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.LANCZOS, "Image.Resampling.LANCZOS"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - (Resampling.BOX, "Image.Resampling.BOX"), - (Resampling.HAMMING, "Image.Resampling.HAMMING"), - ) - ] - msg += " Use " + ", ".join(filters[:-1]) + " or " + filters[-1] - raise ValueError(msg) - - if reducing_gap is not None and reducing_gap < 1.0: - msg = "reducing_gap must be 1.0 or greater" - raise ValueError(msg) - - size = tuple(size) - - self.load() - if box is None: - box = (0, 0) + self.size - else: - box = tuple(box) - - if self.size == size and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ("1", "P"): - resample = Resampling.NEAREST - - if self.mode in ["LA", "RGBA"] and resample != Resampling.NEAREST: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.resize(size, resample, box) - return im.convert(self.mode) - - self.load() - - if reducing_gap is not None and resample != Resampling.NEAREST: - factor_x = int((box[2] - box[0]) / size[0] / reducing_gap) or 1 - factor_y = int((box[3] - box[1]) / size[1] / reducing_gap) or 1 - if factor_x > 1 or factor_y > 1: - reduce_box = self._get_safe_box(size, resample, box) - factor = (factor_x, factor_y) - self = ( - self.reduce(factor, box=reduce_box) - if callable(self.reduce) - else Image.reduce(self, factor, box=reduce_box) - ) - box = ( - (box[0] - reduce_box[0]) / factor_x, - (box[1] - reduce_box[1]) / factor_y, - (box[2] - reduce_box[0]) / factor_x, - (box[3] - reduce_box[1]) / factor_y, - ) - - return self._new(self.im.resize(size, resample, box)) - - def reduce(self, factor, box=None): - """ - Returns a copy of the image reduced ``factor`` times. - If the size of the image is not dividable by ``factor``, - the resulting size will be rounded up. - - :param factor: A greater than 0 integer or tuple of two integers - for width and height separately. - :param box: An optional 4-tuple of ints providing - the source image region to be reduced. - The values must be within ``(0, 0, width, height)`` rectangle. - If omitted or ``None``, the entire source is used. - """ - if not isinstance(factor, (list, tuple)): - factor = (factor, factor) - - if box is None: - box = (0, 0) + self.size - else: - box = tuple(box) - - if factor == (1, 1) and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ["LA", "RGBA"]: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.reduce(factor, box) - return im.convert(self.mode) - - self.load() - - return self._new(self.im.reduce(factor, box)) - - def rotate( - self, - angle, - resample=Resampling.NEAREST, - expand=0, - center=None, - translate=None, - fillcolor=None, - ): - """ - Returns a rotated copy of this image. This method returns a - copy of this image, rotated the given number of degrees counter - clockwise around its centre. - - :param angle: In degrees counter clockwise. - :param resample: An optional resampling filter. This can be - one of :py:data:`Resampling.NEAREST` (use nearest neighbour), - :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`Resampling.BICUBIC` (cubic spline - interpolation in a 4x4 environment). If omitted, or if the image has - mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. - See :ref:`concept-filters`. - :param expand: Optional expansion flag. If true, expands the output - image to make it large enough to hold the entire rotated image. - If false or omitted, make the output image the same size as the - input image. Note that the expand flag assumes rotation around - the center and no translation. - :param center: Optional center of rotation (a 2-tuple). Origin is - the upper left corner. Default is the center of the image. - :param translate: An optional post-rotate translation (a 2-tuple). - :param fillcolor: An optional color for area outside the rotated image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - angle = angle % 360.0 - - # Fast paths regardless of filter, as long as we're not - # translating or changing the center. - if not (center or translate): - if angle == 0: - return self.copy() - if angle == 180: - return self.transpose(Transpose.ROTATE_180) - if angle in (90, 270) and (expand or self.width == self.height): - return self.transpose( - Transpose.ROTATE_90 if angle == 90 else Transpose.ROTATE_270 - ) - - # Calculate the affine matrix. Note that this is the reverse - # transformation (from destination image to source) because we - # want to interpolate the (discrete) destination pixel from - # the local area around the (floating) source pixel. - - # The matrix we actually want (note that it operates from the right): - # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) - # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) - # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) - - # The reverse matrix is thus: - # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) - # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) - # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) - - # In any case, the final translation may be updated at the end to - # compensate for the expand flag. - - w, h = self.size - - if translate is None: - post_trans = (0, 0) - else: - post_trans = translate - if center is None: - # FIXME These should be rounded to ints? - rotn_center = (w / 2.0, h / 2.0) - else: - rotn_center = center - - angle = -math.radians(angle) - matrix = [ - round(math.cos(angle), 15), - round(math.sin(angle), 15), - 0.0, - round(-math.sin(angle), 15), - round(math.cos(angle), 15), - 0.0, - ] - - def transform(x, y, matrix): - (a, b, c, d, e, f) = matrix - return a * x + b * y + c, d * x + e * y + f - - matrix[2], matrix[5] = transform( - -rotn_center[0] - post_trans[0], -rotn_center[1] - post_trans[1], matrix - ) - matrix[2] += rotn_center[0] - matrix[5] += rotn_center[1] - - if expand: - # calculate output size - xx = [] - yy = [] - for x, y in ((0, 0), (w, 0), (w, h), (0, h)): - x, y = transform(x, y, matrix) - xx.append(x) - yy.append(y) - nw = math.ceil(max(xx)) - math.floor(min(xx)) - nh = math.ceil(max(yy)) - math.floor(min(yy)) - - # We multiply a translation matrix from the right. Because of its - # special form, this is the same as taking the image of the - # translation vector as new translation vector. - matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) - w, h = nw, nh - - return self.transform( - (w, h), Transform.AFFINE, matrix, resample, fillcolor=fillcolor - ) - - def save(self, fp, format=None, **params) -> None: - """ - Saves this image under the given filename. If no format is - specified, the format to use is determined from the filename - extension, if possible. - - Keyword options can be used to provide additional instructions - to the writer. If a writer doesn't recognise an option, it is - silently ignored. The available options are described in the - :doc:`image format documentation - <../handbook/image-file-formats>` for each writer. - - You can use a file object instead of a filename. In this case, - you must always specify the format. The file object must - implement the ``seek``, ``tell``, and ``write`` - methods, and be opened in binary mode. - - :param fp: A filename (string), os.PathLike object or file object. - :param format: Optional format override. If omitted, the - format to use is determined from the filename extension. - If a file object was used instead of a filename, this - parameter should always be used. - :param params: Extra parameters to the image writer. - :returns: None - :exception ValueError: If the output format could not be determined - from the file name. Use the format option to solve this. - :exception OSError: If the file could not be written. The file - may have been created, and may contain partial data. - """ - - filename: str | bytes = "" - open_fp = False - if is_path(fp): - filename = os.path.realpath(os.fspath(fp)) - open_fp = True - elif fp == sys.stdout: - try: - fp = sys.stdout.buffer - except AttributeError: - pass - if not filename and hasattr(fp, "name") and is_path(fp.name): - # only set the name for metadata purposes - filename = os.path.realpath(os.fspath(fp.name)) - - # may mutate self! - self._ensure_mutable() - - save_all = params.pop("save_all", False) - self.encoderinfo = params - self.encoderconfig = () - - preinit() - - filename_ext = os.path.splitext(filename)[1].lower() - ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext - - if not format: - if ext not in EXTENSION: - init() - try: - format = EXTENSION[ext] - except KeyError as e: - msg = f"unknown file extension: {ext}" - raise ValueError(msg) from e - - if format.upper() not in SAVE: - init() - if save_all: - save_handler = SAVE_ALL[format.upper()] - else: - save_handler = SAVE[format.upper()] - - created = False - if open_fp: - created = not os.path.exists(filename) - if params.get("append", False): - # Open also for reading ("+"), because TIFF save_all - # writer needs to go back and edit the written data. - fp = builtins.open(filename, "r+b") - else: - fp = builtins.open(filename, "w+b") - - try: - save_handler(self, fp, filename) - except Exception: - if open_fp: - fp.close() - if created: - try: - os.remove(filename) - except PermissionError: - pass - raise - if open_fp: - fp.close() - - def seek(self, frame: int) -> None: - """ - Seeks to the given frame in this sequence file. If you seek - beyond the end of the sequence, the method raises an - ``EOFError`` exception. When a sequence file is opened, the - library automatically seeks to frame 0. - - See :py:meth:`~PIL.Image.Image.tell`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :param frame: Frame number, starting at 0. - :exception EOFError: If the call attempts to seek beyond the end - of the sequence. - """ - - # overridden by file handlers - if frame != 0: - msg = "no more images in file" - raise EOFError(msg) - - def show(self, title: str | None = None) -> None: - """ - Displays this image. This method is mainly intended for debugging purposes. - - This method calls :py:func:`PIL.ImageShow.show` internally. You can use - :py:func:`PIL.ImageShow.register` to override its default behaviour. - - The image is first saved to a temporary file. By default, it will be in - PNG format. - - On Unix, the image is then opened using the **xdg-open**, **display**, - **gm**, **eog** or **xv** utility, depending on which one can be found. - - On macOS, the image is opened with the native Preview application. - - On Windows, the image is opened with the standard PNG display utility. - - :param title: Optional title to use for the image window, where possible. - """ - - _show(self, title=title) - - def split(self) -> tuple[Image, ...]: - """ - Split this image into individual bands. This method returns a - tuple of individual image bands from an image. For example, - splitting an "RGB" image creates three new images each - containing a copy of one of the original bands (red, green, - blue). - - If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` - method can be more convenient and faster. - - :returns: A tuple containing bands. - """ - - self.load() - if self.im.bands == 1: - return (self.copy(),) - return tuple(map(self._new, self.im.split())) - - def getchannel(self, channel: int | str) -> Image: - """ - Returns an image containing a single channel of the source image. - - :param channel: What channel to return. Could be index - (0 for "R" channel of "RGB") or channel name - ("A" for alpha channel of "RGBA"). - :returns: An image in "L" mode. - - .. versionadded:: 4.3.0 - """ - self.load() - - if isinstance(channel, str): - try: - channel = self.getbands().index(channel) - except ValueError as e: - msg = f'The image has no channel "{channel}"' - raise ValueError(msg) from e - - return self._new(self.im.getband(channel)) - - def tell(self) -> int: - """ - Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :returns: Frame number, starting with 0. - """ - return 0 - - def thumbnail(self, size, resample=Resampling.BICUBIC, reducing_gap=2.0): - """ - Make this image into a thumbnail. This method modifies the - image to contain a thumbnail version of itself, no larger than - the given size. This method calculates an appropriate thumbnail - size to preserve the aspect of the image, calls the - :py:meth:`~PIL.Image.Image.draft` method to configure the file reader - (where applicable), and finally resizes the image. - - Note that this function modifies the :py:class:`~PIL.Image.Image` - object in place. If you need to use the full resolution image as well, - apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original - image. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param resample: Optional resampling filter. This can be one - of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, - :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, - :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. - If omitted, it defaults to :py:data:`Resampling.BICUBIC`. - (was :py:data:`Resampling.NEAREST` prior to version 2.5.0). - See: :ref:`concept-filters`. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce` or - :py:meth:`~PIL.Image.Image.draft` for JPEG images. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is 2.0 (very close to fair resampling - while still being faster in many cases). - :returns: None - """ - - provided_size = tuple(map(math.floor, size)) - - def preserve_aspect_ratio() -> tuple[int, int] | None: - def round_aspect(number, key): - return max(min(math.floor(number), math.ceil(number), key=key), 1) - - x, y = provided_size - if x >= self.width and y >= self.height: - return None - - aspect = self.width / self.height - if x / y >= aspect: - x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y)) - else: - y = round_aspect( - x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n) - ) - return x, y - - box = None - if reducing_gap is not None: - size = preserve_aspect_ratio() - if size is None: - return - - res = self.draft(None, (size[0] * reducing_gap, size[1] * reducing_gap)) - if res is not None: - box = res[1] - if box is None: - self.load() - - # load() may have changed the size of the image - size = preserve_aspect_ratio() - if size is None: - return - - if self.size != size: - im = self.resize(size, resample, box=box, reducing_gap=reducing_gap) - - self.im = im.im - self._size = size - self._mode = self.im.mode - - self.readonly = 0 - self.pyaccess = None - - # FIXME: the different transform methods need further explanation - # instead of bloating the method docs, add a separate chapter. - def transform( - self, - size, - method, - data=None, - resample=Resampling.NEAREST, - fill=1, - fillcolor=None, - ) -> Image: - """ - Transforms this image. This method creates a new image with the - given size, and the same mode as the original, and copies data - to the new image using the given transform. - - :param size: The output size in pixels, as a 2-tuple: - (width, height). - :param method: The transformation method. This is one of - :py:data:`Transform.EXTENT` (cut out a rectangular subregion), - :py:data:`Transform.AFFINE` (affine transform), - :py:data:`Transform.PERSPECTIVE` (perspective transform), - :py:data:`Transform.QUAD` (map a quadrilateral to a rectangle), or - :py:data:`Transform.MESH` (map a number of source quadrilaterals - in one operation). - - It may also be an :py:class:`~PIL.Image.ImageTransformHandler` - object:: - - class Example(Image.ImageTransformHandler): - def transform(self, size, data, resample, fill=1): - # Return result - - Implementations of :py:class:`~PIL.Image.ImageTransformHandler` - for some of the :py:class:`Transform` methods are provided - in :py:mod:`~PIL.ImageTransform`. - - It may also be an object with a ``method.getdata`` method - that returns a tuple supplying new ``method`` and ``data`` values:: - - class Example: - def getdata(self): - method = Image.Transform.EXTENT - data = (0, 0, 100, 100) - return method, data - :param data: Extra data to the transformation method. - :param resample: Optional resampling filter. It can be one of - :py:data:`Resampling.NEAREST` (use nearest neighbour), - :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`Resampling.BICUBIC` (cubic spline - interpolation in a 4x4 environment). If omitted, or if the image - has mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. - See: :ref:`concept-filters`. - :param fill: If ``method`` is an - :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of - the arguments passed to it. Otherwise, it is unused. - :param fillcolor: Optional fill color for the area outside the - transform in the output image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if self.mode in ("LA", "RGBA") and resample != Resampling.NEAREST: - return ( - self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - .transform(size, method, data, resample, fill, fillcolor) - .convert(self.mode) - ) - - if isinstance(method, ImageTransformHandler): - return method.transform(size, self, resample=resample, fill=fill) - - if hasattr(method, "getdata"): - # compatibility w. old-style transform objects - method, data = method.getdata() - - if data is None: - msg = "missing method data" - raise ValueError(msg) - - im = new(self.mode, size, fillcolor) - if self.mode == "P" and self.palette: - im.palette = self.palette.copy() - im.info = self.info.copy() - if method == Transform.MESH: - # list of quads - for box, quad in data: - im.__transformer( - box, self, Transform.QUAD, quad, resample, fillcolor is None - ) - else: - im.__transformer( - (0, 0) + size, self, method, data, resample, fillcolor is None - ) - - return im - - def __transformer( - self, box, image, method, data, resample=Resampling.NEAREST, fill=1 - ): - w = box[2] - box[0] - h = box[3] - box[1] - - if method == Transform.AFFINE: - data = data[:6] - - elif method == Transform.EXTENT: - # convert extent to an affine transform - x0, y0, x1, y1 = data - xs = (x1 - x0) / w - ys = (y1 - y0) / h - method = Transform.AFFINE - data = (xs, 0, x0, 0, ys, y0) - - elif method == Transform.PERSPECTIVE: - data = data[:8] - - elif method == Transform.QUAD: - # quadrilateral warp. data specifies the four corners - # given as NW, SW, SE, and NE. - nw = data[:2] - sw = data[2:4] - se = data[4:6] - ne = data[6:8] - x0, y0 = nw - As = 1.0 / w - At = 1.0 / h - data = ( - x0, - (ne[0] - x0) * As, - (sw[0] - x0) * At, - (se[0] - sw[0] - ne[0] + x0) * As * At, - y0, - (ne[1] - y0) * As, - (sw[1] - y0) * At, - (se[1] - sw[1] - ne[1] + y0) * As * At, - ) - - else: - msg = "unknown transformation method" - raise ValueError(msg) - - if resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - ): - if resample in (Resampling.BOX, Resampling.HAMMING, Resampling.LANCZOS): - msg = { - Resampling.BOX: "Image.Resampling.BOX", - Resampling.HAMMING: "Image.Resampling.HAMMING", - Resampling.LANCZOS: "Image.Resampling.LANCZOS", - }[resample] + f" ({resample}) cannot be used." - else: - msg = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - ) - ] - msg += " Use " + ", ".join(filters[:-1]) + " or " + filters[-1] - raise ValueError(msg) - - image.load() - - self.load() - - if image.mode in ("1", "P"): - resample = Resampling.NEAREST - - self.im.transform2(box, image.im, method, data, resample, fill) - - def transpose(self, method: Transpose) -> Image: - """ - Transpose image (flip or rotate in 90 degree steps) - - :param method: One of :py:data:`Transpose.FLIP_LEFT_RIGHT`, - :py:data:`Transpose.FLIP_TOP_BOTTOM`, :py:data:`Transpose.ROTATE_90`, - :py:data:`Transpose.ROTATE_180`, :py:data:`Transpose.ROTATE_270`, - :py:data:`Transpose.TRANSPOSE` or :py:data:`Transpose.TRANSVERSE`. - :returns: Returns a flipped or rotated copy of this image. - """ - - self.load() - return self._new(self.im.transpose(method)) - - def effect_spread(self, distance): - """ - Randomly spread pixels in an image. - - :param distance: Distance to spread pixels. - """ - self.load() - return self._new(self.im.effect_spread(distance)) - - def toqimage(self): - """Returns a QImage copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.toqimage(self) - - def toqpixmap(self): - """Returns a QPixmap copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.toqpixmap(self) - - -# -------------------------------------------------------------------- -# Abstract handlers. - - -class ImagePointHandler: - """ - Used as a mixin by point transforms - (for use with :py:meth:`~PIL.Image.Image.point`) - """ - - @abc.abstractmethod - def point(self, im: Image) -> Image: - pass - - -class ImageTransformHandler: - """ - Used as a mixin by geometry transforms - (for use with :py:meth:`~PIL.Image.Image.transform`) - """ - - @abc.abstractmethod - def transform( - self, - size: tuple[int, int], - image: Image, - **options: dict[str, str | int | tuple[int, ...] | list[int]], - ) -> Image: - pass - - -# -------------------------------------------------------------------- -# Factories - -# -# Debugging - - -def _wedge(): - """Create grayscale wedge (for debugging only)""" - - return Image()._new(core.wedge("L")) - - -def _check_size(size): - """ - Common check to enforce type and sanity check on size tuples - - :param size: Should be a 2 tuple of (width, height) - :returns: True, or raises a ValueError - """ - - if not isinstance(size, (list, tuple)): - msg = "Size must be a tuple" - raise ValueError(msg) - if len(size) != 2: - msg = "Size must be a tuple of length 2" - raise ValueError(msg) - if size[0] < 0 or size[1] < 0: - msg = "Width and height must be >= 0" - raise ValueError(msg) - - return True - - -def new( - mode: str, size: tuple[int, int], color: float | tuple[float, ...] | str | None = 0 -) -> Image: - """ - Creates a new image with the given mode and size. - - :param mode: The mode to use for the new image. See: - :ref:`concept-modes`. - :param size: A 2-tuple, containing (width, height) in pixels. - :param color: What color to use for the image. Default is black. - If given, this should be a single integer or floating point value - for single-band modes, and a tuple for multi-band modes (one value - per band). When creating RGB or HSV images, you can also use color - strings as supported by the ImageColor module. If the color is - None, the image is not initialised. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - _check_size(size) - - if color is None: - # don't initialize - return Image()._new(core.new(mode, size)) - - if isinstance(color, str): - # css3-style specifier - - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - - im = Image() - if mode == "P" and isinstance(color, (list, tuple)) and len(color) in [3, 4]: - # RGB or RGBA value for a P image - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette() - color = im.palette.getcolor(color) - return im._new(core.fill(mode, size, color)) - - -def frombytes(mode, size, data, decoder_name="raw", *args) -> Image: - """ - Creates a copy of an image memory from pixel data in a buffer. - - In its simplest form, this function takes three arguments - (mode, size, and unpacked pixel data). - - You can also use any pixel decoder supported by PIL. For more - information on available decoders, see the section - :ref:`Writing Your Own File Codec `. - - Note that this function decodes pixel data only, not entire images. - If you have an entire image in a string, wrap it in a - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load - it. - - :param mode: The image mode. See: :ref:`concept-modes`. - :param size: The image size. - :param data: A byte buffer containing raw data for the given mode. - :param decoder_name: What decoder to use. - :param args: Additional parameters for the given decoder. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - _check_size(size) - - im = new(mode, size) - if im.width != 0 and im.height != 0: - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if decoder_name == "raw" and args == (): - args = mode - - im.frombytes(data, decoder_name, args) - return im - - -def frombuffer(mode, size, data, decoder_name="raw", *args): - """ - Creates an image memory referencing pixel data in a byte buffer. - - This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data - in the byte buffer, where possible. This means that changes to the - original buffer object are reflected in this image). Not all modes can - share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". - - Note that this function decodes pixel data only, not entire images. - If you have an entire image file in a string, wrap it in a - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. - - The default parameters used for the "raw" decoder differs from that used for - :py:func:`~PIL.Image.frombytes`. This is a bug, and will probably be fixed in a - future release. The current release issues a warning if you do this; to disable - the warning, you should provide the full set of parameters. See below for details. - - :param mode: The image mode. See: :ref:`concept-modes`. - :param size: The image size. - :param data: A bytes or other buffer object containing raw - data for the given mode. - :param decoder_name: What decoder to use. - :param args: Additional parameters for the given decoder. For the - default encoder ("raw"), it's recommended that you provide the - full set of parameters:: - - frombuffer(mode, size, data, "raw", mode, 0, 1) - - :returns: An :py:class:`~PIL.Image.Image` object. - - .. versionadded:: 1.1.4 - """ - - _check_size(size) - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if decoder_name == "raw": - if args == (): - args = mode, 0, 1 - if args[0] in _MAPMODES: - im = new(mode, (0, 0)) - im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) - if mode == "P": - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette("RGB", im.im.getpalette("RGB")) - im.readonly = 1 - return im - - return frombytes(mode, size, data, decoder_name, args) - - -def fromarray(obj, mode=None): - """ - Creates an image memory from an object exporting the array interface - (using the buffer protocol):: - - from PIL import Image - import numpy as np - a = np.zeros((5, 5)) - im = Image.fromarray(a) - - If ``obj`` is not contiguous, then the ``tobytes`` method is called - and :py:func:`~PIL.Image.frombuffer` is used. - - In the case of NumPy, be aware that Pillow modes do not always correspond - to NumPy dtypes. Pillow modes only offer 1-bit pixels, 8-bit pixels, - 32-bit signed integer pixels, and 32-bit floating point pixels. - - Pillow images can also be converted to arrays:: - - from PIL import Image - import numpy as np - im = Image.open("hopper.jpg") - a = np.asarray(im) - - When converting Pillow images to arrays however, only pixel values are - transferred. This means that P and PA mode images will lose their palette. - - :param obj: Object with array interface - :param mode: Optional mode to use when reading ``obj``. Will be determined from - type if ``None``. - - This will not be used to convert the data after reading, but will be used to - change how the data is read:: - - from PIL import Image - import numpy as np - a = np.full((1, 1), 300) - im = Image.fromarray(a, mode="L") - im.getpixel((0, 0)) # 44 - im = Image.fromarray(a, mode="RGB") - im.getpixel((0, 0)) # (44, 1, 0) - - See: :ref:`concept-modes` for general information about modes. - :returns: An image object. - - .. versionadded:: 1.1.6 - """ - arr = obj.__array_interface__ - shape = arr["shape"] - ndim = len(shape) - strides = arr.get("strides", None) - if mode is None: - try: - typekey = (1, 1) + shape[2:], arr["typestr"] - except KeyError as e: - msg = "Cannot handle this data type" - raise TypeError(msg) from e - try: - mode, rawmode = _fromarray_typemap[typekey] - except KeyError as e: - typekey_shape, typestr = typekey - msg = f"Cannot handle this data type: {typekey_shape}, {typestr}" - raise TypeError(msg) from e - else: - rawmode = mode - if mode in ["1", "L", "I", "P", "F"]: - ndmax = 2 - elif mode == "RGB": - ndmax = 3 - else: - ndmax = 4 - if ndim > ndmax: - msg = f"Too many dimensions: {ndim} > {ndmax}." - raise ValueError(msg) - - size = 1 if ndim == 1 else shape[1], shape[0] - if strides is not None: - if hasattr(obj, "tobytes"): - obj = obj.tobytes() - else: - obj = obj.tostring() - - return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) - - -def fromqimage(im): - """Creates an image instance from a QImage image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.fromqimage(im) - - -def fromqpixmap(im): - """Creates an image instance from a QPixmap image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.fromqpixmap(im) - - -_fromarray_typemap = { - # (shape, typestr) => mode, rawmode - # first two members of shape are set to one - ((1, 1), "|b1"): ("1", "1;8"), - ((1, 1), "|u1"): ("L", "L"), - ((1, 1), "|i1"): ("I", "I;8"), - ((1, 1), "u2"): ("I", "I;16B"), - ((1, 1), "i2"): ("I", "I;16BS"), - ((1, 1), "u4"): ("I", "I;32B"), - ((1, 1), "i4"): ("I", "I;32BS"), - ((1, 1), "f4"): ("F", "F;32BF"), - ((1, 1), "f8"): ("F", "F;64BF"), - ((1, 1, 2), "|u1"): ("LA", "LA"), - ((1, 1, 3), "|u1"): ("RGB", "RGB"), - ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), - # shortcuts: - ((1, 1), _ENDIAN + "i4"): ("I", "I"), - ((1, 1), _ENDIAN + "f4"): ("F", "F"), -} - - -def _decompression_bomb_check(size: tuple[int, int]) -> None: - if MAX_IMAGE_PIXELS is None: - return - - pixels = max(1, size[0]) * max(1, size[1]) - - if pixels > 2 * MAX_IMAGE_PIXELS: - msg = ( - f"Image size ({pixels} pixels) exceeds limit of {2 * MAX_IMAGE_PIXELS} " - "pixels, could be decompression bomb DOS attack." - ) - raise DecompressionBombError(msg) - - if pixels > MAX_IMAGE_PIXELS: - warnings.warn( - f"Image size ({pixels} pixels) exceeds limit of {MAX_IMAGE_PIXELS} pixels, " - "could be decompression bomb DOS attack.", - DecompressionBombWarning, - ) - - -def open(fp, mode="r", formats=None) -> Image: - """ - Opens and identifies the given image file. - - This is a lazy operation; this function identifies the file, but - the file remains open and the actual image data is not read from - the file until you try to process the data (or call the - :py:meth:`~PIL.Image.Image.load` method). See - :py:func:`~PIL.Image.new`. See :ref:`file-handling`. - - :param fp: A filename (string), os.PathLike object or a file object. - The file object must implement ``file.read``, - ``file.seek``, and ``file.tell`` methods, - and be opened in binary mode. The file object will also seek to zero - before reading. - :param mode: The mode. If given, this argument must be "r". - :param formats: A list or tuple of formats to attempt to load the file in. - This can be used to restrict the set of formats checked. - Pass ``None`` to try all supported formats. You can print the set of - available formats by running ``python3 -m PIL`` or using - the :py:func:`PIL.features.pilinfo` function. - :returns: An :py:class:`~PIL.Image.Image` object. - :exception FileNotFoundError: If the file cannot be found. - :exception PIL.UnidentifiedImageError: If the image cannot be opened and - identified. - :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` - instance is used for ``fp``. - :exception TypeError: If ``formats`` is not ``None``, a list or a tuple. - """ - - if mode != "r": - msg = f"bad mode {repr(mode)}" - raise ValueError(msg) - elif isinstance(fp, io.StringIO): - msg = ( - "StringIO cannot be used to open an image. " - "Binary data must be used instead." - ) - raise ValueError(msg) - - if formats is None: - formats = ID - elif not isinstance(formats, (list, tuple)): - msg = "formats must be a list or tuple" - raise TypeError(msg) - - exclusive_fp = False - filename: str | bytes = "" - if is_path(fp): - filename = os.path.realpath(os.fspath(fp)) - - if filename: - fp = builtins.open(filename, "rb") - exclusive_fp = True - - try: - fp.seek(0) - except (AttributeError, io.UnsupportedOperation): - fp = io.BytesIO(fp.read()) - exclusive_fp = True - - prefix = fp.read(16) - - preinit() - - accept_warnings = [] - - def _open_core(fp, filename, prefix, formats): - for i in formats: - i = i.upper() - if i not in OPEN: - init() - try: - factory, accept = OPEN[i] - result = not accept or accept(prefix) - if type(result) in [str, bytes]: - accept_warnings.append(result) - elif result: - fp.seek(0) - im = factory(fp, filename) - _decompression_bomb_check(im.size) - return im - except (SyntaxError, IndexError, TypeError, struct.error): - # Leave disabled by default, spams the logs with image - # opening failures that are entirely expected. - # logger.debug("", exc_info=True) - continue - except BaseException: - if exclusive_fp: - fp.close() - raise - return None - - im = _open_core(fp, filename, prefix, formats) - - if im is None and formats is ID: - checked_formats = formats.copy() - if init(): - im = _open_core( - fp, - filename, - prefix, - tuple(format for format in formats if format not in checked_formats), - ) - - if im: - im._exclusive_fp = exclusive_fp - return im - - if exclusive_fp: - fp.close() - for message in accept_warnings: - warnings.warn(message) - msg = "cannot identify image file %r" % (filename if filename else fp) - raise UnidentifiedImageError(msg) - - -# -# Image processing. - - -def alpha_composite(im1: Image, im2: Image) -> Image: - """ - Alpha composite im2 over im1. - - :param im1: The first image. Must have mode RGBA. - :param im2: The second image. Must have mode RGBA, and the same size as - the first image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - im1.load() - im2.load() - return im1._new(core.alpha_composite(im1.im, im2.im)) - - -def blend(im1: Image, im2: Image, alpha: float) -> Image: - """ - Creates a new image by interpolating between two input images, using - a constant alpha:: - - out = image1 * (1.0 - alpha) + image2 * alpha - - :param im1: The first image. - :param im2: The second image. Must have the same mode and size as - the first image. - :param alpha: The interpolation alpha factor. If alpha is 0.0, a - copy of the first image is returned. If alpha is 1.0, a copy of - the second image is returned. There are no restrictions on the - alpha value. If necessary, the result is clipped to fit into - the allowed output range. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - im1.load() - im2.load() - return im1._new(core.blend(im1.im, im2.im, alpha)) - - -def composite(image1: Image, image2: Image, mask: Image) -> Image: - """ - Create composite image by blending images using a transparency mask. - - :param image1: The first image. - :param image2: The second image. Must have the same mode and - size as the first image. - :param mask: A mask image. This image can have mode - "1", "L", or "RGBA", and must have the same size as the - other two images. - """ - - image = image2.copy() - image.paste(image1, None, mask) - return image - - -def eval(image, *args): - """ - Applies the function (which should take one argument) to each pixel - in the given image. If the image has more than one band, the same - function is applied to each band. Note that the function is - evaluated once for each possible pixel value, so you cannot use - random components or other generators. - - :param image: The input image. - :param function: A function object, taking one integer argument. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - return image.point(args[0]) - - -def merge(mode, bands): - """ - Merge a set of single band images into a new multiband image. - - :param mode: The mode to use for the output image. See: - :ref:`concept-modes`. - :param bands: A sequence containing one single-band image for - each band in the output image. All bands must have the - same size. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if getmodebands(mode) != len(bands) or "*" in mode: - msg = "wrong number of bands" - raise ValueError(msg) - for band in bands[1:]: - if band.mode != getmodetype(mode): - msg = "mode mismatch" - raise ValueError(msg) - if band.size != bands[0].size: - msg = "size mismatch" - raise ValueError(msg) - for band in bands: - band.load() - return bands[0]._new(core.merge(mode, *[b.im for b in bands])) - - -# -------------------------------------------------------------------- -# Plugin registry - - -def register_open( - id, - factory: Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], - accept: Callable[[bytes], bool] | None = None, -) -> None: - """ - Register an image file plugin. This function should not be used - in application code. - - :param id: An image format identifier. - :param factory: An image file factory method. - :param accept: An optional function that can be used to quickly - reject images having another format. - """ - id = id.upper() - if id not in ID: - ID.append(id) - OPEN[id] = factory, accept - - -def register_mime(id: str, mimetype: str) -> None: - """ - Registers an image MIME type by populating ``Image.MIME``. This function - should not be used in application code. - - ``Image.MIME`` provides a mapping from image format identifiers to mime - formats, but :py:meth:`~PIL.ImageFile.ImageFile.get_format_mimetype` can - provide a different result for specific images. - - :param id: An image format identifier. - :param mimetype: The image MIME type for this format. - """ - MIME[id.upper()] = mimetype - - -def register_save(id: str, driver) -> None: - """ - Registers an image save function. This function should not be - used in application code. - - :param id: An image format identifier. - :param driver: A function to save images in this format. - """ - SAVE[id.upper()] = driver - - -def register_save_all(id, driver) -> None: - """ - Registers an image function to save all the frames - of a multiframe format. This function should not be - used in application code. - - :param id: An image format identifier. - :param driver: A function to save images in this format. - """ - SAVE_ALL[id.upper()] = driver - - -def register_extension(id, extension) -> None: - """ - Registers an image extension. This function should not be - used in application code. - - :param id: An image format identifier. - :param extension: An extension used for this format. - """ - EXTENSION[extension.lower()] = id.upper() - - -def register_extensions(id, extensions) -> None: - """ - Registers image extensions. This function should not be - used in application code. - - :param id: An image format identifier. - :param extensions: A list of extensions used for this format. - """ - for extension in extensions: - register_extension(id, extension) - - -def registered_extensions(): - """ - Returns a dictionary containing all file extensions belonging - to registered plugins - """ - init() - return EXTENSION - - -def register_decoder(name: str, decoder: type[ImageFile.PyDecoder]) -> None: - """ - Registers an image decoder. This function should not be - used in application code. - - :param name: The name of the decoder - :param decoder: An ImageFile.PyDecoder object - - .. versionadded:: 4.1.0 - """ - DECODERS[name] = decoder - - -def register_encoder(name: str, encoder: type[ImageFile.PyEncoder]) -> None: - """ - Registers an image encoder. This function should not be - used in application code. - - :param name: The name of the encoder - :param encoder: An ImageFile.PyEncoder object - - .. versionadded:: 4.1.0 - """ - ENCODERS[name] = encoder - - -# -------------------------------------------------------------------- -# Simple display support. - - -def _show(image, **options) -> None: - from . import ImageShow - - ImageShow.show(image, **options) - - -# -------------------------------------------------------------------- -# Effects - - -def effect_mandelbrot(size, extent, quality): - """ - Generate a Mandelbrot set covering the given extent. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param extent: The extent to cover, as a 4-tuple: - (x0, y0, x1, y1). - :param quality: Quality. - """ - return Image()._new(core.effect_mandelbrot(size, extent, quality)) - - -def effect_noise(size, sigma): - """ - Generate Gaussian noise centered around 128. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param sigma: Standard deviation of noise. - """ - return Image()._new(core.effect_noise(size, sigma)) - - -def linear_gradient(mode): - """ - Generate 256x256 linear gradient from black to white, top to bottom. - - :param mode: Input mode. - """ - return Image()._new(core.linear_gradient(mode)) - - -def radial_gradient(mode): - """ - Generate 256x256 radial gradient from black to white, centre to edge. - - :param mode: Input mode. - """ - return Image()._new(core.radial_gradient(mode)) - - -# -------------------------------------------------------------------- -# Resources - - -def _apply_env_variables(env=None) -> None: - if env is None: - env = os.environ - - for var_name, setter in [ - ("PILLOW_ALIGNMENT", core.set_alignment), - ("PILLOW_BLOCK_SIZE", core.set_block_size), - ("PILLOW_BLOCKS_MAX", core.set_blocks_max), - ]: - if var_name not in env: - continue - - var = env[var_name].lower() - - units = 1 - for postfix, mul in [("k", 1024), ("m", 1024 * 1024)]: - if var.endswith(postfix): - units = mul - var = var[: -len(postfix)] - - try: - var = int(var) * units - except ValueError: - warnings.warn(f"{var_name} is not int") - continue - - try: - setter(var) - except ValueError as e: - warnings.warn(f"{var_name}: {e}") - - -_apply_env_variables() -atexit.register(core.clear_cache) - - -if TYPE_CHECKING: - _ExifBase = MutableMapping[int, Any] -else: - _ExifBase = MutableMapping - - -class Exif(_ExifBase): - """ - This class provides read and write access to EXIF image data:: - - from PIL import Image - im = Image.open("exif.png") - exif = im.getexif() # Returns an instance of this class - - Information can be read and written, iterated over or deleted:: - - print(exif[274]) # 1 - exif[274] = 2 - for k, v in exif.items(): - print("Tag", k, "Value", v) # Tag 274 Value 2 - del exif[274] - - To access information beyond IFD0, :py:meth:`~PIL.Image.Exif.get_ifd` - returns a dictionary:: - - from PIL import ExifTags - im = Image.open("exif_gps.jpg") - exif = im.getexif() - gps_ifd = exif.get_ifd(ExifTags.IFD.GPSInfo) - print(gps_ifd) - - Other IFDs include ``ExifTags.IFD.Exif``, ``ExifTags.IFD.Makernote``, - ``ExifTags.IFD.Interop`` and ``ExifTags.IFD.IFD1``. - - :py:mod:`~PIL.ExifTags` also has enum classes to provide names for data:: - - print(exif[ExifTags.Base.Software]) # PIL - print(gps_ifd[ExifTags.GPS.GPSDateStamp]) # 1999:99:99 99:99:99 - """ - - endian = None - bigtiff = False - _loaded = False - - def __init__(self): - self._data = {} - self._hidden_data = {} - self._ifds = {} - self._info = None - self._loaded_exif = None - - def _fixup(self, value): - try: - if len(value) == 1 and isinstance(value, tuple): - return value[0] - except Exception: - pass - return value - - def _fixup_dict(self, src_dict): - # Helper function - # returns a dict with any single item tuples/lists as individual values - return {k: self._fixup(v) for k, v in src_dict.items()} - - def _get_ifd_dict(self, offset, group=None): - try: - # an offset pointer to the location of the nested embedded IFD. - # It should be a long, but may be corrupted. - self.fp.seek(offset) - except (KeyError, TypeError): - pass - else: - from . import TiffImagePlugin - - info = TiffImagePlugin.ImageFileDirectory_v2(self.head, group=group) - info.load(self.fp) - return self._fixup_dict(info) - - def _get_head(self): - version = b"\x2B" if self.bigtiff else b"\x2A" - if self.endian == "<": - head = b"II" + version + b"\x00" + o32le(8) - else: - head = b"MM\x00" + version + o32be(8) - if self.bigtiff: - head += o32le(8) if self.endian == "<" else o32be(8) - head += b"\x00\x00\x00\x00" - return head - - def load(self, data): - # Extract EXIF information. This is highly experimental, - # and is likely to be replaced with something better in a future - # version. - - # The EXIF record consists of a TIFF file embedded in a JPEG - # application marker (!). - if data == self._loaded_exif: - return - self._loaded_exif = data - self._data.clear() - self._hidden_data.clear() - self._ifds.clear() - if data and data.startswith(b"Exif\x00\x00"): - data = data[6:] - if not data: - self._info = None - return - - self.fp = io.BytesIO(data) - self.head = self.fp.read(8) - # process dictionary - from . import TiffImagePlugin - - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - self.endian = self._info._endian - self.fp.seek(self._info.next) - self._info.load(self.fp) - - def load_from_fp(self, fp, offset=None): - self._loaded_exif = None - self._data.clear() - self._hidden_data.clear() - self._ifds.clear() - - # process dictionary - from . import TiffImagePlugin - - self.fp = fp - if offset is not None: - self.head = self._get_head() - else: - self.head = self.fp.read(8) - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - if self.endian is None: - self.endian = self._info._endian - if offset is None: - offset = self._info.next - self.fp.tell() - self.fp.seek(offset) - self._info.load(self.fp) - - def _get_merged_dict(self): - merged_dict = dict(self) - - # get EXIF extension - if ExifTags.IFD.Exif in self: - ifd = self._get_ifd_dict(self[ExifTags.IFD.Exif], ExifTags.IFD.Exif) - if ifd: - merged_dict.update(ifd) - - # GPS - if ExifTags.IFD.GPSInfo in self: - merged_dict[ExifTags.IFD.GPSInfo] = self._get_ifd_dict( - self[ExifTags.IFD.GPSInfo], ExifTags.IFD.GPSInfo - ) - - return merged_dict - - def tobytes(self, offset: int = 8) -> bytes: - from . import TiffImagePlugin - - head = self._get_head() - ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) - for tag, value in self.items(): - if tag in [ - ExifTags.IFD.Exif, - ExifTags.IFD.GPSInfo, - ] and not isinstance(value, dict): - value = self.get_ifd(tag) - if ( - tag == ExifTags.IFD.Exif - and ExifTags.IFD.Interop in value - and not isinstance(value[ExifTags.IFD.Interop], dict) - ): - value = value.copy() - value[ExifTags.IFD.Interop] = self.get_ifd(ExifTags.IFD.Interop) - ifd[tag] = value - return b"Exif\x00\x00" + head + ifd.tobytes(offset) - - def get_ifd(self, tag): - if tag not in self._ifds: - if tag == ExifTags.IFD.IFD1: - if self._info is not None and self._info.next != 0: - self._ifds[tag] = self._get_ifd_dict(self._info.next) - elif tag in [ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo]: - offset = self._hidden_data.get(tag, self.get(tag)) - if offset is not None: - self._ifds[tag] = self._get_ifd_dict(offset, tag) - elif tag in [ExifTags.IFD.Interop, ExifTags.IFD.Makernote]: - if ExifTags.IFD.Exif not in self._ifds: - self.get_ifd(ExifTags.IFD.Exif) - tag_data = self._ifds[ExifTags.IFD.Exif][tag] - if tag == ExifTags.IFD.Makernote: - from .TiffImagePlugin import ImageFileDirectory_v2 - - if tag_data[:8] == b"FUJIFILM": - ifd_offset = i32le(tag_data, 8) - ifd_data = tag_data[ifd_offset:] - - makernote = {} - for i in range(0, struct.unpack(" 4: - (offset,) = struct.unpack("H", tag_data[:2])[0]): - ifd_tag, typ, count, data = struct.unpack( - ">HHL4s", tag_data[i * 12 + 2 : (i + 1) * 12 + 2] - ) - if ifd_tag == 0x1101: - # CameraInfo - (offset,) = struct.unpack(">L", data) - self.fp.seek(offset) - - camerainfo = {"ModelID": self.fp.read(4)} - - self.fp.read(4) - # Seconds since 2000 - camerainfo["TimeStamp"] = i32le(self.fp.read(12)) - - self.fp.read(4) - camerainfo["InternalSerialNumber"] = self.fp.read(4) - - self.fp.read(12) - parallax = self.fp.read(4) - handler = ImageFileDirectory_v2._load_dispatch[ - TiffTags.FLOAT - ][1] - camerainfo["Parallax"] = handler( - ImageFileDirectory_v2(), parallax, False - ) - - self.fp.read(4) - camerainfo["Category"] = self.fp.read(2) - - makernote = {0x1101: dict(self._fixup_dict(camerainfo))} - self._ifds[tag] = makernote - else: - # Interop - self._ifds[tag] = self._get_ifd_dict(tag_data, tag) - ifd = self._ifds.get(tag, {}) - if tag == ExifTags.IFD.Exif and self._hidden_data: - ifd = { - k: v - for (k, v) in ifd.items() - if k not in (ExifTags.IFD.Interop, ExifTags.IFD.Makernote) - } - return ifd - - def hide_offsets(self) -> None: - for tag in (ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo): - if tag in self: - self._hidden_data[tag] = self[tag] - del self[tag] - - def __str__(self) -> str: - if self._info is not None: - # Load all keys into self._data - for tag in self._info: - self[tag] - - return str(self._data) - - def __len__(self) -> int: - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return len(keys) - - def __getitem__(self, tag): - if self._info is not None and tag not in self._data and tag in self._info: - self._data[tag] = self._fixup(self._info[tag]) - del self._info[tag] - return self._data[tag] - - def __contains__(self, tag) -> bool: - return tag in self._data or (self._info is not None and tag in self._info) - - def __setitem__(self, tag, value) -> None: - if self._info is not None and tag in self._info: - del self._info[tag] - self._data[tag] = value - - def __delitem__(self, tag: int) -> None: - if self._info is not None and tag in self._info: - del self._info[tag] - else: - del self._data[tag] - - def __iter__(self): - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return iter(keys) diff --git a/.flatpak-builder/cache/objects/62/5c114bb64c838d29c9634b6420238f99543d5c848af56253c535dc9a75f66c.file b/.flatpak-builder/cache/objects/62/5c114bb64c838d29c9634b6420238f99543d5c848af56253c535dc9a75f66c.file deleted file mode 100644 index bb349c7..0000000 --- a/.flatpak-builder/cache/objects/62/5c114bb64c838d29c9634b6420238f99543d5c848af56253c535dc9a75f66c.file +++ /dev/null @@ -1,172 +0,0 @@ -from __future__ import annotations - -import typing - -from .util.connection import _TYPE_SOCKET_OPTIONS -from .util.timeout import _DEFAULT_TIMEOUT, _TYPE_TIMEOUT -from .util.url import Url - -_TYPE_BODY = typing.Union[bytes, typing.IO[typing.Any], typing.Iterable[bytes], str] - - -class ProxyConfig(typing.NamedTuple): - ssl_context: ssl.SSLContext | None - use_forwarding_for_https: bool - assert_hostname: None | str | Literal[False] - assert_fingerprint: str | None - - -class _ResponseOptions(typing.NamedTuple): - # TODO: Remove this in favor of a better - # HTTP request/response lifecycle tracking. - request_method: str - request_url: str - preload_content: bool - decode_content: bool - enforce_content_length: bool - - -if typing.TYPE_CHECKING: - import ssl - from typing import Literal, Protocol - - from .response import BaseHTTPResponse - - class BaseHTTPConnection(Protocol): - default_port: typing.ClassVar[int] - default_socket_options: typing.ClassVar[_TYPE_SOCKET_OPTIONS] - - host: str - port: int - timeout: None | ( - float - ) # Instance doesn't store _DEFAULT_TIMEOUT, must be resolved. - blocksize: int - source_address: tuple[str, int] | None - socket_options: _TYPE_SOCKET_OPTIONS | None - - proxy: Url | None - proxy_config: ProxyConfig | None - - is_verified: bool - proxy_is_verified: bool | None - - def __init__( - self, - host: str, - port: int | None = None, - *, - timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, - source_address: tuple[str, int] | None = None, - blocksize: int = 8192, - socket_options: _TYPE_SOCKET_OPTIONS | None = ..., - proxy: Url | None = None, - proxy_config: ProxyConfig | None = None, - ) -> None: - ... - - def set_tunnel( - self, - host: str, - port: int | None = None, - headers: typing.Mapping[str, str] | None = None, - scheme: str = "http", - ) -> None: - ... - - def connect(self) -> None: - ... - - def request( - self, - method: str, - url: str, - body: _TYPE_BODY | None = None, - headers: typing.Mapping[str, str] | None = None, - # We know *at least* botocore is depending on the order of the - # first 3 parameters so to be safe we only mark the later ones - # as keyword-only to ensure we have space to extend. - *, - chunked: bool = False, - preload_content: bool = True, - decode_content: bool = True, - enforce_content_length: bool = True, - ) -> None: - ... - - def getresponse(self) -> BaseHTTPResponse: - ... - - def close(self) -> None: - ... - - @property - def is_closed(self) -> bool: - """Whether the connection either is brand new or has been previously closed. - If this property is True then both ``is_connected`` and ``has_connected_to_proxy`` - properties must be False. - """ - - @property - def is_connected(self) -> bool: - """Whether the connection is actively connected to any origin (proxy or target)""" - - @property - def has_connected_to_proxy(self) -> bool: - """Whether the connection has successfully connected to its proxy. - This returns False if no proxy is in use. Used to determine whether - errors are coming from the proxy layer or from tunnelling to the target origin. - """ - - class BaseHTTPSConnection(BaseHTTPConnection, Protocol): - default_port: typing.ClassVar[int] - default_socket_options: typing.ClassVar[_TYPE_SOCKET_OPTIONS] - - # Certificate verification methods - cert_reqs: int | str | None - assert_hostname: None | str | Literal[False] - assert_fingerprint: str | None - ssl_context: ssl.SSLContext | None - - # Trusted CAs - ca_certs: str | None - ca_cert_dir: str | None - ca_cert_data: None | str | bytes - - # TLS version - ssl_minimum_version: int | None - ssl_maximum_version: int | None - ssl_version: int | str | None # Deprecated - - # Client certificates - cert_file: str | None - key_file: str | None - key_password: str | None - - def __init__( - self, - host: str, - port: int | None = None, - *, - timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, - source_address: tuple[str, int] | None = None, - blocksize: int = 16384, - socket_options: _TYPE_SOCKET_OPTIONS | None = ..., - proxy: Url | None = None, - proxy_config: ProxyConfig | None = None, - cert_reqs: int | str | None = None, - assert_hostname: None | str | Literal[False] = None, - assert_fingerprint: str | None = None, - server_hostname: str | None = None, - ssl_context: ssl.SSLContext | None = None, - ca_certs: str | None = None, - ca_cert_dir: str | None = None, - ca_cert_data: None | str | bytes = None, - ssl_minimum_version: int | None = None, - ssl_maximum_version: int | None = None, - ssl_version: int | str | None = None, # Deprecated - cert_file: str | None = None, - key_file: str | None = None, - key_password: str | None = None, - ) -> None: - ... diff --git a/.flatpak-builder/cache/objects/63/17e4a2e7da43c192445702bfb0fdcd4098971458c051dcae4e1f57d19492b8.file b/.flatpak-builder/cache/objects/63/17e4a2e7da43c192445702bfb0fdcd4098971458c051dcae4e1f57d19492b8.file deleted file mode 100644 index 188e13e..0000000 --- a/.flatpak-builder/cache/objects/63/17e4a2e7da43c192445702bfb0fdcd4098971458c051dcae4e1f57d19492b8.file +++ /dev/null @@ -1,99 +0,0 @@ -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. -""" - -from collections import OrderedDict - -from .compat import Mapping, MutableMapping - - -class CaseInsensitiveDict(MutableMapping): - """A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``MutableMapping`` as well as dict's ``copy``. Also - provides ``lower_items``. - - All keys are expected to be strings. The structure remembers the - case of the last key to be set, and ``iter(instance)``, - ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` - will contain case-sensitive keys. However, querying and contains - testing is case insensitive:: - - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - cid['aCCEPT'] == 'application/json' # True - list(cid) == ['Accept'] # True - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header, regardless - of how the header name was originally stored. - - If the constructor, ``.update``, or equality comparison - operations are given keys that have equal ``.lower()``s, the - behavior is undefined. - """ - - def __init__(self, data=None, **kwargs): - self._store = OrderedDict() - if data is None: - data = {} - self.update(data, **kwargs) - - def __setitem__(self, key, value): - # Use the lowercased key for lookups, but store the actual - # key alongside the value. - self._store[key.lower()] = (key, value) - - def __getitem__(self, key): - return self._store[key.lower()][1] - - def __delitem__(self, key): - del self._store[key.lower()] - - def __iter__(self): - return (casedkey for casedkey, mappedvalue in self._store.values()) - - def __len__(self): - return len(self._store) - - def lower_items(self): - """Like iteritems(), but with all lowercase keys.""" - return ((lowerkey, keyval[1]) for (lowerkey, keyval) in self._store.items()) - - def __eq__(self, other): - if isinstance(other, Mapping): - other = CaseInsensitiveDict(other) - else: - return NotImplemented - # Compare insensitively - return dict(self.lower_items()) == dict(other.lower_items()) - - # Copy is required - def copy(self): - return CaseInsensitiveDict(self._store.values()) - - def __repr__(self): - return str(dict(self.items())) - - -class LookupDict(dict): - """Dictionary lookup object.""" - - def __init__(self, name=None): - self.name = name - super().__init__() - - def __repr__(self): - return f"" - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - def get(self, key, default=None): - return self.__dict__.get(key, default) diff --git a/.flatpak-builder/cache/objects/64/58a9431ac38139d1ecb03854e7976594d15e7a599308136a8580bae81c3492.file b/.flatpak-builder/cache/objects/64/58a9431ac38139d1ecb03854e7976594d15e7a599308136a8580bae81c3492.file deleted file mode 100644 index 612c2f3219dfc2827b8c2e51d79337a25cf92f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmZ3^%ge>gz`#)4JLl@v7xl%DfowQngt9)f0U6U7QW%06G#UL?G88cZ`JX|Ozijmr z3kvjeGL!TRDoZl*^NjTj4fTsNOHy?U5|gtN(^HG}ON(-V^2Ykf`FSNpK!x$~nR%Hd p@$q^EmA^P_a`RJ4b5iY!Sb?U2>?`I65+9fu85ut?z=$G{3ju3#D`Efu diff --git a/.flatpak-builder/cache/objects/64/5ac1e787302bebbd823d4acb4824f90c96b7a01aeff868305aa2630226ca83.file b/.flatpak-builder/cache/objects/64/5ac1e787302bebbd823d4acb4824f90c96b7a01aeff868305aa2630226ca83.file deleted file mode 100644 index 66958f0..0000000 --- a/.flatpak-builder/cache/objects/64/5ac1e787302bebbd823d4acb4824f90c96b7a01aeff868305aa2630226ca83.file +++ /dev/null @@ -1 +0,0 @@ -charset_normalizer diff --git a/.flatpak-builder/cache/objects/64/79869a2ad9ff7ebbd0baa90c72f666ea603a54d91d5f1cf20727e0d7b90abf.file b/.flatpak-builder/cache/objects/64/79869a2ad9ff7ebbd0baa90c72f666ea603a54d91d5f1cf20727e0d7b90abf.file deleted file mode 100644 index 5a4da4f..0000000 --- a/.flatpak-builder/cache/objects/64/79869a2ad9ff7ebbd0baa90c72f666ea603a54d91d5f1cf20727e0d7b90abf.file +++ /dev/null @@ -1,6 +0,0 @@ -""" -Expose version -""" - -__version__ = "3.3.2" -VERSION = __version__.split(".") diff --git a/.flatpak-builder/cache/objects/65/298c30d0d3545bb9242fffeec170e6fddccaba65204c84c3f8065bd778e39e.file b/.flatpak-builder/cache/objects/65/298c30d0d3545bb9242fffeec170e6fddccaba65204c84c3f8065bd778e39e.file deleted file mode 100644 index 2e1f3b7424153aa7c7db0a6023eb7a2dabe4894b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27360 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 R>J6I~iDMS>HFz@_{C{?Iq5=Q_ diff --git a/.flatpak-builder/cache/objects/65/90a9794bf990c538e09ed6390b01d58738cd77cce6574ee580b3ba87e1620d.dirtree b/.flatpak-builder/cache/objects/65/90a9794bf990c538e09ed6390b01d58738cd77cce6574ee580b3ba87e1620d.dirtree deleted file mode 100644 index 16fff250c25c0bd7511157f2701b6ba50bf6e505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcma!#&&GoGn6W>!WlAj9vb$azZxk7RM zg@88OSQUm>Pb8D`^YT)YOEUBGF!Y+7*YLP>q}Z)z! 100: - msg = "color specifier is too long" - raise ValueError(msg) - color = color.lower() - - rgb = colormap.get(color, None) - if rgb: - if isinstance(rgb, tuple): - return rgb - colormap[color] = rgb = getrgb(rgb) - return rgb - - # check for known string formats - if re.match("#[a-f0-9]{3}$", color): - return int(color[1] * 2, 16), int(color[2] * 2, 16), int(color[3] * 2, 16) - - if re.match("#[a-f0-9]{4}$", color): - return ( - int(color[1] * 2, 16), - int(color[2] * 2, 16), - int(color[3] * 2, 16), - int(color[4] * 2, 16), - ) - - if re.match("#[a-f0-9]{6}$", color): - return int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16) - - if re.match("#[a-f0-9]{8}$", color): - return ( - int(color[1:3], 16), - int(color[3:5], 16), - int(color[5:7], 16), - int(color[7:9], 16), - ) - - m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) - if m: - return int(m.group(1)), int(m.group(2)), int(m.group(3)) - - m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) - if m: - return ( - int((int(m.group(1)) * 255) / 100.0 + 0.5), - int((int(m.group(2)) * 255) / 100.0 + 0.5), - int((int(m.group(3)) * 255) / 100.0 + 0.5), - ) - - m = re.match( - r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hls_to_rgb - - rgb = hls_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(3)) / 100.0, - float(m.group(2)) / 100.0, - ) - return ( - int(rgb[0] * 255 + 0.5), - int(rgb[1] * 255 + 0.5), - int(rgb[2] * 255 + 0.5), - ) - - m = re.match( - r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hsv_to_rgb - - rgb = hsv_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(2)) / 100.0, - float(m.group(3)) / 100.0, - ) - return ( - int(rgb[0] * 255 + 0.5), - int(rgb[1] * 255 + 0.5), - int(rgb[2] * 255 + 0.5), - ) - - m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) - if m: - return int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)) - msg = f"unknown color specifier: {repr(color)}" - raise ValueError(msg) - - -@lru_cache -def getcolor(color, mode: str) -> tuple[int, ...]: - """ - Same as :py:func:`~PIL.ImageColor.getrgb` for most modes. However, if - ``mode`` is HSV, converts the RGB value to a HSV value, or if ``mode`` is - not color or a palette image, converts the RGB value to a grayscale value. - If the string cannot be parsed, this function raises a :py:exc:`ValueError` - exception. - - .. versionadded:: 1.1.4 - - :param color: A color string - :param mode: Convert result to this mode - :return: ``(graylevel[, alpha]) or (red, green, blue[, alpha])`` - """ - # same as getrgb, but converts the result to the given mode - color, alpha = getrgb(color), 255 - if len(color) == 4: - color, alpha = color[:3], color[3] - - if mode == "HSV": - from colorsys import rgb_to_hsv - - r, g, b = color - h, s, v = rgb_to_hsv(r / 255, g / 255, b / 255) - return int(h * 255), int(s * 255), int(v * 255) - elif Image.getmodebase(mode) == "L": - r, g, b = color - # ITU-R Recommendation 601-2 for nonlinear RGB - # scaled to 24 bits to match the convert's implementation. - color = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 - if mode[-1] == "A": - return color, alpha - else: - if mode[-1] == "A": - return color + (alpha,) - return color - - -colormap = { - # X11 colour table from https://drafts.csswg.org/css-color-4/, with - # gray/grey spelling issues fixed. This is a superset of HTML 4.0 - # colour names used in CSS 1. - "aliceblue": "#f0f8ff", - "antiquewhite": "#faebd7", - "aqua": "#00ffff", - "aquamarine": "#7fffd4", - "azure": "#f0ffff", - "beige": "#f5f5dc", - "bisque": "#ffe4c4", - "black": "#000000", - "blanchedalmond": "#ffebcd", - "blue": "#0000ff", - "blueviolet": "#8a2be2", - "brown": "#a52a2a", - "burlywood": "#deb887", - "cadetblue": "#5f9ea0", - "chartreuse": "#7fff00", - "chocolate": "#d2691e", - "coral": "#ff7f50", - "cornflowerblue": "#6495ed", - "cornsilk": "#fff8dc", - "crimson": "#dc143c", - "cyan": "#00ffff", - "darkblue": "#00008b", - "darkcyan": "#008b8b", - "darkgoldenrod": "#b8860b", - "darkgray": "#a9a9a9", - "darkgrey": "#a9a9a9", - "darkgreen": "#006400", - "darkkhaki": "#bdb76b", - "darkmagenta": "#8b008b", - "darkolivegreen": "#556b2f", - "darkorange": "#ff8c00", - "darkorchid": "#9932cc", - "darkred": "#8b0000", - "darksalmon": "#e9967a", - "darkseagreen": "#8fbc8f", - "darkslateblue": "#483d8b", - "darkslategray": "#2f4f4f", - "darkslategrey": "#2f4f4f", - "darkturquoise": "#00ced1", - "darkviolet": "#9400d3", - "deeppink": "#ff1493", - "deepskyblue": "#00bfff", - "dimgray": "#696969", - "dimgrey": "#696969", - "dodgerblue": "#1e90ff", - "firebrick": "#b22222", - "floralwhite": "#fffaf0", - "forestgreen": "#228b22", - "fuchsia": "#ff00ff", - "gainsboro": "#dcdcdc", - "ghostwhite": "#f8f8ff", - "gold": "#ffd700", - "goldenrod": "#daa520", - "gray": "#808080", - "grey": "#808080", - "green": "#008000", - "greenyellow": "#adff2f", - "honeydew": "#f0fff0", - "hotpink": "#ff69b4", - "indianred": "#cd5c5c", - "indigo": "#4b0082", - "ivory": "#fffff0", - "khaki": "#f0e68c", - "lavender": "#e6e6fa", - "lavenderblush": "#fff0f5", - "lawngreen": "#7cfc00", - "lemonchiffon": "#fffacd", - "lightblue": "#add8e6", - "lightcoral": "#f08080", - "lightcyan": "#e0ffff", - "lightgoldenrodyellow": "#fafad2", - "lightgreen": "#90ee90", - "lightgray": "#d3d3d3", - "lightgrey": "#d3d3d3", - "lightpink": "#ffb6c1", - "lightsalmon": "#ffa07a", - "lightseagreen": "#20b2aa", - "lightskyblue": "#87cefa", - "lightslategray": "#778899", - "lightslategrey": "#778899", - "lightsteelblue": "#b0c4de", - "lightyellow": "#ffffe0", - "lime": "#00ff00", - "limegreen": "#32cd32", - "linen": "#faf0e6", - "magenta": "#ff00ff", - "maroon": "#800000", - "mediumaquamarine": "#66cdaa", - "mediumblue": "#0000cd", - "mediumorchid": "#ba55d3", - "mediumpurple": "#9370db", - "mediumseagreen": "#3cb371", - "mediumslateblue": "#7b68ee", - "mediumspringgreen": "#00fa9a", - "mediumturquoise": "#48d1cc", - "mediumvioletred": "#c71585", - "midnightblue": "#191970", - "mintcream": "#f5fffa", - "mistyrose": "#ffe4e1", - "moccasin": "#ffe4b5", - "navajowhite": "#ffdead", - "navy": "#000080", - "oldlace": "#fdf5e6", - "olive": "#808000", - "olivedrab": "#6b8e23", - "orange": "#ffa500", - "orangered": "#ff4500", - "orchid": "#da70d6", - "palegoldenrod": "#eee8aa", - "palegreen": "#98fb98", - "paleturquoise": "#afeeee", - "palevioletred": "#db7093", - "papayawhip": "#ffefd5", - "peachpuff": "#ffdab9", - "peru": "#cd853f", - "pink": "#ffc0cb", - "plum": "#dda0dd", - "powderblue": "#b0e0e6", - "purple": "#800080", - "rebeccapurple": "#663399", - "red": "#ff0000", - "rosybrown": "#bc8f8f", - "royalblue": "#4169e1", - "saddlebrown": "#8b4513", - "salmon": "#fa8072", - "sandybrown": "#f4a460", - "seagreen": "#2e8b57", - "seashell": "#fff5ee", - "sienna": "#a0522d", - "silver": "#c0c0c0", - "skyblue": "#87ceeb", - "slateblue": "#6a5acd", - "slategray": "#708090", - "slategrey": "#708090", - "snow": "#fffafa", - "springgreen": "#00ff7f", - "steelblue": "#4682b4", - "tan": "#d2b48c", - "teal": "#008080", - "thistle": "#d8bfd8", - "tomato": "#ff6347", - "turquoise": "#40e0d0", - "violet": "#ee82ee", - "wheat": "#f5deb3", - "white": "#ffffff", - "whitesmoke": "#f5f5f5", - "yellow": "#ffff00", - "yellowgreen": "#9acd32", -} diff --git a/.flatpak-builder/cache/objects/66/6359be32870d8827270337d51279fe5a45967dbb82ee5c44a86a84a05ad9a1.file b/.flatpak-builder/cache/objects/66/6359be32870d8827270337d51279fe5a45967dbb82ee5c44a86a84a05ad9a1.file deleted file mode 100644 index 55b34c99e9704390730d27309db1d43cc99405de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25062 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 AVE_OC diff --git a/.flatpak-builder/cache/objects/66/9937258a75b410d2e3e42e437ce756be403dc60eeb05b6efb4148fda92d77e.file b/.flatpak-builder/cache/objects/66/9937258a75b410d2e3e42e437ce756be403dc60eeb05b6efb4148fda92d77e.file deleted file mode 100644 index a3109eb..0000000 --- a/.flatpak-builder/cache/objects/66/9937258a75b410d2e3e42e437ce756be403dc60eeb05b6efb4148fda92d77e.file +++ /dev/null @@ -1,57 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read GIMP palette files -# -# History: -# 1997-08-23 fl Created -# 2004-09-07 fl Support GIMP 2.0 palette files. -# -# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. -# Copyright (c) Fredrik Lundh 1997-2004. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re - -from ._binary import o8 - - -class GimpPaletteFile: - """File handler for GIMP's palette format.""" - - rawmode = "RGB" - - def __init__(self, fp): - self.palette = [o8(i) * 3 for i in range(256)] - - if fp.readline()[:12] != b"GIMP Palette": - msg = "not a GIMP palette file" - raise SyntaxError(msg) - - for i in range(256): - s = fp.readline() - if not s: - break - - # skip fields and comment lines - if re.match(rb"\w+:|#", s): - continue - if len(s) > 100: - msg = "bad palette file" - raise SyntaxError(msg) - - v = tuple(map(int, s.split()[:3])) - if len(v) != 3: - msg = "bad palette entry" - raise ValueError(msg) - - self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) - - self.palette = b"".join(self.palette) - - def getpalette(self): - return self.palette, self.rawmode diff --git a/.flatpak-builder/cache/objects/66/d06baa08f6542179cc704a93ee8fab33e50fe8c9ffbabbc7465ff45594e26b.file b/.flatpak-builder/cache/objects/66/d06baa08f6542179cc704a93ee8fab33e50fe8c9ffbabbc7465ff45594e26b.file deleted file mode 100644 index aeca0c7..0000000 --- a/.flatpak-builder/cache/objects/66/d06baa08f6542179cc704a93ee8fab33e50fe8c9ffbabbc7465ff45594e26b.file +++ /dev/null @@ -1,124 +0,0 @@ -from __future__ import annotations - -import select -import socket -from functools import partial - -__all__ = ["wait_for_read", "wait_for_write"] - - -# How should we wait on sockets? -# -# There are two types of APIs you can use for waiting on sockets: the fancy -# modern stateful APIs like epoll/kqueue, and the older stateless APIs like -# select/poll. The stateful APIs are more efficient when you have a lots of -# sockets to keep track of, because you can set them up once and then use them -# lots of times. But we only ever want to wait on a single socket at a time -# and don't want to keep track of state, so the stateless APIs are actually -# more efficient. So we want to use select() or poll(). -# -# Now, how do we choose between select() and poll()? On traditional Unixes, -# select() has a strange calling convention that makes it slow, or fail -# altogether, for high-numbered file descriptors. The point of poll() is to fix -# that, so on Unixes, we prefer poll(). -# -# On Windows, there is no poll() (or at least Python doesn't provide a wrapper -# for it), but that's OK, because on Windows, select() doesn't have this -# strange calling convention; plain select() works fine. -# -# So: on Windows we use select(), and everywhere else we use poll(). We also -# fall back to select() in case poll() is somehow broken or missing. - - -def select_wait_for_socket( - sock: socket.socket, - read: bool = False, - write: bool = False, - timeout: float | None = None, -) -> bool: - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - rcheck = [] - wcheck = [] - if read: - rcheck.append(sock) - if write: - wcheck.append(sock) - # When doing a non-blocking connect, most systems signal success by - # marking the socket writable. Windows, though, signals success by marked - # it as "exceptional". We paper over the difference by checking the write - # sockets for both conditions. (The stdlib selectors module does the same - # thing.) - fn = partial(select.select, rcheck, wcheck, wcheck) - rready, wready, xready = fn(timeout) - return bool(rready or wready or xready) - - -def poll_wait_for_socket( - sock: socket.socket, - read: bool = False, - write: bool = False, - timeout: float | None = None, -) -> bool: - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - mask = 0 - if read: - mask |= select.POLLIN - if write: - mask |= select.POLLOUT - poll_obj = select.poll() - poll_obj.register(sock, mask) - - # For some reason, poll() takes timeout in milliseconds - def do_poll(t: float | None) -> list[tuple[int, int]]: - if t is not None: - t *= 1000 - return poll_obj.poll(t) - - return bool(do_poll(timeout)) - - -def _have_working_poll() -> bool: - # Apparently some systems have a select.poll that fails as soon as you try - # to use it, either due to strange configuration or broken monkeypatching - # from libraries like eventlet/greenlet. - try: - poll_obj = select.poll() - poll_obj.poll(0) - except (AttributeError, OSError): - return False - else: - return True - - -def wait_for_socket( - sock: socket.socket, - read: bool = False, - write: bool = False, - timeout: float | None = None, -) -> bool: - # We delay choosing which implementation to use until the first time we're - # called. We could do it at import time, but then we might make the wrong - # decision if someone goes wild with monkeypatching select.poll after - # we're imported. - global wait_for_socket - if _have_working_poll(): - wait_for_socket = poll_wait_for_socket - elif hasattr(select, "select"): - wait_for_socket = select_wait_for_socket - return wait_for_socket(sock, read, write, timeout) - - -def wait_for_read(sock: socket.socket, timeout: float | None = None) -> bool: - """Waits for reading to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, read=True, timeout=timeout) - - -def wait_for_write(sock: socket.socket, timeout: float | None = None) -> bool: - """Waits for writing to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/.flatpak-builder/cache/objects/67/5ead147f3843b2b357bb186c2e5b0e380149386d286d936a631b3eeaa3be50.file b/.flatpak-builder/cache/objects/67/5ead147f3843b2b357bb186c2e5b0e380149386d286d936a631b3eeaa3be50.file deleted file mode 100644 index 5a80391..0000000 --- a/.flatpak-builder/cache/objects/67/5ead147f3843b2b357bb186c2e5b0e380149386d286d936a631b3eeaa3be50.file +++ /dev/null @@ -1,230 +0,0 @@ -""" -This module contains provisional support for SOCKS proxies from within -urllib3. This module supports SOCKS4, SOCKS4A (an extension of SOCKS4), and -SOCKS5. To enable its functionality, either install PySocks or install this -module with the ``socks`` extra. - -The SOCKS implementation supports the full range of urllib3 features. It also -supports the following SOCKS features: - -- SOCKS4A (``proxy_url='socks4a://...``) -- SOCKS4 (``proxy_url='socks4://...``) -- SOCKS5 with remote DNS (``proxy_url='socks5h://...``) -- SOCKS5 with local DNS (``proxy_url='socks5://...``) -- Usernames and passwords for the SOCKS proxy - -.. note:: - It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in - your ``proxy_url`` to ensure that DNS resolution is done from the remote - server instead of client-side when connecting to a domain name. - -SOCKS4 supports IPv4 and domain names with the SOCKS4A extension. SOCKS5 -supports IPv4, IPv6, and domain names. - -When connecting to a SOCKS4 proxy the ``username`` portion of the ``proxy_url`` -will be sent as the ``userid`` section of the SOCKS request: - -.. code-block:: python - - proxy_url="socks4a://@proxy-host" - -When connecting to a SOCKS5 proxy the ``username`` and ``password`` portion -of the ``proxy_url`` will be sent as the username/password to authenticate -with the proxy: - -.. code-block:: python - - proxy_url="socks5h://:@proxy-host" - -""" - -from __future__ import annotations - -try: - import socks # type: ignore[import-not-found] -except ImportError: - import warnings - - from ..exceptions import DependencyWarning - - warnings.warn( - ( - "SOCKS support in urllib3 requires the installation of optional " - "dependencies: specifically, PySocks. For more information, see " - "https://urllib3.readthedocs.io/en/latest/advanced-usage.html#socks-proxies" - ), - DependencyWarning, - ) - raise - -import typing -from socket import timeout as SocketTimeout - -from ..connection import HTTPConnection, HTTPSConnection -from ..connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from ..exceptions import ConnectTimeoutError, NewConnectionError -from ..poolmanager import PoolManager -from ..util.url import parse_url - -try: - import ssl -except ImportError: - ssl = None # type: ignore[assignment] - -from typing import TypedDict - - -class _TYPE_SOCKS_OPTIONS(TypedDict): - socks_version: int - proxy_host: str | None - proxy_port: str | None - username: str | None - password: str | None - rdns: bool - - -class SOCKSConnection(HTTPConnection): - """ - A plain-text HTTP connection that connects via a SOCKS proxy. - """ - - def __init__( - self, - _socks_options: _TYPE_SOCKS_OPTIONS, - *args: typing.Any, - **kwargs: typing.Any, - ) -> None: - self._socks_options = _socks_options - super().__init__(*args, **kwargs) - - def _new_conn(self) -> socks.socksocket: - """ - Establish a new connection via the SOCKS proxy. - """ - extra_kw: dict[str, typing.Any] = {} - if self.source_address: - extra_kw["source_address"] = self.source_address - - if self.socket_options: - extra_kw["socket_options"] = self.socket_options - - try: - conn = socks.create_connection( - (self.host, self.port), - proxy_type=self._socks_options["socks_version"], - proxy_addr=self._socks_options["proxy_host"], - proxy_port=self._socks_options["proxy_port"], - proxy_username=self._socks_options["username"], - proxy_password=self._socks_options["password"], - proxy_rdns=self._socks_options["rdns"], - timeout=self.timeout, - **extra_kw, - ) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, - f"Connection to {self.host} timed out. (connect timeout={self.timeout})", - ) from e - - except socks.ProxyError as e: - # This is fragile as hell, but it seems to be the only way to raise - # useful errors here. - if e.socket_err: - error = e.socket_err - if isinstance(error, SocketTimeout): - raise ConnectTimeoutError( - self, - f"Connection to {self.host} timed out. (connect timeout={self.timeout})", - ) from e - else: - # Adding `from e` messes with coverage somehow, so it's omitted. - # See #2386. - raise NewConnectionError( - self, f"Failed to establish a new connection: {error}" - ) - else: - raise NewConnectionError( - self, f"Failed to establish a new connection: {e}" - ) from e - - except OSError as e: # Defensive: PySocks should catch all these. - raise NewConnectionError( - self, f"Failed to establish a new connection: {e}" - ) from e - - return conn - - -# We don't need to duplicate the Verified/Unverified distinction from -# urllib3/connection.py here because the HTTPSConnection will already have been -# correctly set to either the Verified or Unverified form by that module. This -# means the SOCKSHTTPSConnection will automatically be the correct type. -class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): - pass - - -class SOCKSHTTPConnectionPool(HTTPConnectionPool): - ConnectionCls = SOCKSConnection - - -class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): - ConnectionCls = SOCKSHTTPSConnection - - -class SOCKSProxyManager(PoolManager): - """ - A version of the urllib3 ProxyManager that routes connections via the - defined SOCKS proxy. - """ - - pool_classes_by_scheme = { - "http": SOCKSHTTPConnectionPool, - "https": SOCKSHTTPSConnectionPool, - } - - def __init__( - self, - proxy_url: str, - username: str | None = None, - password: str | None = None, - num_pools: int = 10, - headers: typing.Mapping[str, str] | None = None, - **connection_pool_kw: typing.Any, - ): - parsed = parse_url(proxy_url) - - if username is None and password is None and parsed.auth is not None: - split = parsed.auth.split(":") - if len(split) == 2: - username, password = split - if parsed.scheme == "socks5": - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = False - elif parsed.scheme == "socks5h": - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = True - elif parsed.scheme == "socks4": - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = False - elif parsed.scheme == "socks4a": - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = True - else: - raise ValueError(f"Unable to determine SOCKS version from {proxy_url}") - - self.proxy_url = proxy_url - - socks_options = { - "socks_version": socks_version, - "proxy_host": parsed.host, - "proxy_port": parsed.port, - "username": username, - "password": password, - "rdns": rdns, - } - connection_pool_kw["_socks_options"] = socks_options - - super().__init__(num_pools, headers, **connection_pool_kw) - - self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/.flatpak-builder/cache/objects/67/dff40667d4d9307b1fdb1f850257b0cbcd66639f657548af0cea70019a2945.file b/.flatpak-builder/cache/objects/67/dff40667d4d9307b1fdb1f850257b0cbcd66639f657548af0cea70019a2945.file deleted file mode 100644 index 770d100..0000000 --- a/.flatpak-builder/cache/objects/67/dff40667d4d9307b1fdb1f850257b0cbcd66639f657548af0cea70019a2945.file +++ /dev/null @@ -1,263 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# image palette object -# -# History: -# 1996-03-11 fl Rewritten. -# 1997-01-03 fl Up and running. -# 1997-08-23 fl Added load hack -# 2001-04-16 fl Fixed randint shadow bug in random() -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import array -from typing import Sequence - -from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile - - -class ImagePalette: - """ - Color palette for palette mapped images - - :param mode: The mode to use for the palette. See: - :ref:`concept-modes`. Defaults to "RGB" - :param palette: An optional palette. If given, it must be a bytearray, - an array or a list of ints between 0-255. The list must consist of - all channels for one color followed by the next color (e.g. RGBRGBRGB). - Defaults to an empty palette. - """ - - def __init__(self, mode: str = "RGB", palette: Sequence[int] | None = None) -> None: - self.mode = mode - self.rawmode = None # if set, palette contains raw data - self.palette = palette or bytearray() - self.dirty: int | None = None - - @property - def palette(self): - return self._palette - - @palette.setter - def palette(self, palette): - self._colors = None - self._palette = palette - - @property - def colors(self): - if self._colors is None: - mode_len = len(self.mode) - self._colors = {} - for i in range(0, len(self.palette), mode_len): - color = tuple(self.palette[i : i + mode_len]) - if color in self._colors: - continue - self._colors[color] = i // mode_len - return self._colors - - @colors.setter - def colors(self, colors): - self._colors = colors - - def copy(self): - new = ImagePalette() - - new.mode = self.mode - new.rawmode = self.rawmode - if self.palette is not None: - new.palette = self.palette[:] - new.dirty = self.dirty - - return new - - def getdata(self): - """ - Get palette contents in format suitable for the low-level - ``im.putpalette`` primitive. - - .. warning:: This method is experimental. - """ - if self.rawmode: - return self.rawmode, self.palette - return self.mode, self.tobytes() - - def tobytes(self): - """Convert palette to bytes. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(self.palette, bytes): - return self.palette - arr = array.array("B", self.palette) - return arr.tobytes() - - # Declare tostring as an alias for tobytes - tostring = tobytes - - def _new_color_index(self, image=None, e=None): - if not isinstance(self.palette, bytearray): - self._palette = bytearray(self.palette) - index = len(self.palette) // 3 - special_colors = () - if image: - special_colors = ( - image.info.get("background"), - image.info.get("transparency"), - ) - while index in special_colors: - index += 1 - if index >= 256: - if image: - # Search for an unused index - for i, count in reversed(list(enumerate(image.histogram()))): - if count == 0 and i not in special_colors: - index = i - break - if index >= 256: - msg = "cannot allocate more than 256 colors" - raise ValueError(msg) from e - return index - - def getcolor(self, color, image=None) -> int: - """Given an rgb tuple, allocate palette entry. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(color, tuple): - if self.mode == "RGB": - if len(color) == 4: - if color[3] != 255: - msg = "cannot add non-opaque RGBA color to RGB palette" - raise ValueError(msg) - color = color[:3] - elif self.mode == "RGBA": - if len(color) == 3: - color += (255,) - try: - return self.colors[color] - except KeyError as e: - # allocate new color slot - index = self._new_color_index(image, e) - self.colors[color] = index - if index * 3 < len(self.palette): - self._palette = ( - self.palette[: index * 3] - + bytes(color) - + self.palette[index * 3 + 3 :] - ) - else: - self._palette += bytes(color) - self.dirty = 1 - return index - else: - msg = f"unknown color specifier: {repr(color)}" - raise ValueError(msg) - - def save(self, fp): - """Save palette to text file. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(fp, str): - fp = open(fp, "w") - fp.write("# Palette\n") - fp.write(f"# Mode: {self.mode}\n") - for i in range(256): - fp.write(f"{i}") - for j in range(i * len(self.mode), (i + 1) * len(self.mode)): - try: - fp.write(f" {self.palette[j]}") - except IndexError: - fp.write(" 0") - fp.write("\n") - fp.close() - - -# -------------------------------------------------------------------- -# Internal - - -def raw(rawmode, data) -> ImagePalette: - palette = ImagePalette() - palette.rawmode = rawmode - palette.palette = data - palette.dirty = 1 - return palette - - -# -------------------------------------------------------------------- -# Factories - - -def make_linear_lut(black, white): - if black == 0: - return [white * i // 255 for i in range(256)] - - msg = "unavailable when black is non-zero" - raise NotImplementedError(msg) # FIXME - - -def make_gamma_lut(exp): - return [int(((i / 255.0) ** exp) * 255.0 + 0.5) for i in range(256)] - - -def negative(mode="RGB"): - palette = list(range(256 * len(mode))) - palette.reverse() - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def random(mode="RGB"): - from random import randint - - palette = [randint(0, 255) for _ in range(256 * len(mode))] - return ImagePalette(mode, palette) - - -def sepia(white="#fff0c0"): - bands = [make_linear_lut(0, band) for band in ImageColor.getrgb(white)] - return ImagePalette("RGB", [bands[i % 3][i // 3] for i in range(256 * 3)]) - - -def wedge(mode="RGB"): - palette = list(range(256 * len(mode))) - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def load(filename): - # FIXME: supports GIMP gradients only - - with open(filename, "rb") as fp: - for paletteHandler in [ - GimpPaletteFile.GimpPaletteFile, - GimpGradientFile.GimpGradientFile, - PaletteFile.PaletteFile, - ]: - try: - fp.seek(0) - lut = paletteHandler(fp).getpalette() - if lut: - break - except (SyntaxError, ValueError): - pass - else: - msg = "cannot load palette" - raise OSError(msg) - - return lut # data, rawmode diff --git a/.flatpak-builder/cache/objects/68/cf45a15f6fd9ede625536a1f672d34d25915adff1b138714bb770c23722e1f.commit b/.flatpak-builder/cache/objects/68/cf45a15f6fd9ede625536a1f672d34d25915adff1b138714bb770c23722e1f.commit deleted file mode 100644 index 534fb9b415d4909ba92ea38628838e233bd64f3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2108 zcmV-C2*dYdXkl(=WpjD}000000000ViwFP!000001GSo4XdG1-$2a#jNwc|Mnl#xY zZFB3+-g2u&C8P@mVq=>Wi$#{n>`8ab+?<(ByMjpRi)no+1w}!sQm9stqE!&8R76TG zq9RHW#S30)L7`9|q==r`o!w10v)TF1oMm5@o%#J{XU?4e_s!W|;svDn7J13Flz!)v zWL0DZ{wbuI9}4_p_MJ~j=rLIeF@b>Phdzzhkyl~4W%dZtZ0zFWkgD@bJYZLE&>tLS zg7_8XHQmcgOR_WCH?wbkVQO|Ze88b+c4j)fZ$9kM@^E-zYVXv-ltayd@buh)y$&Uh zJ`@hmI&|o=5)se}5*YoM4siJ*5nkf;NQ6-mFid25i2zd)9LvQ}BtnQ~zc81=yrDn< ze+!P>XPyZqA1ABGi3@x1J4Qhwh%$}}8w(}D=m`ZyZ80%c)sP;s3N8rc4KX2brWCXQ zv!$>Pk}-vCpsXpZ17uENnf>f3>_U>RCL)T=OS)z|h6-!p(YDSBPB|+BEby!hu1hs&Uuw0@DVzC$(LX@LO(25|A>wHnXD@fIN zS)yb%Zdu|vkMB%!RdMS(3od)iAU=9J4D1Q`sKnac4>u|kuugV81?yZbc(YSwL|d2FLI7z_EpYqIs0D1h z`7~H)qL~aRd2$&?IkQg2;fcgiGKmUH)R|bQ$R1bMiHr}Ttj^Mr;YSHp!kehr%qtNWI_SP4=V(DVOTxLuK_Gz3bB!6|H1J5LfE0kcD>23053+QRnYRa zh69x_E6!0F%Of=VDw<9lCPg6pkN3Fc2Z;{myo_LakIGylU z6H6~A3qndsR30sz=FE+V2vbpdUI)JzS^4N+&8$(8Wr3E}Sqp7tT;h>HZ(Iyaku{=c z5G!9y*OeeGnK2L|E8*=bEhR2t3LXri_1KIrcRm9XYVEWIqPepZh{JxVNn^xknlq)q zu&(C$&*sJmY3az~L?y%mr&3C+yh=h=aCOxj<&>3JlR2_S>Rc%jHBRO6vybGAb~>2% zm>i9(wTbEw=Q#wOVprfGOGxL4*2!%8&FCuX5u9hc#UY%;U#=_rHj=#Fk)yJ@jH}xd zkXGADoEkmH-!DB#6h!7&keRaiM#iUN490?28q%QIkwGD|@q%Hg{tCvdZKHrB;OD?J zLpburLIHGt(%N9MMAaadrIP>aq;wL0omNrhV?=+7%xk2O>K0DtIc_1$IxiwQPS=Sy(DmUDs0xp=yz?_AZY`2@YBm#q zWL4foiPPPjf&^f4rV(;E6N=1|oi_x0dU_C`#w;MgjGLW+OWxC%TVYj$a#g!}Ttlu0 zT&(Lk*Qc(=l0zkDOMWRCEY(ZjEd9B(ql_66R?rWKEdA8+J%k7rQ)~8!PZmnwD*LJ$?ySC=`+4h&)Z@15MywveqM`-KutzT^Q zbZVVfI_tU~?|Q52zpjOC=ePa6&EG9|pYQ&*yRK)tC((1U=T=X*XWp~w`N;E+XRKH5 zJ=gnrZ*|{X-%Y+dQ-AyR*!C;in|BC1F7K$@8QuBb&hmkUfma9a4D1~| zG5F!&zk{Pg;?RYm?}xgE4-daHTsy*!oE`aNB(&@KU3YgK_I}{?Faq-lQ|mkEJL~(w z*XdvIulld}@A#R(V&KKVwLnF1D)@Zx&)|chGohQI`$kWV-Wr`AdtvPNvB~k(@vGym zi9HiXCoWFhoM0xU$u}l{oNV9y$nHbC{|EW`Y1#-o0001Cc?kdj0001TWo>VEVQh1H z000000000ViwFP!000000|Nj60000000000VR;HX2WSTdRa4uWUp&Hk91+WA_2gPf z0DVhEPbgB*IUqVgW%y|{VKp%`G&N*4F*#vlVKp~mWMwrqWimE5Wo2PvWn^VIIWb}| zGc#s1IWadiVq;}vV>dEkF*!IlIWaLcIb=BiLUn0ubRckfbZBpGGc9suadl;LbaM&- z000000001HNdh4@=jJCHX0b-_b7Ji}@nFgfRUl0d?9 None: - """ - Deprecations helper. - - :param deprecated: Name of thing to be deprecated. - :param when: Pillow major version to be removed in. - :param replacement: Name of replacement. - :param action: Instead of "replacement", give a custom call to action - e.g. "Upgrade to new thing". - :param plural: if the deprecated thing is plural, needing "are" instead of "is". - - Usually of the form: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). - Use [replacement] instead." - - You can leave out the replacement sentence: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd)" - - Or with another call to action: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). - [action]." - """ - - is_ = "are" if plural else "is" - - if when is None: - removed = "a future version" - elif when <= int(__version__.split(".")[0]): - msg = f"{deprecated} {is_} deprecated and should be removed." - raise RuntimeError(msg) - elif when == 11: - removed = "Pillow 11 (2024-10-15)" - elif when == 12: - removed = "Pillow 12 (2025-10-15)" - else: - msg = f"Unknown removal version: {when}. Update {__name__}?" - raise ValueError(msg) - - if replacement and action: - msg = "Use only one of 'replacement' and 'action'" - raise ValueError(msg) - - if replacement: - action = f". Use {replacement} instead." - elif action: - action = f". {action.rstrip('.')}." - else: - action = "" - - warnings.warn( - f"{deprecated} {is_} deprecated and will be removed in {removed}{action}", - DeprecationWarning, - stacklevel=3, - ) diff --git a/.flatpak-builder/cache/objects/69/78ff71222efc73554b67b719fad96f46ac71332ae5343c2ea01f3b92f14572.file b/.flatpak-builder/cache/objects/69/78ff71222efc73554b67b719fad96f46ac71332ae5343c2ea01f3b92f14572.file deleted file mode 100644 index 6aafd4c58cd2f56d5e763adc1aaa1e596bf17da3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3734 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 P5; T: - self.lock.acquire() - return self._obj - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: types.TracebackType | None, - ) -> None: - self.lock.release() - - -class HTTP2Connection(HTTPSConnection): - def __init__( - self, host: str, port: int | None = None, **kwargs: typing.Any - ) -> None: - self._h2_conn = self._new_h2_conn() - self._h2_stream: int | None = None - self._h2_headers: list[tuple[bytes, bytes]] = [] - - if "proxy" in kwargs or "proxy_config" in kwargs: # Defensive: - raise NotImplementedError("Proxies aren't supported with HTTP/2") - - super().__init__(host, port, **kwargs) - - def _new_h2_conn(self) -> _LockedObject[h2.connection.H2Connection]: - config = h2.config.H2Configuration(client_side=True) - return _LockedObject(h2.connection.H2Connection(config=config)) - - def connect(self) -> None: - super().connect() - - with self._h2_conn as h2_conn: - h2_conn.initiate_connection() - self.sock.sendall(h2_conn.data_to_send()) - - def putrequest( - self, - method: str, - url: str, - skip_host: bool = False, - skip_accept_encoding: bool = False, - ) -> None: - with self._h2_conn as h2_conn: - self._request_url = url - self._h2_stream = h2_conn.get_next_available_stream_id() - - if ":" in self.host: - authority = f"[{self.host}]:{self.port or 443}" - else: - authority = f"{self.host}:{self.port or 443}" - - self._h2_headers.extend( - ( - (b":scheme", b"https"), - (b":method", method.encode()), - (b":authority", authority.encode()), - (b":path", url.encode()), - ) - ) - - def putheader(self, header: str, *values: str) -> None: # type: ignore[override] - for value in values: - self._h2_headers.append( - (header.encode("utf-8").lower(), value.encode("utf-8")) - ) - - def endheaders(self) -> None: # type: ignore[override] - with self._h2_conn as h2_conn: - h2_conn.send_headers( - stream_id=self._h2_stream, - headers=self._h2_headers, - end_stream=True, - ) - if data_to_send := h2_conn.data_to_send(): - self.sock.sendall(data_to_send) - - def send(self, data: bytes) -> None: # type: ignore[override] # Defensive: - if not data: - return - raise NotImplementedError("Sending data isn't supported yet") - - def getresponse( # type: ignore[override] - self, - ) -> HTTP2Response: - status = None - data = bytearray() - with self._h2_conn as h2_conn: - end_stream = False - while not end_stream: - # TODO: Arbitrary read value. - if received_data := self.sock.recv(65535): - events = h2_conn.receive_data(received_data) - for event in events: - if isinstance(event, h2.events.ResponseReceived): - headers = HTTPHeaderDict() - for header, value in event.headers: - if header == b":status": - status = int(value.decode()) - else: - headers.add( - header.decode("ascii"), value.decode("ascii") - ) - - elif isinstance(event, h2.events.DataReceived): - data += event.data - h2_conn.acknowledge_received_data( - event.flow_controlled_length, event.stream_id - ) - - elif isinstance(event, h2.events.StreamEnded): - end_stream = True - - if data_to_send := h2_conn.data_to_send(): - self.sock.sendall(data_to_send) - - # We always close to not have to handle connection management. - self.close() - - assert status is not None - return HTTP2Response( - status=status, - headers=headers, - request_url=self._request_url, - data=bytes(data), - ) - - def close(self) -> None: - with self._h2_conn as h2_conn: - try: - h2_conn.close_connection() - if data := h2_conn.data_to_send(): - self.sock.sendall(data) - except Exception: - pass - - # Reset all our HTTP/2 connection state. - self._h2_conn = self._new_h2_conn() - self._h2_stream = None - self._h2_headers = [] - - super().close() - - -class HTTP2Response(BaseHTTPResponse): - # TODO: This is a woefully incomplete response object, but works for non-streaming. - def __init__( - self, - status: int, - headers: HTTPHeaderDict, - request_url: str, - data: bytes, - decode_content: bool = False, # TODO: support decoding - ) -> None: - super().__init__( - status=status, - headers=headers, - # Following CPython, we map HTTP versions to major * 10 + minor integers - version=20, - # No reason phrase in HTTP/2 - reason=None, - decode_content=decode_content, - request_url=request_url, - ) - self._data = data - self.length_remaining = 0 - - @property - def data(self) -> bytes: - return self._data - - def get_redirect_location(self) -> None: - return None - - def close(self) -> None: - pass - - -def inject_into_urllib3() -> None: - HTTPSConnectionPool.ConnectionCls = HTTP2Connection - urllib3.connection.HTTPSConnection = HTTP2Connection # type: ignore[misc] - - # TODO: Offer 'http/1.1' as well, but for testing purposes this is handy. - urllib3.util.ssl_.ALPN_PROTOCOLS = ["h2"] - - -def extract_from_urllib3() -> None: - HTTPSConnectionPool.ConnectionCls = orig_HTTPSConnection - urllib3.connection.HTTPSConnection = orig_HTTPSConnection # type: ignore[misc] - - urllib3.util.ssl_.ALPN_PROTOCOLS = ["http/1.1"] diff --git a/.flatpak-builder/cache/objects/6a/431d48fc2a1ad7e92b7196fd9996c7284ae8af8b533bf5e8ef07fb62ae95ea.file b/.flatpak-builder/cache/objects/6a/431d48fc2a1ad7e92b7196fd9996c7284ae8af8b533bf5e8ef07fb62ae95ea.file deleted file mode 100644 index eee7274..0000000 --- a/.flatpak-builder/cache/objects/6a/431d48fc2a1ad7e92b7196fd9996c7284ae8af8b533bf5e8ef07fb62ae95ea.file +++ /dev/null @@ -1,98 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XBM File handling -# -# History: -# 1995-09-08 fl Created -# 1996-11-01 fl Added save support -# 1997-07-07 fl Made header parser more tolerant -# 1997-07-22 fl Fixed yet another parser bug -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) -# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) -# 2004-02-24 fl Allow some whitespace before first #define -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re -from typing import IO - -from . import Image, ImageFile - -# XBM header -xbm_head = re.compile( - rb"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" - b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" - b"(?P" - b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" - b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" - b")?" - rb"[\000-\377]*_bits\[]" -) - - -def _accept(prefix: bytes) -> bool: - return prefix.lstrip()[:7] == b"#define" - - -## -# Image plugin for X11 bitmaps. - - -class XbmImageFile(ImageFile.ImageFile): - format = "XBM" - format_description = "X11 Bitmap" - - def _open(self) -> None: - assert self.fp is not None - - m = xbm_head.match(self.fp.read(512)) - - if not m: - msg = "not a XBM file" - raise SyntaxError(msg) - - xsize = int(m.group("width")) - ysize = int(m.group("height")) - - if m.group("hotspot"): - self.info["hotspot"] = (int(m.group("xhot")), int(m.group("yhot"))) - - self._mode = "1" - self._size = xsize, ysize - - self.tile = [("xbm", (0, 0) + self.size, m.end(), None)] - - -def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None: - if im.mode != "1": - msg = f"cannot write mode {im.mode} as XBM" - raise OSError(msg) - - fp.write(f"#define im_width {im.size[0]}\n".encode("ascii")) - fp.write(f"#define im_height {im.size[1]}\n".encode("ascii")) - - hotspot = im.encoderinfo.get("hotspot") - if hotspot: - fp.write(f"#define im_x_hot {hotspot[0]}\n".encode("ascii")) - fp.write(f"#define im_y_hot {hotspot[1]}\n".encode("ascii")) - - fp.write(b"static char im_bits[] = {\n") - - ImageFile._save(im, fp, [("xbm", (0, 0) + im.size, 0, None)]) - - fp.write(b"};\n") - - -Image.register_open(XbmImageFile.format, XbmImageFile, _accept) -Image.register_save(XbmImageFile.format, _save) - -Image.register_extension(XbmImageFile.format, ".xbm") - -Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/.flatpak-builder/cache/objects/6b/2a99acb8cdd0dce16c879840121b1816abe431507451dcc2ab02d41c6b8cac.file b/.flatpak-builder/cache/objects/6b/2a99acb8cdd0dce16c879840121b1816abe431507451dcc2ab02d41c6b8cac.file deleted file mode 100644 index 37d5977effc6de6a979e95dfa1d5a2f0fce928c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23422 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 D51T~` diff --git a/.flatpak-builder/cache/objects/6b/e1dfc1b49dae1204d305a4c5655655f38f1aceba39f69fe0d399f189b6f225.file b/.flatpak-builder/cache/objects/6b/e1dfc1b49dae1204d305a4c5655655f38f1aceba39f69fe0d399f189b6f225.file deleted file mode 100644 index c61717c56698794b4a35da35cfb0c4c3fe00a7de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8119 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 L7whCQZ1H~s8j&({ diff --git a/.flatpak-builder/cache/objects/6d/489324a5c37814a2ef005883afeda3b37d951e51c09f08cfb1c21ecce70597.file b/.flatpak-builder/cache/objects/6d/489324a5c37814a2ef005883afeda3b37d951e51c09f08cfb1c21ecce70597.file deleted file mode 100644 index bf84d39..0000000 --- a/.flatpak-builder/cache/objects/6d/489324a5c37814a2ef005883afeda3b37d951e51c09f08cfb1c21ecce70597.file +++ /dev/null @@ -1,22 +0,0 @@ -idna-3.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -idna-3.7.dist-info/LICENSE.md,sha256=pZ8LDvNjWHQQmkRhykT_enDVBpboFHZ7-vch1Mmw2w8,1541 -idna-3.7.dist-info/METADATA,sha256=OixCk-dKLZkPy-MfviOmiPvwJ1O2K_8rqCrFjC_uxy4,9888 -idna-3.7.dist-info/RECORD,, -idna-3.7.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 -idna/__pycache__/__init__.cpython-311.pyc,, -idna/__pycache__/codec.cpython-311.pyc,, -idna/__pycache__/compat.cpython-311.pyc,, -idna/__pycache__/core.cpython-311.pyc,, -idna/__pycache__/idnadata.cpython-311.pyc,, -idna/__pycache__/intranges.cpython-311.pyc,, -idna/__pycache__/package_data.cpython-311.pyc,, -idna/__pycache__/uts46data.cpython-311.pyc,, -idna/codec.py,sha256=PS6m-XmdST7Wj7J7ulRMakPDt5EBJyYrT3CPtjh-7t4,3426 -idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 -idna/core.py,sha256=lyhpoe2vulEaB_65xhXmoKgO-xUqFDvcwxu5hpNNO4E,12663 -idna/idnadata.py,sha256=dqRwytzkjIHMBa2R1lYvHDwACenZPt8eGVu1Y8UBE-E,78320 -idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 -idna/package_data.py,sha256=Tkt0KnIeyIlnHddOaz9WSkkislNgokJAuE-p5GorMqo,21 -idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -idna/uts46data.py,sha256=1KuksWqLuccPXm2uyRVkhfiFLNIhM_H2m4azCcnOqEU,206503 diff --git a/.flatpak-builder/cache/objects/6d/6e62a5173f08ee93fad499121f48dca11b6a1da8ef41d7df267bf163795a64.dirtree b/.flatpak-builder/cache/objects/6d/6e62a5173f08ee93fad499121f48dca11b6a1da8ef41d7df267bf163795a64.dirtree deleted file mode 100644 index b25744d6d7959a2a0c3978cc2385e982be78454f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmV;d08{^8UukY>bYEXCaCra`xUY%hA=8UyU)m&PzwcOd1vqx_zeJn#ND8=C>2_@l zUteuuX>MO%E^v7Os?}i%_+GSll}M$p6GUZFwBt_8AfAakL+Kv&ID~lY7X%me8Fe)wgcsb a$L{X7b^4?d)$DWjDTwO}Y*dIW3{G6Z!%;o} diff --git a/.flatpak-builder/cache/objects/6d/c7f17d21ba3e43ebfdc308a5f6538e8ba889efb8ccba4f0a8acdacb698f836.file b/.flatpak-builder/cache/objects/6d/c7f17d21ba3e43ebfdc308a5f6538e8ba889efb8ccba4f0a8acdacb698f836.file deleted file mode 100644 index c2fa11378f9aff6be23dd4907435a62226745605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26029 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 diff --git a/.flatpak-builder/cache/objects/6e/340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d.dirtree b/.flatpak-builder/cache/objects/6e/340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d.dirtree deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.flatpak-builder/cache/objects/6f/b7320828e1ec041e21779506ba9395ee7cb3c71dea0d5642416d47839b36f6.file b/.flatpak-builder/cache/objects/6f/b7320828e1ec041e21779506ba9395ee7cb3c71dea0d5642416d47839b36f6.file deleted file mode 100644 index 1cd5c4a..0000000 --- a/.flatpak-builder/cache/objects/6f/b7320828e1ec041e21779506ba9395ee7cb3c71dea0d5642416d47839b36f6.file +++ /dev/null @@ -1,66 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PCD file handling -# -# History: -# 96-05-10 fl Created -# 96-05-27 fl Added draft mode (128x192, 256x384) -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile - -## -# Image plugin for PhotoCD images. This plugin only reads the 768x512 -# image from the file; higher resolutions are encoded in a proprietary -# encoding. - - -class PcdImageFile(ImageFile.ImageFile): - format = "PCD" - format_description = "Kodak PhotoCD" - - def _open(self) -> None: - # rough - assert self.fp is not None - - self.fp.seek(2048) - s = self.fp.read(2048) - - if s[:4] != b"PCD_": - msg = "not a PCD file" - raise SyntaxError(msg) - - orientation = s[1538] & 3 - self.tile_post_rotate = None - if orientation == 1: - self.tile_post_rotate = 90 - elif orientation == 3: - self.tile_post_rotate = -90 - - self._mode = "RGB" - self._size = 768, 512 # FIXME: not correct for rotated images! - self.tile = [("pcd", (0, 0) + self.size, 96 * 2048, None)] - - def load_end(self) -> None: - if self.tile_post_rotate: - # Handle rotated PCDs - assert self.im is not None - - self.im = self.im.rotate(self.tile_post_rotate) - self._size = self.im.size - - -# -# registry - -Image.register_open(PcdImageFile.format, PcdImageFile) - -Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/.flatpak-builder/cache/objects/6f/e118d85bb06f97f94dd5ee783b43d38260d94d8ffacb6f72686eaaf2ec98db.dirtree b/.flatpak-builder/cache/objects/6f/e118d85bb06f97f94dd5ee783b43d38260d94d8ffacb6f72686eaaf2ec98db.dirtree deleted file mode 100644 index 7dcd8a03985f1a99cdc9b2c5a94be6e74fda808c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmV-70m%MIPE%AtOiV>m0Bm&C?T93vyl?TQQy7v3@ioMy$OBqR?vu`l!@5X+!3s=C zLq$$gMF34j4ckg4$<`H7& z`0NJsY4CmuS4c%gOaL+54jNg>EG*@2%_0tug_W=}r}_0It%%JwQ6ogk2rve8Z*X61 zWp-t3E_8Tw07O^UIvL^28uMkq=djwu$1EZ=1O63zFM?KvqaQC bool: - """Return True for CPython 3.8.9+, 3.9.3+ or 3.10+ and PyPy 7.3.8+ where - setting SSLContext.hostname_checks_common_name to False works. - - Outside of CPython and PyPy we don't know which implementations work - or not so we conservatively use our hostname matching as we know that works - on all implementations. - - https://github.com/urllib3/urllib3/issues/2192#issuecomment-821832963 - https://foss.heptapod.net/pypy/pypy/-/issues/3539 - """ - if implementation_name == "pypy": - # https://foss.heptapod.net/pypy/pypy/-/issues/3129 - return pypy_version_info >= (7, 3, 8) # type: ignore[operator] - elif implementation_name == "cpython": - major_minor = version_info[:2] - micro = version_info[2] - return ( - (major_minor == (3, 8) and micro >= 9) - or (major_minor == (3, 9) and micro >= 3) - or major_minor >= (3, 10) - ) - else: # Defensive: - return False - - -def _is_has_never_check_common_name_reliable( - openssl_version: str, - openssl_version_number: int, - implementation_name: str, - version_info: _TYPE_VERSION_INFO, - pypy_version_info: _TYPE_VERSION_INFO | None, -) -> bool: - # As of May 2023, all released versions of LibreSSL fail to reject certificates with - # only common names, see https://github.com/urllib3/urllib3/pull/3024 - is_openssl = openssl_version.startswith("OpenSSL ") - # Before fixing OpenSSL issue #14579, the SSL_new() API was not copying hostflags - # like X509_CHECK_FLAG_NEVER_CHECK_SUBJECT, which tripped up CPython. - # https://github.com/openssl/openssl/issues/14579 - # This was released in OpenSSL 1.1.1l+ (>=0x101010cf) - is_openssl_issue_14579_fixed = openssl_version_number >= 0x101010CF - - return is_openssl and ( - is_openssl_issue_14579_fixed - or _is_bpo_43522_fixed(implementation_name, version_info, pypy_version_info) - ) - - -if typing.TYPE_CHECKING: - from ssl import VerifyMode - from typing import Literal, TypedDict - - from .ssltransport import SSLTransport as SSLTransportType - - class _TYPE_PEER_CERT_RET_DICT(TypedDict, total=False): - subjectAltName: tuple[tuple[str, str], ...] - subject: tuple[tuple[tuple[str, str], ...], ...] - serialNumber: str - - -# Mapping from 'ssl.PROTOCOL_TLSX' to 'TLSVersion.X' -_SSL_VERSION_TO_TLS_VERSION: dict[int, int] = {} - -try: # Do we have ssl at all? - import ssl - from ssl import ( # type: ignore[assignment] - CERT_REQUIRED, - HAS_NEVER_CHECK_COMMON_NAME, - OP_NO_COMPRESSION, - OP_NO_TICKET, - OPENSSL_VERSION, - OPENSSL_VERSION_NUMBER, - PROTOCOL_TLS, - PROTOCOL_TLS_CLIENT, - OP_NO_SSLv2, - OP_NO_SSLv3, - SSLContext, - TLSVersion, - ) - - PROTOCOL_SSLv23 = PROTOCOL_TLS - - # Setting SSLContext.hostname_checks_common_name = False didn't work before CPython - # 3.8.9, 3.9.3, and 3.10 (but OK on PyPy) or OpenSSL 1.1.1l+ - if HAS_NEVER_CHECK_COMMON_NAME and not _is_has_never_check_common_name_reliable( - OPENSSL_VERSION, - OPENSSL_VERSION_NUMBER, - sys.implementation.name, - sys.version_info, - sys.pypy_version_info if sys.implementation.name == "pypy" else None, # type: ignore[attr-defined] - ): - HAS_NEVER_CHECK_COMMON_NAME = False - - # Need to be careful here in case old TLS versions get - # removed in future 'ssl' module implementations. - for attr in ("TLSv1", "TLSv1_1", "TLSv1_2"): - try: - _SSL_VERSION_TO_TLS_VERSION[getattr(ssl, f"PROTOCOL_{attr}")] = getattr( - TLSVersion, attr - ) - except AttributeError: # Defensive: - continue - - from .ssltransport import SSLTransport # type: ignore[assignment] -except ImportError: - OP_NO_COMPRESSION = 0x20000 # type: ignore[assignment] - OP_NO_TICKET = 0x4000 # type: ignore[assignment] - OP_NO_SSLv2 = 0x1000000 # type: ignore[assignment] - OP_NO_SSLv3 = 0x2000000 # type: ignore[assignment] - PROTOCOL_SSLv23 = PROTOCOL_TLS = 2 # type: ignore[assignment] - PROTOCOL_TLS_CLIENT = 16 # type: ignore[assignment] - - -_TYPE_PEER_CERT_RET = typing.Union["_TYPE_PEER_CERT_RET_DICT", bytes, None] - - -def assert_fingerprint(cert: bytes | None, fingerprint: str) -> None: - """ - Checks if given fingerprint matches the supplied certificate. - - :param cert: - Certificate as bytes object. - :param fingerprint: - Fingerprint as string of hexdigits, can be interspersed by colons. - """ - - if cert is None: - raise SSLError("No certificate for the peer.") - - fingerprint = fingerprint.replace(":", "").lower() - digest_length = len(fingerprint) - hashfunc = HASHFUNC_MAP.get(digest_length) - if not hashfunc: - raise SSLError(f"Fingerprint of invalid length: {fingerprint}") - - # We need encode() here for py32; works on py2 and p33. - fingerprint_bytes = unhexlify(fingerprint.encode()) - - cert_digest = hashfunc(cert).digest() - - if not hmac.compare_digest(cert_digest, fingerprint_bytes): - raise SSLError( - f'Fingerprints did not match. Expected "{fingerprint}", got "{cert_digest.hex()}"' - ) - - -def resolve_cert_reqs(candidate: None | int | str) -> VerifyMode: - """ - Resolves the argument to a numeric constant, which can be passed to - the wrap_socket function/method from the ssl module. - Defaults to :data:`ssl.CERT_REQUIRED`. - If given a string it is assumed to be the name of the constant in the - :mod:`ssl` module or its abbreviation. - (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. - If it's neither `None` nor a string we assume it is already the numeric - constant which can directly be passed to wrap_socket. - """ - if candidate is None: - return CERT_REQUIRED - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, "CERT_" + candidate) - return res # type: ignore[no-any-return] - - return candidate # type: ignore[return-value] - - -def resolve_ssl_version(candidate: None | int | str) -> int: - """ - like resolve_cert_reqs - """ - if candidate is None: - return PROTOCOL_TLS - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, "PROTOCOL_" + candidate) - return typing.cast(int, res) - - return candidate - - -def create_urllib3_context( - ssl_version: int | None = None, - cert_reqs: int | None = None, - options: int | None = None, - ciphers: str | None = None, - ssl_minimum_version: int | None = None, - ssl_maximum_version: int | None = None, -) -> ssl.SSLContext: - """Creates and configures an :class:`ssl.SSLContext` instance for use with urllib3. - - :param ssl_version: - The desired protocol version to use. This will default to - PROTOCOL_SSLv23 which will negotiate the highest protocol that both - the server and your installation of OpenSSL support. - - This parameter is deprecated instead use 'ssl_minimum_version'. - :param ssl_minimum_version: - The minimum version of TLS to be used. Use the 'ssl.TLSVersion' enum for specifying the value. - :param ssl_maximum_version: - The maximum version of TLS to be used. Use the 'ssl.TLSVersion' enum for specifying the value. - Not recommended to set to anything other than 'ssl.TLSVersion.MAXIMUM_SUPPORTED' which is the - default value. - :param cert_reqs: - Whether to require the certificate verification. This defaults to - ``ssl.CERT_REQUIRED``. - :param options: - Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, - ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``, and ``ssl.OP_NO_TICKET``. - :param ciphers: - Which cipher suites to allow the server to select. Defaults to either system configured - ciphers if OpenSSL 1.1.1+, otherwise uses a secure default set of ciphers. - :returns: - Constructed SSLContext object with specified options - :rtype: SSLContext - """ - if SSLContext is None: - raise TypeError("Can't create an SSLContext object without an ssl module") - - # This means 'ssl_version' was specified as an exact value. - if ssl_version not in (None, PROTOCOL_TLS, PROTOCOL_TLS_CLIENT): - # Disallow setting 'ssl_version' and 'ssl_minimum|maximum_version' - # to avoid conflicts. - if ssl_minimum_version is not None or ssl_maximum_version is not None: - raise ValueError( - "Can't specify both 'ssl_version' and either " - "'ssl_minimum_version' or 'ssl_maximum_version'" - ) - - # 'ssl_version' is deprecated and will be removed in the future. - else: - # Use 'ssl_minimum_version' and 'ssl_maximum_version' instead. - ssl_minimum_version = _SSL_VERSION_TO_TLS_VERSION.get( - ssl_version, TLSVersion.MINIMUM_SUPPORTED - ) - ssl_maximum_version = _SSL_VERSION_TO_TLS_VERSION.get( - ssl_version, TLSVersion.MAXIMUM_SUPPORTED - ) - - # This warning message is pushing users to use 'ssl_minimum_version' - # instead of both min/max. Best practice is to only set the minimum version and - # keep the maximum version to be it's default value: 'TLSVersion.MAXIMUM_SUPPORTED' - warnings.warn( - "'ssl_version' option is deprecated and will be " - "removed in urllib3 v2.1.0. Instead use 'ssl_minimum_version'", - category=DeprecationWarning, - stacklevel=2, - ) - - # PROTOCOL_TLS is deprecated in Python 3.10 so we always use PROTOCOL_TLS_CLIENT - context = SSLContext(PROTOCOL_TLS_CLIENT) - - if ssl_minimum_version is not None: - context.minimum_version = ssl_minimum_version - else: # Python <3.10 defaults to 'MINIMUM_SUPPORTED' so explicitly set TLSv1.2 here - context.minimum_version = TLSVersion.TLSv1_2 - - if ssl_maximum_version is not None: - context.maximum_version = ssl_maximum_version - - # Unless we're given ciphers defer to either system ciphers in - # the case of OpenSSL 1.1.1+ or use our own secure default ciphers. - if ciphers: - context.set_ciphers(ciphers) - - # Setting the default here, as we may have no ssl module on import - cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs - - if options is None: - options = 0 - # SSLv2 is easily broken and is considered harmful and dangerous - options |= OP_NO_SSLv2 - # SSLv3 has several problems and is now dangerous - options |= OP_NO_SSLv3 - # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ - # (issue #309) - options |= OP_NO_COMPRESSION - # TLSv1.2 only. Unless set explicitly, do not request tickets. - # This may save some bandwidth on wire, and although the ticket is encrypted, - # there is a risk associated with it being on wire, - # if the server is not rotating its ticketing keys properly. - options |= OP_NO_TICKET - - context.options |= options - - # Enable post-handshake authentication for TLS 1.3, see GH #1634. PHA is - # necessary for conditional client cert authentication with TLS 1.3. - # The attribute is None for OpenSSL <= 1.1.0 or does not exist when using - # an SSLContext created by pyOpenSSL. - if getattr(context, "post_handshake_auth", None) is not None: - context.post_handshake_auth = True - - # The order of the below lines setting verify_mode and check_hostname - # matter due to safe-guards SSLContext has to prevent an SSLContext with - # check_hostname=True, verify_mode=NONE/OPTIONAL. - # We always set 'check_hostname=False' for pyOpenSSL so we rely on our own - # 'ssl.match_hostname()' implementation. - if cert_reqs == ssl.CERT_REQUIRED and not IS_PYOPENSSL: - context.verify_mode = cert_reqs - context.check_hostname = True - else: - context.check_hostname = False - context.verify_mode = cert_reqs - - try: - context.hostname_checks_common_name = False - except AttributeError: # Defensive: for CPython < 3.8.9 and 3.9.3; for PyPy < 7.3.8 - pass - - # Enable logging of TLS session keys via defacto standard environment variable - # 'SSLKEYLOGFILE', if the feature is available (Python 3.8+). Skip empty values. - if hasattr(context, "keylog_filename"): - sslkeylogfile = os.environ.get("SSLKEYLOGFILE") - if sslkeylogfile: - context.keylog_filename = sslkeylogfile - - return context - - -@typing.overload -def ssl_wrap_socket( - sock: socket.socket, - keyfile: str | None = ..., - certfile: str | None = ..., - cert_reqs: int | None = ..., - ca_certs: str | None = ..., - server_hostname: str | None = ..., - ssl_version: int | None = ..., - ciphers: str | None = ..., - ssl_context: ssl.SSLContext | None = ..., - ca_cert_dir: str | None = ..., - key_password: str | None = ..., - ca_cert_data: None | str | bytes = ..., - tls_in_tls: Literal[False] = ..., -) -> ssl.SSLSocket: - ... - - -@typing.overload -def ssl_wrap_socket( - sock: socket.socket, - keyfile: str | None = ..., - certfile: str | None = ..., - cert_reqs: int | None = ..., - ca_certs: str | None = ..., - server_hostname: str | None = ..., - ssl_version: int | None = ..., - ciphers: str | None = ..., - ssl_context: ssl.SSLContext | None = ..., - ca_cert_dir: str | None = ..., - key_password: str | None = ..., - ca_cert_data: None | str | bytes = ..., - tls_in_tls: bool = ..., -) -> ssl.SSLSocket | SSLTransportType: - ... - - -def ssl_wrap_socket( - sock: socket.socket, - keyfile: str | None = None, - certfile: str | None = None, - cert_reqs: int | None = None, - ca_certs: str | None = None, - server_hostname: str | None = None, - ssl_version: int | None = None, - ciphers: str | None = None, - ssl_context: ssl.SSLContext | None = None, - ca_cert_dir: str | None = None, - key_password: str | None = None, - ca_cert_data: None | str | bytes = None, - tls_in_tls: bool = False, -) -> ssl.SSLSocket | SSLTransportType: - """ - All arguments except for server_hostname, ssl_context, tls_in_tls, ca_cert_data and - ca_cert_dir have the same meaning as they do when using - :func:`ssl.create_default_context`, :meth:`ssl.SSLContext.load_cert_chain`, - :meth:`ssl.SSLContext.set_ciphers` and :meth:`ssl.SSLContext.wrap_socket`. - - :param server_hostname: - When SNI is supported, the expected hostname of the certificate - :param ssl_context: - A pre-made :class:`SSLContext` object. If none is provided, one will - be created using :func:`create_urllib3_context`. - :param ciphers: - A string of ciphers we wish the client to support. - :param ca_cert_dir: - A directory containing CA certificates in multiple separate files, as - supported by OpenSSL's -CApath flag or the capath argument to - SSLContext.load_verify_locations(). - :param key_password: - Optional password if the keyfile is encrypted. - :param ca_cert_data: - Optional string containing CA certificates in PEM format suitable for - passing as the cadata parameter to SSLContext.load_verify_locations() - :param tls_in_tls: - Use SSLTransport to wrap the existing socket. - """ - context = ssl_context - if context is None: - # Note: This branch of code and all the variables in it are only used in tests. - # We should consider deprecating and removing this code. - context = create_urllib3_context(ssl_version, cert_reqs, ciphers=ciphers) - - if ca_certs or ca_cert_dir or ca_cert_data: - try: - context.load_verify_locations(ca_certs, ca_cert_dir, ca_cert_data) - except OSError as e: - raise SSLError(e) from e - - elif ssl_context is None and hasattr(context, "load_default_certs"): - # try to load OS default certs; works well on Windows. - context.load_default_certs() - - # Attempt to detect if we get the goofy behavior of the - # keyfile being encrypted and OpenSSL asking for the - # passphrase via the terminal and instead error out. - if keyfile and key_password is None and _is_key_file_encrypted(keyfile): - raise SSLError("Client private key is encrypted, password is required") - - if certfile: - if key_password is None: - context.load_cert_chain(certfile, keyfile) - else: - context.load_cert_chain(certfile, keyfile, key_password) - - try: - context.set_alpn_protocols(ALPN_PROTOCOLS) - except NotImplementedError: # Defensive: in CI, we always have set_alpn_protocols - pass - - ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname) - return ssl_sock - - -def is_ipaddress(hostname: str | bytes) -> bool: - """Detects whether the hostname given is an IPv4 or IPv6 address. - Also detects IPv6 addresses with Zone IDs. - - :param str hostname: Hostname to examine. - :return: True if the hostname is an IP address, False otherwise. - """ - if isinstance(hostname, bytes): - # IDN A-label bytes are ASCII compatible. - hostname = hostname.decode("ascii") - return bool(_IPV4_RE.match(hostname) or _BRACELESS_IPV6_ADDRZ_RE.match(hostname)) - - -def _is_key_file_encrypted(key_file: str) -> bool: - """Detects if a key file is encrypted or not.""" - with open(key_file) as f: - for line in f: - # Look for Proc-Type: 4,ENCRYPTED - if "ENCRYPTED" in line: - return True - - return False - - -def _ssl_wrap_socket_impl( - sock: socket.socket, - ssl_context: ssl.SSLContext, - tls_in_tls: bool, - server_hostname: str | None = None, -) -> ssl.SSLSocket | SSLTransportType: - if tls_in_tls: - if not SSLTransport: - # Import error, ssl is not available. - raise ProxySchemeUnsupported( - "TLS in TLS requires support for the 'ssl' module" - ) - - SSLTransport._validate_ssl_context_for_tls_in_tls(ssl_context) - return SSLTransport(sock, ssl_context, server_hostname) - - return ssl_context.wrap_socket(sock, server_hostname=server_hostname) diff --git a/.flatpak-builder/cache/objects/70/4e8a34f24e7d5ba5c6ef92dab373e1dbb9767d7b10f9d2396a5e2c1765970f.file b/.flatpak-builder/cache/objects/70/4e8a34f24e7d5ba5c6ef92dab373e1dbb9767d7b10f9d2396a5e2c1765970f.file deleted file mode 100644 index 74be280268a08602f1134126f7fd2a02b07d7f3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3686 zcmb6bU2hx5aqoklq9~GYNiE!;vT89k9YLm zQ8E>(5eyfg4FOew0A_(cI6&&U@JrBt(6_u4AW=OK2N)1gq=4QSI0XVf)ScZUDao!| z^mLjV&g{(W&dkotAN%`*5<=*2f8A)j{P5_>zXRTTJT4|Ye*nlsL{J71frz?L6f>g0 za7mYnaz+MRCLY~W^k%$8U&dGTXZ)Pz)dR&~rjO%3z(bjSj{Eg+aUe4wAQ7bz3EV>@ zsCsXDyOtlrmY%Y0@h1}@2go3a-t%OlBsPx{L&{wNp*fCbpMUE}GL7%fcYegs583EL){2VcKxn zQt^srFX72jWinqja+5c%%v?^+6qSOSG)t;+I&mWj)=kWQV1+9zfUKsgqg)!SydsKI&>8ij?wXK;3)(o(&kYtdZZ$+VoW)!+de196Jr|_k@t3ORG;F)d7IAB_bRq(T~X|%98Zc4 z5Z$lvd<2k(NJSX|(o`fuMj~QHCQ`;j{KR`t&UlFrQYYZ_?eV^Hiscc@9=*9~m zU12Zf(O${kIwCv<`qLh7O|Uz4i7lzV!X@IeK%+!j6K!U@^HjzCI_?TYuA;2m zJdYu*o_10Tp;x%x{oK3=ntD5`3dDD)s}`+ERf&qkV+h2*Cfofz2JD*zs`4rj_G?@7 zR6Qhki!Y?Xst5ejI|u2z0CYRLtL0{(i<8iRwLA0M+cTRmG+a<|y68iO`7w&yA*OBL8CYci|Ry<|=r z2hG+=@YOon9yqYE(ij+V-|bLjBmJAp4=&dSo1x=dq2o2-%f4{!_Wko4=j+ECeeb~A zijCDSK8qcz=bEvRt=LE-G_pN3T$49~&xVHU(R%8)*FU-b2kBAj(d|zIp9LC23C7zV zif`WjWT6&pojB7tI#Ey6Q=dm0{zL!tqS(;p&+0t-k2y#RnH^ z7h0#2wW*DnO`{n)_2t2nTL<51g<_kjO{H=8Of!DwiPDUZeSV^GKHZ#1e{rHY@slqK z&53J`__eLU55AJb;o#Q@0PG;t4xwng6^Yjee}AYM8EHkLjlomR$f+knGm?0cZbr_v zB1hT*Pk*>A`G%NCpay@>!B=P&(q;g@Gy)*ubNtz?p%m3@)(K`=Qb5fFJe1AeE-QM6 zDylIb30fL(eHz6FT&BLM5YzqaV{_}hqq zFbc=kFSQPhH{^I*#-3msy#ctonOaAn^ay-k9Nym{aTU+ZeYnUP<}V$Yr?>>2oF6#X zD{CMKcgQWzbwHpz3q-iZ$1W(LB9zcx(S<_$S_usxo38~?c&ccBiJeC$k!y<*H`lX#8?RMA-rRiP!% z7;d*;R;dM%9>rRow^GK&3N4h`Y{k{E9l&^1&|si~Wi~FBEk2Eo(2!N(_Q(*Y&E>JW!XwA*@N;QdRTx0IqoLSZhpH^YSWwp%}qUXWctNums5!=-2Tb(($ zGik9&1h%#7tl5O@1V2#pvdWFPsd^lAP(Of#%#(|LpAk+2a0Jz25oO2Yx$VfT9MN}y zwgCTD4!}BU4$;?4%a8{f4uQ=!+-pn zXMOQD5oCUi5Q)L54-C5GE1dwmaHF)8_0Fi;>@yo z4uG~K2ts=#D9CNZKpY7t8)#(jyN!k#``>N!ZsW~w3!P}}fBzE&tn7Q+-ZKJ}p4Y)< YVk>s)E5`VGm-`DLCP3u=8{lXEH||iu!2kdN diff --git a/.flatpak-builder/cache/objects/70/a31f060ae5fed0dce9955ae6b06945574f54f15d7edd035341bf74111098d4.file b/.flatpak-builder/cache/objects/70/a31f060ae5fed0dce9955ae6b06945574f54f15d7edd035341bf74111098d4.file deleted file mode 100644 index 53756d6..0000000 --- a/.flatpak-builder/cache/objects/70/a31f060ae5fed0dce9955ae6b06945574f54f15d7edd035341bf74111098d4.file +++ /dev/null @@ -1,33 +0,0 @@ -../../../bin/normalizer,sha256=unpCJD6MBQJnz6Uobf3sjOVPf04rNhnSPf9dF071Q-Y,232 -charset_normalizer-3.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -charset_normalizer-3.3.2.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070 -charset_normalizer-3.3.2.dist-info/METADATA,sha256=cfLhl5A6SI-F0oclm8w8ux9wshL1nipdeCdVnYb4AaA,33550 -charset_normalizer-3.3.2.dist-info/RECORD,, -charset_normalizer-3.3.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92 -charset_normalizer-3.3.2.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 -charset_normalizer-3.3.2.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 -charset_normalizer/__init__.py,sha256=UzI3xC8PhmcLRMzSgPb6minTmRq0kWznnCBJ8ZCc2XI,1577 -charset_normalizer/__main__.py,sha256=JxY8bleaENOFlLRb9HfoeZCzAMnn2A1oGR5Xm2eyqg0,73 -charset_normalizer/__pycache__/__init__.cpython-311.pyc,, -charset_normalizer/__pycache__/__main__.cpython-311.pyc,, -charset_normalizer/__pycache__/api.cpython-311.pyc,, -charset_normalizer/__pycache__/cd.cpython-311.pyc,, -charset_normalizer/__pycache__/constant.cpython-311.pyc,, -charset_normalizer/__pycache__/legacy.cpython-311.pyc,, -charset_normalizer/__pycache__/md.cpython-311.pyc,, -charset_normalizer/__pycache__/models.cpython-311.pyc,, -charset_normalizer/__pycache__/utils.cpython-311.pyc,, -charset_normalizer/__pycache__/version.cpython-311.pyc,, -charset_normalizer/api.py,sha256=WOlWjy6wT8SeMYFpaGbXZFN1TMXa-s8vZYfkL4G29iQ,21097 -charset_normalizer/cd.py,sha256=xwZliZcTQFA3jU0c00PRiu9MNxXTFxQkFLWmMW24ZzI,12560 -charset_normalizer/cli/__init__.py,sha256=D5ERp8P62llm2FuoMzydZ7d9rs8cvvLXqE-1_6oViPc,100 -charset_normalizer/cli/__main__.py,sha256=2F-xURZJzo063Ye-2RLJ2wcmURpbKeAzKwpiws65dAs,9744 -charset_normalizer/cli/__pycache__/__init__.cpython-311.pyc,, -charset_normalizer/cli/__pycache__/__main__.cpython-311.pyc,, -charset_normalizer/constant.py,sha256=p0IsOVcEbPWYPOdWhnhRbjK1YVBy6fs05C5vKC-zoxU,40481 -charset_normalizer/legacy.py,sha256=T-QuVMsMeDiQEk8WSszMrzVJg_14AMeSkmHdRYhdl1k,2071 -charset_normalizer/md.py,sha256=NkSuVLK13_a8c7BxZ4cGIQ5vOtGIWOdh22WZEvjp-7U,19624 -charset_normalizer/models.py,sha256=I5i0s4aKCCgLPY2tUY3pwkgFA-BUbbNxQ7hVkVTt62s,11624 -charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -charset_normalizer/utils.py,sha256=teiosMqzKjXyAHXnGdjSBOgnBZwx-SkBbCLrx0UXy8M,11894 -charset_normalizer/version.py,sha256=iHKUfHD3kDRSyrh_BN2ojh43TA5-UZQjvbVIEFfpHDs,79 diff --git a/.flatpak-builder/cache/objects/72/831851ce1521179f49e32247a229aecb37de00579714894dfa8e57cd316805.file b/.flatpak-builder/cache/objects/72/831851ce1521179f49e32247a229aecb37de00579714894dfa8e57cd316805.file deleted file mode 100644 index 89fad70..0000000 --- a/.flatpak-builder/cache/objects/72/831851ce1521179f49e32247a229aecb37de00579714894dfa8e57cd316805.file +++ /dev/null @@ -1,553 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TIFF tags -# -# This module provides clear-text names for various well-known -# TIFF tags. the TIFF codec works just fine without it. -# -# Copyright (c) Secret Labs AB 1999. -# -# See the README file for information on usage and redistribution. -# - -## -# This module provides constants and clear-text names for various -# well-known TIFF tags. -## -from __future__ import annotations - -from typing import NamedTuple - - -class _TagInfo(NamedTuple): - value: int | None - name: str - type: int | None - length: int | None - enum: dict[str, int] - - -class TagInfo(_TagInfo): - __slots__: list[str] = [] - - def __new__(cls, value=None, name="unknown", type=None, length=None, enum=None): - return super().__new__(cls, value, name, type, length, enum or {}) - - def cvt_enum(self, value): - # Using get will call hash(value), which can be expensive - # for some types (e.g. Fraction). Since self.enum is rarely - # used, it's usually better to test it first. - return self.enum.get(value, value) if self.enum else value - - -def lookup(tag, group=None): - """ - :param tag: Integer tag number - :param group: Which :py:data:`~PIL.TiffTags.TAGS_V2_GROUPS` to look in - - .. versionadded:: 8.3.0 - - :returns: Taginfo namedtuple, From the ``TAGS_V2`` info if possible, - otherwise just populating the value and name from ``TAGS``. - If the tag is not recognized, "unknown" is returned for the name - - """ - - if group is not None: - info = TAGS_V2_GROUPS[group].get(tag) if group in TAGS_V2_GROUPS else None - else: - info = TAGS_V2.get(tag) - return info or TagInfo(tag, TAGS.get(tag, "unknown")) - - -## -# Map tag numbers to tag info. -# -# id: (Name, Type, Length[, enum_values]) -# -# The length here differs from the length in the tiff spec. For -# numbers, the tiff spec is for the number of fields returned. We -# agree here. For string-like types, the tiff spec uses the length of -# field in bytes. In Pillow, we are using the number of expected -# fields, in general 1 for string-like types. - - -BYTE = 1 -ASCII = 2 -SHORT = 3 -LONG = 4 -RATIONAL = 5 -SIGNED_BYTE = 6 -UNDEFINED = 7 -SIGNED_SHORT = 8 -SIGNED_LONG = 9 -SIGNED_RATIONAL = 10 -FLOAT = 11 -DOUBLE = 12 -IFD = 13 -LONG8 = 16 - -TAGS_V2 = { - 254: ("NewSubfileType", LONG, 1), - 255: ("SubfileType", SHORT, 1), - 256: ("ImageWidth", LONG, 1), - 257: ("ImageLength", LONG, 1), - 258: ("BitsPerSample", SHORT, 0), - 259: ( - "Compression", - SHORT, - 1, - { - "Uncompressed": 1, - "CCITT 1d": 2, - "Group 3 Fax": 3, - "Group 4 Fax": 4, - "LZW": 5, - "JPEG": 6, - "PackBits": 32773, - }, - ), - 262: ( - "PhotometricInterpretation", - SHORT, - 1, - { - "WhiteIsZero": 0, - "BlackIsZero": 1, - "RGB": 2, - "RGB Palette": 3, - "Transparency Mask": 4, - "CMYK": 5, - "YCbCr": 6, - "CieLAB": 8, - "CFA": 32803, # TIFF/EP, Adobe DNG - "LinearRaw": 32892, # Adobe DNG - }, - ), - 263: ("Threshholding", SHORT, 1), - 264: ("CellWidth", SHORT, 1), - 265: ("CellLength", SHORT, 1), - 266: ("FillOrder", SHORT, 1), - 269: ("DocumentName", ASCII, 1), - 270: ("ImageDescription", ASCII, 1), - 271: ("Make", ASCII, 1), - 272: ("Model", ASCII, 1), - 273: ("StripOffsets", LONG, 0), - 274: ("Orientation", SHORT, 1), - 277: ("SamplesPerPixel", SHORT, 1), - 278: ("RowsPerStrip", LONG, 1), - 279: ("StripByteCounts", LONG, 0), - 280: ("MinSampleValue", SHORT, 0), - 281: ("MaxSampleValue", SHORT, 0), - 282: ("XResolution", RATIONAL, 1), - 283: ("YResolution", RATIONAL, 1), - 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), - 285: ("PageName", ASCII, 1), - 286: ("XPosition", RATIONAL, 1), - 287: ("YPosition", RATIONAL, 1), - 288: ("FreeOffsets", LONG, 1), - 289: ("FreeByteCounts", LONG, 1), - 290: ("GrayResponseUnit", SHORT, 1), - 291: ("GrayResponseCurve", SHORT, 0), - 292: ("T4Options", LONG, 1), - 293: ("T6Options", LONG, 1), - 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), - 297: ("PageNumber", SHORT, 2), - 301: ("TransferFunction", SHORT, 0), - 305: ("Software", ASCII, 1), - 306: ("DateTime", ASCII, 1), - 315: ("Artist", ASCII, 1), - 316: ("HostComputer", ASCII, 1), - 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), - 318: ("WhitePoint", RATIONAL, 2), - 319: ("PrimaryChromaticities", RATIONAL, 6), - 320: ("ColorMap", SHORT, 0), - 321: ("HalftoneHints", SHORT, 2), - 322: ("TileWidth", LONG, 1), - 323: ("TileLength", LONG, 1), - 324: ("TileOffsets", LONG, 0), - 325: ("TileByteCounts", LONG, 0), - 330: ("SubIFDs", LONG, 0), - 332: ("InkSet", SHORT, 1), - 333: ("InkNames", ASCII, 1), - 334: ("NumberOfInks", SHORT, 1), - 336: ("DotRange", SHORT, 0), - 337: ("TargetPrinter", ASCII, 1), - 338: ("ExtraSamples", SHORT, 0), - 339: ("SampleFormat", SHORT, 0), - 340: ("SMinSampleValue", DOUBLE, 0), - 341: ("SMaxSampleValue", DOUBLE, 0), - 342: ("TransferRange", SHORT, 6), - 347: ("JPEGTables", UNDEFINED, 1), - # obsolete JPEG tags - 512: ("JPEGProc", SHORT, 1), - 513: ("JPEGInterchangeFormat", LONG, 1), - 514: ("JPEGInterchangeFormatLength", LONG, 1), - 515: ("JPEGRestartInterval", SHORT, 1), - 517: ("JPEGLosslessPredictors", SHORT, 0), - 518: ("JPEGPointTransforms", SHORT, 0), - 519: ("JPEGQTables", LONG, 0), - 520: ("JPEGDCTables", LONG, 0), - 521: ("JPEGACTables", LONG, 0), - 529: ("YCbCrCoefficients", RATIONAL, 3), - 530: ("YCbCrSubSampling", SHORT, 2), - 531: ("YCbCrPositioning", SHORT, 1), - 532: ("ReferenceBlackWhite", RATIONAL, 6), - 700: ("XMP", BYTE, 0), - 33432: ("Copyright", ASCII, 1), - 33723: ("IptcNaaInfo", UNDEFINED, 1), - 34377: ("PhotoshopInfo", BYTE, 0), - # FIXME add more tags here - 34665: ("ExifIFD", LONG, 1), - 34675: ("ICCProfile", UNDEFINED, 1), - 34853: ("GPSInfoIFD", LONG, 1), - 36864: ("ExifVersion", UNDEFINED, 1), - 37724: ("ImageSourceData", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - # MPInfo - 45056: ("MPFVersion", UNDEFINED, 1), - 45057: ("NumberOfImages", LONG, 1), - 45058: ("MPEntry", UNDEFINED, 1), - 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check - 45060: ("TotalFrames", LONG, 1), - 45313: ("MPIndividualNum", LONG, 1), - 45569: ("PanOrientation", LONG, 1), - 45570: ("PanOverlap_H", RATIONAL, 1), - 45571: ("PanOverlap_V", RATIONAL, 1), - 45572: ("BaseViewpointNum", LONG, 1), - 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), - 45574: ("BaselineLength", RATIONAL, 1), - 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), - 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), - 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), - 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), - 45579: ("YawAngle", SIGNED_RATIONAL, 1), - 45580: ("PitchAngle", SIGNED_RATIONAL, 1), - 45581: ("RollAngle", SIGNED_RATIONAL, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), - 50780: ("BestQualityScale", RATIONAL, 1), - 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one - 50839: ("ImageJMetaData", UNDEFINED, 1), # see Issue #2006 -} -TAGS_V2_GROUPS = { - # ExifIFD - 34665: { - 36864: ("ExifVersion", UNDEFINED, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - }, - # GPSInfoIFD - 34853: { - 0: ("GPSVersionID", BYTE, 4), - 1: ("GPSLatitudeRef", ASCII, 2), - 2: ("GPSLatitude", RATIONAL, 3), - 3: ("GPSLongitudeRef", ASCII, 2), - 4: ("GPSLongitude", RATIONAL, 3), - 5: ("GPSAltitudeRef", BYTE, 1), - 6: ("GPSAltitude", RATIONAL, 1), - 7: ("GPSTimeStamp", RATIONAL, 3), - 8: ("GPSSatellites", ASCII, 0), - 9: ("GPSStatus", ASCII, 2), - 10: ("GPSMeasureMode", ASCII, 2), - 11: ("GPSDOP", RATIONAL, 1), - 12: ("GPSSpeedRef", ASCII, 2), - 13: ("GPSSpeed", RATIONAL, 1), - 14: ("GPSTrackRef", ASCII, 2), - 15: ("GPSTrack", RATIONAL, 1), - 16: ("GPSImgDirectionRef", ASCII, 2), - 17: ("GPSImgDirection", RATIONAL, 1), - 18: ("GPSMapDatum", ASCII, 0), - 19: ("GPSDestLatitudeRef", ASCII, 2), - 20: ("GPSDestLatitude", RATIONAL, 3), - 21: ("GPSDestLongitudeRef", ASCII, 2), - 22: ("GPSDestLongitude", RATIONAL, 3), - 23: ("GPSDestBearingRef", ASCII, 2), - 24: ("GPSDestBearing", RATIONAL, 1), - 25: ("GPSDestDistanceRef", ASCII, 2), - 26: ("GPSDestDistance", RATIONAL, 1), - 27: ("GPSProcessingMethod", UNDEFINED, 0), - 28: ("GPSAreaInformation", UNDEFINED, 0), - 29: ("GPSDateStamp", ASCII, 11), - 30: ("GPSDifferential", SHORT, 1), - }, - # InteroperabilityIFD - 40965: {1: ("InteropIndex", ASCII, 1), 2: ("InteropVersion", UNDEFINED, 1)}, -} - -# Legacy Tags structure -# these tags aren't included above, but were in the previous versions -TAGS = { - 347: "JPEGTables", - 700: "XMP", - # Additional Exif Info - 32932: "Wang Annotation", - 33434: "ExposureTime", - 33437: "FNumber", - 33445: "MD FileTag", - 33446: "MD ScalePixel", - 33447: "MD ColorTable", - 33448: "MD LabName", - 33449: "MD SampleInfo", - 33450: "MD PrepDate", - 33451: "MD PrepTime", - 33452: "MD FileUnits", - 33550: "ModelPixelScaleTag", - 33723: "IptcNaaInfo", - 33918: "INGR Packet Data Tag", - 33919: "INGR Flag Registers", - 33920: "IrasB Transformation Matrix", - 33922: "ModelTiepointTag", - 34264: "ModelTransformationTag", - 34377: "PhotoshopInfo", - 34735: "GeoKeyDirectoryTag", - 34736: "GeoDoubleParamsTag", - 34737: "GeoAsciiParamsTag", - 34850: "ExposureProgram", - 34852: "SpectralSensitivity", - 34855: "ISOSpeedRatings", - 34856: "OECF", - 34864: "SensitivityType", - 34865: "StandardOutputSensitivity", - 34866: "RecommendedExposureIndex", - 34867: "ISOSpeed", - 34868: "ISOSpeedLatitudeyyy", - 34869: "ISOSpeedLatitudezzz", - 34908: "HylaFAX FaxRecvParams", - 34909: "HylaFAX FaxSubAddress", - 34910: "HylaFAX FaxRecvTime", - 36864: "ExifVersion", - 36867: "DateTimeOriginal", - 36868: "DateTimeDigitized", - 37121: "ComponentsConfiguration", - 37122: "CompressedBitsPerPixel", - 37724: "ImageSourceData", - 37377: "ShutterSpeedValue", - 37378: "ApertureValue", - 37379: "BrightnessValue", - 37380: "ExposureBiasValue", - 37381: "MaxApertureValue", - 37382: "SubjectDistance", - 37383: "MeteringMode", - 37384: "LightSource", - 37385: "Flash", - 37386: "FocalLength", - 37396: "SubjectArea", - 37500: "MakerNote", - 37510: "UserComment", - 37520: "SubSec", - 37521: "SubSecTimeOriginal", - 37522: "SubsecTimeDigitized", - 40960: "FlashPixVersion", - 40961: "ColorSpace", - 40962: "PixelXDimension", - 40963: "PixelYDimension", - 40964: "RelatedSoundFile", - 40965: "InteroperabilityIFD", - 41483: "FlashEnergy", - 41484: "SpatialFrequencyResponse", - 41486: "FocalPlaneXResolution", - 41487: "FocalPlaneYResolution", - 41488: "FocalPlaneResolutionUnit", - 41492: "SubjectLocation", - 41493: "ExposureIndex", - 41495: "SensingMethod", - 41728: "FileSource", - 41729: "SceneType", - 41730: "CFAPattern", - 41985: "CustomRendered", - 41986: "ExposureMode", - 41987: "WhiteBalance", - 41988: "DigitalZoomRatio", - 41989: "FocalLengthIn35mmFilm", - 41990: "SceneCaptureType", - 41991: "GainControl", - 41992: "Contrast", - 41993: "Saturation", - 41994: "Sharpness", - 41995: "DeviceSettingDescription", - 41996: "SubjectDistanceRange", - 42016: "ImageUniqueID", - 42032: "CameraOwnerName", - 42033: "BodySerialNumber", - 42034: "LensSpecification", - 42035: "LensMake", - 42036: "LensModel", - 42037: "LensSerialNumber", - 42112: "GDAL_METADATA", - 42113: "GDAL_NODATA", - 42240: "Gamma", - 50215: "Oce Scanjob Description", - 50216: "Oce Application Selector", - 50217: "Oce Identification Number", - 50218: "Oce ImageLogic Characteristics", - # Adobe DNG - 50706: "DNGVersion", - 50707: "DNGBackwardVersion", - 50708: "UniqueCameraModel", - 50709: "LocalizedCameraModel", - 50710: "CFAPlaneColor", - 50711: "CFALayout", - 50712: "LinearizationTable", - 50713: "BlackLevelRepeatDim", - 50714: "BlackLevel", - 50715: "BlackLevelDeltaH", - 50716: "BlackLevelDeltaV", - 50717: "WhiteLevel", - 50718: "DefaultScale", - 50719: "DefaultCropOrigin", - 50720: "DefaultCropSize", - 50721: "ColorMatrix1", - 50722: "ColorMatrix2", - 50723: "CameraCalibration1", - 50724: "CameraCalibration2", - 50725: "ReductionMatrix1", - 50726: "ReductionMatrix2", - 50727: "AnalogBalance", - 50728: "AsShotNeutral", - 50729: "AsShotWhiteXY", - 50730: "BaselineExposure", - 50731: "BaselineNoise", - 50732: "BaselineSharpness", - 50733: "BayerGreenSplit", - 50734: "LinearResponseLimit", - 50735: "CameraSerialNumber", - 50736: "LensInfo", - 50737: "ChromaBlurRadius", - 50738: "AntiAliasStrength", - 50740: "DNGPrivateData", - 50778: "CalibrationIlluminant1", - 50779: "CalibrationIlluminant2", - 50784: "Alias Layer Metadata", -} - - -def _populate(): - for k, v in TAGS_V2.items(): - # Populate legacy structure. - TAGS[k] = v[0] - if len(v) == 4: - for sk, sv in v[3].items(): - TAGS[(k, sv)] = sk - - TAGS_V2[k] = TagInfo(k, *v) - - for tags in TAGS_V2_GROUPS.values(): - for k, v in tags.items(): - tags[k] = TagInfo(k, *v) - - -_populate() -## -# Map type numbers to type names -- defined in ImageFileDirectory. - -TYPES: dict[int, str] = {} - -# -# These tags are handled by default in libtiff, without -# adding to the custom dictionary. From tif_dir.c, searching for -# case TIFFTAG in the _TIFFVSetField function: -# Line: item. -# 148: case TIFFTAG_SUBFILETYPE: -# 151: case TIFFTAG_IMAGEWIDTH: -# 154: case TIFFTAG_IMAGELENGTH: -# 157: case TIFFTAG_BITSPERSAMPLE: -# 181: case TIFFTAG_COMPRESSION: -# 202: case TIFFTAG_PHOTOMETRIC: -# 205: case TIFFTAG_THRESHHOLDING: -# 208: case TIFFTAG_FILLORDER: -# 214: case TIFFTAG_ORIENTATION: -# 221: case TIFFTAG_SAMPLESPERPIXEL: -# 228: case TIFFTAG_ROWSPERSTRIP: -# 238: case TIFFTAG_MINSAMPLEVALUE: -# 241: case TIFFTAG_MAXSAMPLEVALUE: -# 244: case TIFFTAG_SMINSAMPLEVALUE: -# 247: case TIFFTAG_SMAXSAMPLEVALUE: -# 250: case TIFFTAG_XRESOLUTION: -# 256: case TIFFTAG_YRESOLUTION: -# 262: case TIFFTAG_PLANARCONFIG: -# 268: case TIFFTAG_XPOSITION: -# 271: case TIFFTAG_YPOSITION: -# 274: case TIFFTAG_RESOLUTIONUNIT: -# 280: case TIFFTAG_PAGENUMBER: -# 284: case TIFFTAG_HALFTONEHINTS: -# 288: case TIFFTAG_COLORMAP: -# 294: case TIFFTAG_EXTRASAMPLES: -# 298: case TIFFTAG_MATTEING: -# 305: case TIFFTAG_TILEWIDTH: -# 316: case TIFFTAG_TILELENGTH: -# 327: case TIFFTAG_TILEDEPTH: -# 333: case TIFFTAG_DATATYPE: -# 344: case TIFFTAG_SAMPLEFORMAT: -# 361: case TIFFTAG_IMAGEDEPTH: -# 364: case TIFFTAG_SUBIFD: -# 376: case TIFFTAG_YCBCRPOSITIONING: -# 379: case TIFFTAG_YCBCRSUBSAMPLING: -# 383: case TIFFTAG_TRANSFERFUNCTION: -# 389: case TIFFTAG_REFERENCEBLACKWHITE: -# 393: case TIFFTAG_INKNAMES: - -# Following pseudo-tags are also handled by default in libtiff: -# TIFFTAG_JPEGQUALITY 65537 - -# some of these are not in our TAGS_V2 dict and were included from tiff.h - -# This list also exists in encode.c -LIBTIFF_CORE = { - 255, - 256, - 257, - 258, - 259, - 262, - 263, - 266, - 274, - 277, - 278, - 280, - 281, - 340, - 341, - 282, - 283, - 284, - 286, - 287, - 296, - 297, - 321, - 320, - 338, - 32995, - 322, - 323, - 32998, - 32996, - 339, - 32997, - 330, - 531, - 530, - 301, - 532, - 333, - # as above - 269, # this has been in our tests forever, and works - 65537, -} - -LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes -LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff -LIBTIFF_CORE.remove(323) # Tiled images -LIBTIFF_CORE.remove(333) # Ink Names either - -# Note to advanced users: There may be combinations of these -# parameters and values that when added properly, will work and -# produce valid tiff images that may work in your application. -# It is safe to add and remove tags from this set from Pillow's point -# of view so long as you test against libtiff. diff --git a/.flatpak-builder/cache/objects/73/48bfd1847f6c09d53173c3d79ee8767a30cc9116194663618fec5fb2ce046d.dirtree b/.flatpak-builder/cache/objects/73/48bfd1847f6c09d53173c3d79ee8767a30cc9116194663618fec5fb2ce046d.dirtree deleted file mode 100644 index 78bdf7b251ed60065a77ceaa4850de64599b6064..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcma!#&&U0G~oK7ytkO diff --git a/.flatpak-builder/cache/objects/73/ffd986ed061cc3184918b600f7ddb286cae69fd6f49531a97258870ae71b3b.dirtree b/.flatpak-builder/cache/objects/73/ffd986ed061cc3184918b600f7ddb286cae69fd6f49531a97258870ae71b3b.dirtree deleted file mode 100644 index c41ca1709ae17ed87da09ce522f680700fa389af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcma!#&&>2|$r#&!9;ZBx4wKkcexp0;N8 z69eO4UqYuzOp{E`Pf1P2(00H!^lyi=k4V(k#GI-K@2!gW5@MUP%#t=;dH*zlRozi6 zIX|}`u>?b3*z{s;zsV6QvqfAlrq3xa$Z9u!F+E7T@>j}fj~2F@7sQkEi&8Ok`N)+A zEw;M&-p%M!`licipYN3P-4&hW$&+W4V`ip&Zl-8vN?u}0Vo4%~&N+s)IS<3{UVpmm z^!@%*x4%nXl1bimZ|ecpmELyx{?<8?nRz8eiFxU%#TZ(TXR)`q=#}M`Hzex|r8?b} zZ5LU&yZyqom_MI5kIZ@hMXDe%IXf{uH6E+Qhm`lbXvdmf&YM|oyCUNbFJJsumf9li zfW0wwjjIcMTVzX1icQS0YJDvneQX+!c$RZ}%k_em$Tb@jg10qHc3-PwWx%<5J^x23 XD~3Xbl??Y8BpE{(Co!I7yvqmx`DMhK diff --git a/.flatpak-builder/cache/objects/75/5b14b3ae8b26775c284d76db6988b9fe1132fc8123d85d58e9221754a63ad1.file b/.flatpak-builder/cache/objects/75/5b14b3ae8b26775c284d76db6988b9fe1132fc8123d85d58e9221754a63ad1.file deleted file mode 100644 index e27843e..0000000 --- a/.flatpak-builder/cache/objects/75/5b14b3ae8b26775c284d76db6988b9fe1132fc8123d85d58e9221754a63ad1.file +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/.flatpak-builder/cache/objects/76/948e327fcd5e9886898084db020eb5abc46eae7456a4a5de351564b7c6f2d1.file b/.flatpak-builder/cache/objects/76/948e327fcd5e9886898084db020eb5abc46eae7456a4a5de351564b7c6f2d1.file deleted file mode 100644 index 1e0d325eba384ffff7f3238f31329818047e0d1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 zcmY*V&ui0g6o23RXxen?7|zvWwtAVMO`xziSm>#oNGTtSXx70r*lIPQ(Lf6V#qzQbU_&pAoE%XJTf_ z7WZH|_wIrI!trgr7BoZ0W47K5?3TxL&+%QyKhonsuhu->(5o(fJLDF3Sfu{RM3zZX zw0u8^t=I|tXgA5z7;|FAllia{c4!@iDLY}cR%{)5YwR;uaJN_N z6)zCGz2ayzRBj?k%GW{;Zj`&*nWqXeqtPf;p)}XqJ1r09mik&{pj9SaM6=lTNBtT6 MP}U3L&pg5S7otPgg8%>k diff --git a/.flatpak-builder/cache/objects/76/ee0ffa98d96144451b8ed2645715b100554b51c282c2288930275aec9f998f.dirtree b/.flatpak-builder/cache/objects/76/ee0ffa98d96144451b8ed2645715b100554b51c282c2288930275aec9f998f.dirtree deleted file mode 100644 index 96180443b9d37cac478610bd593c5135c0d5c96a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmV-#0FeJ84b8B>OZ~&_(W@P4Z5Xw-iu!61!YM^iG zd)5!@qMHo$Gj@^!bEg|^X>Da`Zf0*TV_{=xWdOmm^XBvWJI3?p8r18xMQv0wCrlJ&dt;inW{F+3qVYqQEWVG@H3!o_ zZ)1Midi>qHZKc1K2wino{uF*4n}ZjD*wn?)UlgpAVU%uEJ3DO@t1x8$c#lk{iAS{b8b5BgV`2Xd&xmu>9rciVd}$IP zgVfn`Q%e#v^V0Ge9x`{Hh@7;l;?f$9sIb^THP@E7Ge*4mIiJR9`^xtfgiO-l@MM_5@R&iH Nv4n9yBPSCB0|2UJ0FVFx diff --git a/.flatpak-builder/cache/objects/77/8f497a42a359efd3aef8f528cdddd8a13fea2b471cc05efabeb2b9efe482e8.file b/.flatpak-builder/cache/objects/77/8f497a42a359efd3aef8f528cdddd8a13fea2b471cc05efabeb2b9efe482e8.file deleted file mode 100644 index 1c91f3e..0000000 --- a/.flatpak-builder/cache/objects/77/8f497a42a359efd3aef8f528cdddd8a13fea2b471cc05efabeb2b9efe482e8.file +++ /dev/null @@ -1,4 +0,0 @@ -from .core import contents, where - -__all__ = ["contents", "where"] -__version__ = "2024.02.02" diff --git a/.flatpak-builder/cache/objects/78/896fc999548d215e47e5a5af9cdd56df83db3bb9df9d9749e1efe8fc455822.dirtree b/.flatpak-builder/cache/objects/78/896fc999548d215e47e5a5af9cdd56df83db3bb9df9d9749e1efe8fc455822.dirtree deleted file mode 100644 index c82c3147b23bb9e067644443c9364bb85359b1cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71 zcmV-N0J#5hbpZdBJ>ZHS7R@~vl)w~`7LA>hJ<^k4b4J)H%MEWhrq4ub4)Gg&!DsWf d1LcLs?(VjA`lJ%o>~r=hi0cb%REQ%3MF7ZxB6 int: - v = unicodedata.combining(chr(cp)) - if v == 0: - if not unicodedata.name(chr(cp)): - raise ValueError('Unknown character in unicodedata') - return v - -def _is_script(cp: str, script: str) -> bool: - return intranges_contain(ord(cp), idnadata.scripts[script]) - -def _punycode(s: str) -> bytes: - return s.encode('punycode') - -def _unot(s: int) -> str: - return 'U+{:04X}'.format(s) - - -def valid_label_length(label: Union[bytes, str]) -> bool: - if len(label) > 63: - return False - return True - - -def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: - if len(label) > (254 if trailing_dot else 253): - return False - return True - - -def check_bidi(label: str, check_ltr: bool = False) -> bool: - # Bidi rules should only be applied if string contains RTL characters - bidi_label = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - if direction == '': - # String likely comes from a newer version of Unicode - raise IDNABidiError('Unknown directionality in label {} at position {}'.format(repr(label), idx)) - if direction in ['R', 'AL', 'AN']: - bidi_label = True - if not bidi_label and not check_ltr: - return True - - # Bidi rule 1 - direction = unicodedata.bidirectional(label[0]) - if direction in ['R', 'AL']: - rtl = True - elif direction == 'L': - rtl = False - else: - raise IDNABidiError('First codepoint in label {} must be directionality L, R or AL'.format(repr(label))) - - valid_ending = False - number_type = None # type: Optional[str] - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {} in a right-to-left label'.format(idx)) - # Bidi rule 3 - if direction in ['R', 'AL', 'EN', 'AN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - # Bidi rule 4 - if direction in ['AN', 'EN']: - if not number_type: - number_type = direction - else: - if number_type != direction: - raise IDNABidiError('Can not mix numeral types in a right-to-left label') - else: - # Bidi rule 5 - if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {} in a left-to-right label'.format(idx)) - # Bidi rule 6 - if direction in ['L', 'EN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - - if not valid_ending: - raise IDNABidiError('Label ends with illegal codepoint directionality') - - return True - - -def check_initial_combiner(label: str) -> bool: - if unicodedata.category(label[0])[0] == 'M': - raise IDNAError('Label begins with an illegal combining character') - return True - - -def check_hyphen_ok(label: str) -> bool: - if label[2:4] == '--': - raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') - if label[0] == '-' or label[-1] == '-': - raise IDNAError('Label must not start or end with a hyphen') - return True - - -def check_nfc(label: str) -> None: - if unicodedata.normalize('NFC', label) != label: - raise IDNAError('Label must be in Normalization Form C') - - -def valid_contextj(label: str, pos: int) -> bool: - cp_value = ord(label[pos]) - - if cp_value == 0x200c: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - - ok = False - for i in range(pos-1, -1, -1): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - elif joining_type in [ord('L'), ord('D')]: - ok = True - break - else: - break - - if not ok: - return False - - ok = False - for i in range(pos+1, len(label)): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - elif joining_type in [ord('R'), ord('D')]: - ok = True - break - else: - break - return ok - - if cp_value == 0x200d: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - return False - - else: - - return False - - -def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: - cp_value = ord(label[pos]) - - if cp_value == 0x00b7: - if 0 < pos < len(label)-1: - if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: - return True - return False - - elif cp_value == 0x0375: - if pos < len(label)-1 and len(label) > 1: - return _is_script(label[pos + 1], 'Greek') - return False - - elif cp_value == 0x05f3 or cp_value == 0x05f4: - if pos > 0: - return _is_script(label[pos - 1], 'Hebrew') - return False - - elif cp_value == 0x30fb: - for cp in label: - if cp == '\u30fb': - continue - if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): - return True - return False - - elif 0x660 <= cp_value <= 0x669: - for cp in label: - if 0x6f0 <= ord(cp) <= 0x06f9: - return False - return True - - elif 0x6f0 <= cp_value <= 0x6f9: - for cp in label: - if 0x660 <= ord(cp) <= 0x0669: - return False - return True - - return False - - -def check_label(label: Union[str, bytes, bytearray]) -> None: - if isinstance(label, (bytes, bytearray)): - label = label.decode('utf-8') - if len(label) == 0: - raise IDNAError('Empty Label') - - check_nfc(label) - check_hyphen_ok(label) - check_initial_combiner(label) - - for (pos, cp) in enumerate(label): - cp_value = ord(cp) - if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): - continue - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): - if not valid_contextj(label, pos): - raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( - _unot(cp_value), pos+1, repr(label))) - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): - if not valid_contexto(label, pos): - raise InvalidCodepointContext('Codepoint {} not allowed at position {} in {}'.format(_unot(cp_value), pos+1, repr(label))) - else: - raise InvalidCodepoint('Codepoint {} at position {} of {} not allowed'.format(_unot(cp_value), pos+1, repr(label))) - - check_bidi(label) - - -def alabel(label: str) -> bytes: - try: - label_bytes = label.encode('ascii') - ulabel(label_bytes) - if not valid_label_length(label_bytes): - raise IDNAError('Label too long') - return label_bytes - except UnicodeEncodeError: - pass - - check_label(label) - label_bytes = _alabel_prefix + _punycode(label) - - if not valid_label_length(label_bytes): - raise IDNAError('Label too long') - - return label_bytes - - -def ulabel(label: Union[str, bytes, bytearray]) -> str: - if not isinstance(label, (bytes, bytearray)): - try: - label_bytes = label.encode('ascii') - except UnicodeEncodeError: - check_label(label) - return label - else: - label_bytes = label - - label_bytes = label_bytes.lower() - if label_bytes.startswith(_alabel_prefix): - label_bytes = label_bytes[len(_alabel_prefix):] - if not label_bytes: - raise IDNAError('Malformed A-label, no Punycode eligible content found') - if label_bytes.decode('ascii')[-1] == '-': - raise IDNAError('A-label must not end with a hyphen') - else: - check_label(label_bytes) - return label_bytes.decode('ascii') - - try: - label = label_bytes.decode('punycode') - except UnicodeError: - raise IDNAError('Invalid A-label') - check_label(label) - return label - - -def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: - """Re-map the characters in the string according to UTS46 processing.""" - from .uts46data import uts46data - output = '' - - for pos, char in enumerate(domain): - code_point = ord(char) - try: - uts46row = uts46data[code_point if code_point < 256 else - bisect.bisect_left(uts46data, (code_point, 'Z')) - 1] - status = uts46row[1] - replacement = None # type: Optional[str] - if len(uts46row) == 3: - replacement = uts46row[2] - if (status == 'V' or - (status == 'D' and not transitional) or - (status == '3' and not std3_rules and replacement is None)): - output += char - elif replacement is not None and (status == 'M' or - (status == '3' and not std3_rules) or - (status == 'D' and transitional)): - output += replacement - elif status != 'I': - raise IndexError() - except IndexError: - raise InvalidCodepoint( - 'Codepoint {} not allowed at position {} in {}'.format( - _unot(code_point), pos + 1, repr(domain))) - - return unicodedata.normalize('NFC', output) - - -def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes: - if not isinstance(s, str): - try: - s = str(s, 'ascii') - except UnicodeDecodeError: - raise IDNAError('should pass a unicode string to the function rather than a byte string.') - if uts46: - s = uts46_remap(s, std3_rules, transitional) - trailing_dot = False - result = [] - if strict: - labels = s.split('.') - else: - labels = _unicode_dots_re.split(s) - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if labels[-1] == '': - del labels[-1] - trailing_dot = True - for label in labels: - s = alabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append(b'') - s = b'.'.join(result) - if not valid_string_length(s, trailing_dot): - raise IDNAError('Domain too long') - return s - - -def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False) -> str: - try: - if not isinstance(s, str): - s = str(s, 'ascii') - except UnicodeDecodeError: - raise IDNAError('Invalid ASCII in A-label') - if uts46: - s = uts46_remap(s, std3_rules, False) - trailing_dot = False - result = [] - if not strict: - labels = _unicode_dots_re.split(s) - else: - labels = s.split('.') - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if not labels[-1]: - del labels[-1] - trailing_dot = True - for label in labels: - s = ulabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append('') - return '.'.join(result) diff --git a/.flatpak-builder/cache/objects/79/eba164cd220493808e762e17b39f2b98bb7bceb5befe8a0d9a0d1e0cb34c2b.file b/.flatpak-builder/cache/objects/79/eba164cd220493808e762e17b39f2b98bb7bceb5befe8a0d9a0d1e0cb34c2b.file deleted file mode 100644 index 77e8a60..0000000 --- a/.flatpak-builder/cache/objects/79/eba164cd220493808e762e17b39f2b98bb7bceb5befe8a0d9a0d1e0cb34c2b.file +++ /dev/null @@ -1,20 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# path interface -# -# History: -# 1996-11-04 fl Created -# 2002-04-14 fl Added documentation stub class -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image - -Path = Image.core.path diff --git a/.flatpak-builder/cache/objects/7a/7d6b87a85359529da5b620ce75edd4e9d73655fe5e49ada73e16a1555c64f9.file b/.flatpak-builder/cache/objects/7a/7d6b87a85359529da5b620ce75edd4e9d73655fe5e49ada73e16a1555c64f9.file deleted file mode 100755 index ce7bf0fc4ef7bef0dd257cd40983caa5ee0382aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23512 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%0DW-MDK1T{E}ue|P4u z_kVBZx^?pOh3tRdi|@Po{4E#nUq0VGI9-yIWBBxmkLq~d#SHPmRlVm10H%xC z;?#oLo|_1t&~Us(`=*7p_G{sGnwTeqq3~(c9SiWA#S%Ing<$bzP|#0N^V1jDe^T%{ zENuT2DE0C`Mt*wlRhD~*FiQ9Y;T6JPA-s5>0v;j!b&%7IWye*pFo)-_?#BTZ-PVv zKQu3le>%W#6_GD7qGS``)8P~!5vj%306quiYhba$cTo3w!1)Z9Fk@R_A4Zh!0v`D& zES?DLVIAJ1I**XeA;9bTe~RoQE0y6e*$)yf=s=dQ5k549pHZ?utNHm3;Vny*16;4z zzDxMT5_NAWA>JVT#2pIA5Iz>*bQ2Qi$bNv<{}-t50^yOU0yzJ_0A8;S@00xrEzir0 zlb;dt|1ZMdp}5_IUnRVEl>)f_Gp4I~Z_&ne9pLryxt;7A*C;<-;1}B+Q`oN{`yy^2 z&@L$J)wsO@R-Sp8;+Cj4?1kJO+0fb{x3sr+#k*y9>xPavIK*T{ z#>!@8LL@6~R@#?crl0W5LYMDB&fvrJJja!`n>H||mW^;kS4=j;;a#hROmufb&Rl1R zhE?u1Qjl2Am+hkH?#v4F5zq>j16P@>$Tky3@1})g0$}?PxM1|dwNy^QRZ6H%dWTHs zcgU<^+0}Tfgpn$taoGl5778YyUCJwT+)6KeF(nxJ(8r!zc-fOV?big~8to6Vx%^)NUN z1qZkpY5>(Mr+qMO^>Q+4cqOyD3`;C1Ljp(L9*h_20%OPYfeUqlE*t`mDG`hp3}Czo z%oG+*p9vWT!%PGtR)fVXDWi?1k8`LdrtY+OrM#65iVoF)aC|Fey5GR{W!O-yYSnR; zu}bi}ESfQVLqt7S$x@}@8z~Vj`JR$_){3?tEtzQ`R2-vVf#SHn8O=H6XsT@4ndMeS zM9sW(#6dc&1%6{p$XPy)vMy%cyRVCag+4{s7ddz&!Me=q#h$Hx3c+@avW2dRPh3S7hakKU+ynUC*p z*m(Txj^!})h51YHMH3qH>1RtYtZ@FyN{D@+g!w%hzmWoSe0}^8aEjOla+sg16poMm z*pPoKd~`m(Hz9`g4O&DA=HI4nt5=?P1{Q1lNJRB8|12Alw*%F&+om=r{%=v)#ru*e0Gt~>q)ez z9_A+@zi`vzpMcIVpWm06&*z!44}JbNYy98RLSp`(s|!PUz*yn-MXDcd8`b|gn6KOO zJOvRT1V?9}IP`+x7sgV`zDBfwKR-w%~Q!pAlcLU;a+T-_8q1 z-Bx3Fw;x| z;%jlmKaCp{v_iPX8=K*n*eYRov=mPXZ|iU3;Y7X=dw|; QHSQJxXuiX3DWVrRIixWcr~m)} diff --git a/.flatpak-builder/cache/objects/7b/68547fe4a83a2a8ef41d7adace44c00e4e66bbc16021ad471805ee80bd0449.file b/.flatpak-builder/cache/objects/7b/68547fe4a83a2a8ef41d7adace44c00e4e66bbc16021ad471805ee80bd0449.file deleted file mode 100644 index 19b6b45..0000000 --- a/.flatpak-builder/cache/objects/7b/68547fe4a83a2a8ef41d7adace44c00e4e66bbc16021ad471805ee80bd0449.file +++ /dev/null @@ -1,31 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2013-2024, Kim Davies and contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.flatpak-builder/cache/objects/7b/e493abcb29b5b86d17e2975126af0d5bf71fcefb46ad53a3227e9d50fe7c73.dirtree b/.flatpak-builder/cache/objects/7b/e493abcb29b5b86d17e2975126af0d5bf71fcefb46ad53a3227e9d50fe7c73.dirtree deleted file mode 100644 index c30b087b5f0e4a0fb45c5322ed6263079c7fa839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 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.7.0 -Description-Content-Type: text/markdown -License-File: LICENSE -Provides-Extra: unicode_backport - -

Charset Detection, for Everyone 👋

- -

- The Real First Universal Charset Detector
-
- - - - Download Count Total - - - - -

-

- Featured Packages
- - Static Badge - - - Static Badge - -

-

- In other language (unofficial port - by the community)
- - Static Badge - -

- -> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`, -> I'm trying to resolve the issue by taking a new approach. -> All IANA character set names for which the Python core library provides codecs are supported. - -

- >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< -

- -This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. - -| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | -|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:| -| `Fast` | ❌ | ✅ | ✅ | -| `Universal**` | ❌ | ✅ | ❌ | -| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ | -| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | -| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ | -| `Native Python` | ✅ | ✅ | ❌ | -| `Detect spoken language` | ❌ | ✅ | N/A | -| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ | -| `Whl Size (min)` | 193.6 kB | 42 kB | ~200 kB | -| `Supported Encoding` | 33 | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 | - -

-Reading Normalized TextCat Reading Text -

- -*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
-Did you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html) - -## ⚡ Performance - -This package offer better performance than its counterpart Chardet. Here are some numbers. - -| Package | Accuracy | Mean per file (ms) | File per sec (est) | -|-----------------------------------------------|:--------:|:------------------:|:------------------:| -| [chardet](https://github.com/chardet/chardet) | 86 % | 200 ms | 5 file/sec | -| charset-normalizer | **98 %** | **10 ms** | 100 file/sec | - -| Package | 99th percentile | 95th percentile | 50th percentile | -|-----------------------------------------------|:---------------:|:---------------:|:---------------:| -| [chardet](https://github.com/chardet/chardet) | 1200 ms | 287 ms | 23 ms | -| charset-normalizer | 100 ms | 50 ms | 5 ms | - -Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. - -> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. -> And yes, these results might change at any time. The dataset can be updated to include more files. -> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. -> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability -> (eg. Supported Encoding) Challenge-them if you want. - -## ✨ Installation - -Using pip: - -```sh -pip install charset-normalizer -U -``` - -## 🚀 Basic Usage - -### CLI -This package comes with a CLI. - -``` -usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] - file [file ...] - -The Real First Universal Charset Detector. Discover originating encoding used -on text file. Normalize text to unicode. - -positional arguments: - files File(s) to be analysed - -optional arguments: - -h, --help show this help message and exit - -v, --verbose Display complementary information about file if any. - Stdout will contain logs about the detection process. - -a, --with-alternative - Output complementary possibilities if any. Top-level - JSON WILL be a list. - -n, --normalize Permit to normalize input file. If not set, program - does not write anything. - -m, --minimal Only output the charset detected to STDOUT. Disabling - JSON output. - -r, --replace Replace file when trying to normalize it instead of - creating a new one. - -f, --force Replace file without asking if you are sure, use this - flag with caution. - -t THRESHOLD, --threshold THRESHOLD - Define a custom maximum amount of chaos allowed in - decoded content. 0. <= chaos <= 1. - --version Show version information and exit. -``` - -```bash -normalizer ./data/sample.1.fr.srt -``` - -or - -```bash -python -m charset_normalizer ./data/sample.1.fr.srt -``` - -🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. - -```json -{ - "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", - "encoding": "cp1252", - "encoding_aliases": [ - "1252", - "windows_1252" - ], - "alternative_encodings": [ - "cp1254", - "cp1256", - "cp1258", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - "mbcs" - ], - "language": "French", - "alphabets": [ - "Basic Latin", - "Latin-1 Supplement" - ], - "has_sig_or_bom": false, - "chaos": 0.149, - "coherence": 97.152, - "unicode_path": null, - "is_preferred": true -} -``` - -### Python -*Just print out normalized text* -```python -from charset_normalizer import from_path - -results = from_path('./my_subtitle.srt') - -print(str(results.best())) -``` - -*Upgrade your code without effort* -```python -from charset_normalizer import detect -``` - -The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. - -See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) - -## 😇 Why - -When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a -reliable alternative using a completely different method. Also! I never back down on a good challenge! - -I **don't care** about the **originating charset** encoding, because **two different tables** can -produce **two identical rendered string.** -What I want is to get readable text, the best I can. - -In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 - -Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. - -## 🍰 How - - - Discard all charset encoding table that could not fit the binary content. - - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding. - - Extract matches with the lowest mess detected. - - Additionally, we measure coherence / probe for a language. - -**Wait a minute**, what is noise/mess and coherence according to **YOU ?** - -*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then -**I established** some ground rules about **what is obvious** when **it seems like** a mess. - I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to - improve or rewrite it. - -*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought -that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. - -## ⚡ Known limitations - - - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) - - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. - -## ⚠️ About Python EOLs - -**If you are running:** - -- Python >=2.7,<3.5: Unsupported -- Python 3.5: charset-normalizer < 2.1 -- Python 3.6: charset-normalizer < 3.1 -- Python 3.7: charset-normalizer < 4.0 - -Upgrade your Python interpreter as soon as possible. - -## 👤 Contributing - -Contributions, issues and feature requests are very much welcome.
-Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. - -## 📝 License - -Copyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
-This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. - -Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) - -## 💼 For Enterprise - -Professional support for charset-normalizer is available as part of the [Tidelift -Subscription][1]. Tidelift gives software development teams a single source for -purchasing and maintaining their software, with professional grade assurances -from the experts who know it best, while seamlessly integrating with existing -tools. - -[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme - -# Changelog -All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - -## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31) - -### Fixed -- Unintentional memory usage regression when using large payload that match several encoding (#376) -- Regression on some detection case showcased in the documentation (#371) - -### Added -- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife) - -## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22) - -### Changed -- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8 -- Improved the general detection reliability based on reports from the community - -## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30) - -### Added -- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer` -- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323) - -### Removed -- (internal) Redundant utils.is_ascii function and unused function is_private_use_only -- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant - -### Changed -- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection -- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8 - -### Fixed -- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \_\_lt\_\_ (#350) - -## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07) - -### Changed -- Typehint for function `from_path` no longer enforce `PathLike` as its first argument -- Minor improvement over the global detection reliability - -### Added -- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries -- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True) -- Explicit support for Python 3.12 - -### Fixed -- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289) - -## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06) - -### Added -- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262) - -### Removed -- Support for Python 3.6 (PR #260) - -### Changed -- Optional speedup provided by mypy/c 1.0.1 - -## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18) - -### Fixed -- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233) - -### Changed -- Speedup provided by mypy/c 0.990 on Python >= 3.7 - -## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20) - -### Added -- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results -- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES -- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio -- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) - -### Changed -- Build with static metadata using 'build' frontend -- Make the language detection stricter -- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 - -### Fixed -- CLI with opt --normalize fail when using full path for files -- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it -- Sphinx warnings when generating the documentation - -### Removed -- Coherence detector no longer return 'Simple English' instead return 'English' -- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' -- Breaking: Method `first()` and `best()` from CharsetMatch -- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) -- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches -- Breaking: Top-level function `normalize` -- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch -- Support for the backport `unicodedata2` - -## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18) - -### Added -- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results -- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES -- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio - -### Changed -- Build with static metadata using 'build' frontend -- Make the language detection stricter - -### Fixed -- CLI with opt --normalize fail when using full path for files -- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it - -### Removed -- Coherence detector no longer return 'Simple English' instead return 'English' -- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' - -## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21) - -### Added -- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) - -### Removed -- Breaking: Method `first()` and `best()` from CharsetMatch -- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) - -### Fixed -- Sphinx warnings when generating the documentation - -## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15) - -### Changed -- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 - -### Removed -- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches -- Breaking: Top-level function `normalize` -- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch -- Support for the backport `unicodedata2` - -## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19) - -### Deprecated -- Function `normalize` scheduled for removal in 3.0 - -### Changed -- Removed useless call to decode in fn is_unprintable (#206) - -### Fixed -- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204) - -## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19) - -### Added -- Output the Unicode table version when running the CLI with `--version` (PR #194) - -### Changed -- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175) -- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183) - -### Fixed -- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175) -- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181) - -### Removed -- Support for Python 3.5 (PR #192) - -### Deprecated -- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194) - -## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12) - -### Fixed -- ASCII miss-detection on rare cases (PR #170) - -## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30) - -### Added -- Explicit support for Python 3.11 (PR #164) - -### Changed -- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165) - -## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04) - -### Fixed -- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154) - -### Changed -- Skipping the language-detection (CD) on ASCII (PR #155) - -## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03) - -### Changed -- Moderating the logging impact (since 2.0.8) for specific environments (PR #147) - -### Fixed -- Wrong logging level applied when setting kwarg `explain` to True (PR #146) - -## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24) -### Changed -- Improvement over Vietnamese detection (PR #126) -- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124) -- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122) -- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129) -- Code style as refactored by Sourcery-AI (PR #131) -- Minor adjustment on the MD around european words (PR #133) -- Remove and replace SRTs from assets / tests (PR #139) -- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135) -- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135) - -### Fixed -- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137) -- Avoid using too insignificant chunk (PR #137) - -### Added -- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135) -- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141) - -## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11) -### Added -- Add support for Kazakh (Cyrillic) language detection (PR #109) - -### Changed -- Further, improve inferring the language from a given single-byte code page (PR #112) -- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116) -- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113) -- Various detection improvement (MD+CD) (PR #117) - -### Removed -- Remove redundant logging entry about detected language(s) (PR #115) - -### Fixed -- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102) - -## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18) -### Fixed -- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100) -- Fix CLI crash when using --minimal output in certain cases (PR #103) - -### Changed -- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101) - -## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14) -### Changed -- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81) -- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82) -- The Unicode detection is slightly improved (PR #93) -- Add syntax sugar \_\_bool\_\_ for results CharsetMatches list-container (PR #91) - -### Removed -- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92) - -### Fixed -- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95) -- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96) -- The MANIFEST.in was not exhaustive (PR #78) - -## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30) -### Fixed -- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70) -- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68) -- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72) -- Submatch factoring could be wrong in rare edge cases (PR #72) -- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72) -- Fix line endings from CRLF to LF for certain project files (PR #67) - -### Changed -- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76) -- Allow fallback on specified encoding if any (PR #71) - -## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16) -### Changed -- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63) -- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64) - -## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15) -### Fixed -- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) - -### Changed -- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57) - -## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13) -### Fixed -- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55) -- Using explain=False permanently disable the verbose output in the current runtime (PR #47) -- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47) -- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52) - -### Changed -- Public function normalize default args values were not aligned with from_bytes (PR #53) - -### Added -- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47) - -## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02) -### Changed -- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet. -- Accent has been made on UTF-8 detection, should perform rather instantaneous. -- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible. -- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time) -- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+ -- utf_7 detection has been reinstated. - -### Removed -- This package no longer require anything when used with Python 3.5 (Dropped cached_property) -- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian. -- The exception hook on UnicodeDecodeError has been removed. - -### Deprecated -- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0 - -### Fixed -- The CLI output used the relative path of the file(s). Should be absolute. - -## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28) -### Fixed -- Logger configuration/usage no longer conflict with others (PR #44) - -## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21) -### Removed -- Using standard logging instead of using the package loguru. -- Dropping nose test framework in favor of the maintained pytest. -- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text. -- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version. -- Stop support for UTF-7 that does not contain a SIG. -- Dropping PrettyTable, replaced with pure JSON output in CLI. - -### Fixed -- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process. -- Not searching properly for the BOM when trying utf32/16 parent codec. - -### Changed -- Improving the package final size by compressing frequencies.json. -- Huge improvement over the larges payload. - -### Added -- CLI now produces JSON consumable output. -- Return ASCII if given sequences fit. Given reasonable confidence. - -## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13) - -### Fixed -- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40) - -## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12) - -### Fixed -- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39) - -## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12) - -### Fixed -- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38) - -## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09) - -### Changed -- Amend the previous release to allow prettytable 2.0 (PR #35) - -## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08) - -### Fixed -- Fix error while using the package with a python pre-release interpreter (PR #33) - -### Changed -- Dependencies refactoring, constraints revised. - -### Added -- Add python 3.9 and 3.10 to the supported interpreters - -MIT License - -Copyright (c) 2019 TAHRI Ahmed R. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.flatpak-builder/cache/objects/7d/50fc9e692b7ff8185cceb29360dd6a739c8a6dee2b0fff239c14fc025a6f70.file b/.flatpak-builder/cache/objects/7d/50fc9e692b7ff8185cceb29360dd6a739c8a6dee2b0fff239c14fc025a6f70.file deleted file mode 100644 index 632042f..0000000 --- a/.flatpak-builder/cache/objects/7d/50fc9e692b7ff8185cceb29360dd6a739c8a6dee2b0fff239c14fc025a6f70.file +++ /dev/null @@ -1,279 +0,0 @@ -from __future__ import annotations - -import json as _json -import typing -from urllib.parse import urlencode - -from ._base_connection import _TYPE_BODY -from ._collections import HTTPHeaderDict -from .filepost import _TYPE_FIELDS, encode_multipart_formdata -from .response import BaseHTTPResponse - -__all__ = ["RequestMethods"] - -_TYPE_ENCODE_URL_FIELDS = typing.Union[ - typing.Sequence[typing.Tuple[str, typing.Union[str, bytes]]], - typing.Mapping[str, typing.Union[str, bytes]], -] - - -class RequestMethods: - """ - Convenience mixin for classes who implement a :meth:`urlopen` method, such - as :class:`urllib3.HTTPConnectionPool` and - :class:`urllib3.PoolManager`. - - Provides behavior for making common types of HTTP request methods and - decides which type of request field encoding to use. - - Specifically, - - :meth:`.request_encode_url` is for sending requests whose fields are - encoded in the URL (such as GET, HEAD, DELETE). - - :meth:`.request_encode_body` is for sending requests whose fields are - encoded in the *body* of the request using multipart or www-form-urlencoded - (such as for POST, PUT, PATCH). - - :meth:`.request` is for making any kind of request, it will look up the - appropriate encoding format and use one of the above two methods to make - the request. - - Initializer parameters: - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - _encode_url_methods = {"DELETE", "GET", "HEAD", "OPTIONS"} - - def __init__(self, headers: typing.Mapping[str, str] | None = None) -> None: - self.headers = headers or {} - - def urlopen( - self, - method: str, - url: str, - body: _TYPE_BODY | None = None, - headers: typing.Mapping[str, str] | None = None, - encode_multipart: bool = True, - multipart_boundary: str | None = None, - **kw: typing.Any, - ) -> BaseHTTPResponse: # Abstract - raise NotImplementedError( - "Classes extending RequestMethods must implement " - "their own ``urlopen`` method." - ) - - def request( - self, - method: str, - url: str, - body: _TYPE_BODY | None = None, - fields: _TYPE_FIELDS | None = None, - headers: typing.Mapping[str, str] | None = None, - json: typing.Any | None = None, - **urlopen_kw: typing.Any, - ) -> BaseHTTPResponse: - """ - Make a request using :meth:`urlopen` with the appropriate encoding of - ``fields`` based on the ``method`` used. - - This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the - option to drop down to more specific methods when necessary, such as - :meth:`request_encode_url`, :meth:`request_encode_body`, - or even the lowest level :meth:`urlopen`. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param url: - The URL to perform the request on. - - :param body: - Data to send in the request body, either :class:`str`, :class:`bytes`, - an iterable of :class:`str`/:class:`bytes`, or a file-like object. - - :param fields: - Data to encode and send in the request body. Values are processed - by :func:`urllib.parse.urlencode`. - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param json: - Data to encode and send as JSON with UTF-encoded in the request body. - The ``"Content-Type"`` header will be set to ``"application/json"`` - unless specified otherwise. - """ - method = method.upper() - - if json is not None and body is not None: - raise TypeError( - "request got values for both 'body' and 'json' parameters which are mutually exclusive" - ) - - if json is not None: - if headers is None: - headers = self.headers - - if not ("content-type" in map(str.lower, headers.keys())): - headers = HTTPHeaderDict(headers) - headers["Content-Type"] = "application/json" - - body = _json.dumps(json, separators=(",", ":"), ensure_ascii=False).encode( - "utf-8" - ) - - if body is not None: - urlopen_kw["body"] = body - - if method in self._encode_url_methods: - return self.request_encode_url( - method, - url, - fields=fields, # type: ignore[arg-type] - headers=headers, - **urlopen_kw, - ) - else: - return self.request_encode_body( - method, url, fields=fields, headers=headers, **urlopen_kw - ) - - def request_encode_url( - self, - method: str, - url: str, - fields: _TYPE_ENCODE_URL_FIELDS | None = None, - headers: typing.Mapping[str, str] | None = None, - **urlopen_kw: str, - ) -> BaseHTTPResponse: - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the url. This is useful for request methods like GET, HEAD, DELETE, etc. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param url: - The URL to perform the request on. - - :param fields: - Data to encode and send in the request body. - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - """ - if headers is None: - headers = self.headers - - extra_kw: dict[str, typing.Any] = {"headers": headers} - extra_kw.update(urlopen_kw) - - if fields: - url += "?" + urlencode(fields) - - return self.urlopen(method, url, **extra_kw) - - def request_encode_body( - self, - method: str, - url: str, - fields: _TYPE_FIELDS | None = None, - headers: typing.Mapping[str, str] | None = None, - encode_multipart: bool = True, - multipart_boundary: str | None = None, - **urlopen_kw: str, - ) -> BaseHTTPResponse: - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the body. This is useful for request methods like POST, PUT, PATCH, etc. - - When ``encode_multipart=True`` (default), then - :func:`urllib3.encode_multipart_formdata` is used to encode - the payload with the appropriate content type. Otherwise - :func:`urllib.parse.urlencode` is used with the - 'application/x-www-form-urlencoded' content type. - - Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request - signing, such as with OAuth. - - Supports an optional ``fields`` parameter of key/value strings AND - key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example:: - - fields = { - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), - 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - } - - When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimic behavior of browsers. - - Note that if ``headers`` are supplied, the 'Content-Type' header will - be overwritten because it depends on the dynamic random boundary string - which is used to compose the body of the request. The random boundary - string can be explicitly set with the ``multipart_boundary`` parameter. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param url: - The URL to perform the request on. - - :param fields: - Data to encode and send in the request body. - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param encode_multipart: - If True, encode the ``fields`` using the multipart/form-data MIME - format. - - :param multipart_boundary: - If not specified, then a random boundary will be generated using - :func:`urllib3.filepost.choose_boundary`. - """ - if headers is None: - headers = self.headers - - extra_kw: dict[str, typing.Any] = {"headers": HTTPHeaderDict(headers)} - body: bytes | str - - if fields: - if "body" in urlopen_kw: - raise TypeError( - "request got values for both 'fields' and 'body', can only specify one." - ) - - if encode_multipart: - body, content_type = encode_multipart_formdata( - fields, boundary=multipart_boundary - ) - else: - body, content_type = ( - urlencode(fields), # type: ignore[arg-type] - "application/x-www-form-urlencoded", - ) - - extra_kw["body"] = body - extra_kw["headers"].setdefault("Content-Type", content_type) - - extra_kw.update(urlopen_kw) - - return self.urlopen(method, url, **extra_kw) diff --git a/.flatpak-builder/cache/objects/7d/63bbb53fe29598183ed8b5f7012b76918b5b4a148c89da148ae9ff87129bc9.file b/.flatpak-builder/cache/objects/7d/63bbb53fe29598183ed8b5f7012b76918b5b4a148c89da148ae9ff87129bc9.file deleted file mode 100644 index 1ad13eebe1328739562306cf5fdeb1ad00250dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2683 zcmZt{Yi|=raQE)~c4Fc@oJ1xV2L!GlR!Y>;KwHrV5K#gm6>9yV*2Q-Y7tW9FT}p_I za1m8g6sZA4N~Ee%RJAFHFZ_i5gmdK&)=7~f^`(4sm44z=XV&(`ChXnL&d$uv?9OBN z*RC$VNC+94`Rt#`Pp{Sg0NiP=21fV(1Z15kM4>v#(G;ab5fo7ua$-u%Nht~DlI&7k z4@t_cxB+?ua)~IOheYwJ(!95&aSKd6M{~TTe2Ncb{Q^{6r&wreUU&#AVL z4;M9Eoz5Vq)ewiX(LFyP>!d_v@E7P5meT$hw5hyd%DNtti$z__aMh=cqMFgNS|)bs z#?%Kf4fV%v$$3Rr*_fZNnk>pp&b5e>vC9o^tS~#TX3Q}zGyRO(-gI*vY~IsE4ct=f z<@qF-OzPTfvUu0LRmh(i8y`;^nyH>H%9-0>(nwyP`XqUYX|prt!Yn`Db$ww@%a0ZB z+J~4rrx~WoS_T+~Ck)-dD3nRPn;eRiFXOid1k&LY3^sSlTY#WbFp0hqhER|j8w}>=}m2U1VxjTWlPbVIJ9@w4BMPMU(ZyEC$_( z11OVPpl3C{I=&iTncRr{9*9|iGn+S`UikU*7e{~k!jjG~JW&R^)0zRMd#GTYs3b)d zk`fe}5}`|q0150;M1XFdKrXwd!;hFIwuHOxa0^xzcgqbhfNq(0EN(VUIs}ev0etR| z?oqQ@n@H+djSfH16uJdkpF5g6XGV`A+!IXS{<4zLDe-`I*l4rew&oQZa3_c*l6JQw z6bWV+Io?WS)43H|G#p2E5OjXx;uGkV&WyKE6+|8Tv;>U~?m@OHqdfRrTa|K0(!O)g)&g?yQ%dlr}FszQ10ov0JRH(CpiE`PWkKD?2sgyYq4 z+zQ5byulUE_rXWO)teP>wCaso-e}!T28NcU6@RUt4?8{m>%&imA4k`s%WkNQI-$Oi zS}^?ml}A@Lq)PB`HF(%+{dEzTT%u7UPAb7>5$DN#2#|GR0&F#?UOLS%6bZ^kVQ8yT zb`<8Xbp^Wa9TdiNDU;&lKrdbbSSn)hItRFE1$DkYU0w_CQt*f_uu{LzXk_PHh$OWEo zK%BY;!7&FwLo@2jwAZ9l`5VCLbk^7XW}9TY8=-#TlH7mUc*TkxcYxSg3lC`f`pq`I zV7A#xq(q_8fw%uAH)<#$PD4)1U#Uw+_``%~>j{d%yBO0NZ<(qjB!;z#PmUp*CbK=) zW_a1KB#@yr1TDvgQNoM$hw)*@VS1o0&;*+R4m#fW2ml1$6S6#!AMgCK_+p@PmtM&6BEV;(!;B8BUFk`X{ z<^qF^VdxT@FpLMoONyU^zio}1pv!p+@eXff2ky`AavnsiWp=8QhUc)uj)=Nws(AzR zt~1+Sde1j<_dRwF6krJ%e*=IzqqIIi=%_{F?f(uLv0nG@1VUwR-R+@~I&nah(h11P z7Vr*GNYR5}!&e$N_PK9L^jMuZppVeLva3pZt-j;czEjrN`@cmhWU5N0EHYIi oy=}awYK2Tx$%I8FcE}(y2Cbntszc*1-mZ{yRdUX1{X8uH19I3$^#A|> diff --git a/.flatpak-builder/cache/objects/7f/ecc3ae858d1f86c06961af5a4bef36c600617bee1dff8e46876bb3ad2d9991.file b/.flatpak-builder/cache/objects/7f/ecc3ae858d1f86c06961af5a4bef36c600617bee1dff8e46876bb3ad2d9991.file deleted file mode 100644 index d29bcf9..0000000 --- a/.flatpak-builder/cache/objects/7f/ecc3ae858d1f86c06961af5a4bef36c600617bee1dff8e46876bb3ad2d9991.file +++ /dev/null @@ -1,307 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# Adobe PSD 2.5/3.0 file handling -# -# History: -# 1995-09-01 fl Created -# 1997-01-03 fl Read most PSD images -# 1997-01-18 fl Fixed P and CMYK support -# 2001-10-21 fl Added seek/tell support (for layers) -# -# Copyright (c) 1997-2001 by Secret Labs AB. -# Copyright (c) 1995-2001 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io - -from . import Image, ImageFile, ImagePalette -from ._binary import i8 -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import si16be as si16 -from ._binary import si32be as si32 - -MODES = { - # (photoshop mode, bits) -> (pil mode, required channels) - (0, 1): ("1", 1), - (0, 8): ("L", 1), - (1, 8): ("L", 1), - (2, 8): ("P", 1), - (3, 8): ("RGB", 3), - (4, 8): ("CMYK", 4), - (7, 8): ("L", 1), # FIXME: multilayer - (8, 8): ("L", 1), # duotone - (9, 8): ("LAB", 3), -} - - -# --------------------------------------------------------------------. -# read PSD images - - -def _accept(prefix): - return prefix[:4] == b"8BPS" - - -## -# Image plugin for Photoshop images. - - -class PsdImageFile(ImageFile.ImageFile): - format = "PSD" - format_description = "Adobe Photoshop" - _close_exclusive_fp_after_loading = False - - def _open(self): - read = self.fp.read - - # - # header - - s = read(26) - if not _accept(s) or i16(s, 4) != 1: - msg = "not a PSD file" - raise SyntaxError(msg) - - psd_bits = i16(s, 22) - psd_channels = i16(s, 12) - psd_mode = i16(s, 24) - - mode, channels = MODES[(psd_mode, psd_bits)] - - if channels > psd_channels: - msg = "not enough channels" - raise OSError(msg) - if mode == "RGB" and psd_channels == 4: - mode = "RGBA" - channels = 4 - - self._mode = mode - self._size = i32(s, 18), i32(s, 14) - - # - # color mode data - - size = i32(read(4)) - if size: - data = read(size) - if mode == "P" and size == 768: - self.palette = ImagePalette.raw("RGB;L", data) - - # - # image resources - - self.resources = [] - - size = i32(read(4)) - if size: - # load resources - end = self.fp.tell() + size - while self.fp.tell() < end: - read(4) # signature - id = i16(read(2)) - name = read(i8(read(1))) - if not (len(name) & 1): - read(1) # padding - data = read(i32(read(4))) - if len(data) & 1: - read(1) # padding - self.resources.append((id, name, data)) - if id == 1039: # ICC profile - self.info["icc_profile"] = data - - # - # layer and mask information - - self.layers = [] - - size = i32(read(4)) - if size: - end = self.fp.tell() + size - size = i32(read(4)) - if size: - _layer_data = io.BytesIO(ImageFile._safe_read(self.fp, size)) - self.layers = _layerinfo(_layer_data, size) - self.fp.seek(end) - self.n_frames = len(self.layers) - self.is_animated = self.n_frames > 1 - - # - # image descriptor - - self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) - - # keep the file open - self._fp = self.fp - self.frame = 1 - self._min_frame = 1 - - def seek(self, layer): - if not self._seek_check(layer): - return - - # seek to given layer (1..max) - try: - name, mode, bbox, tile = self.layers[layer - 1] - self._mode = mode - self.tile = tile - self.frame = layer - self.fp = self._fp - return name, bbox - except IndexError as e: - msg = "no such layer" - raise EOFError(msg) from e - - def tell(self): - # return layer number (0=image, 1..max=layers) - return self.frame - - -def _layerinfo(fp, ct_bytes): - # read layerinfo block - layers = [] - - def read(size): - return ImageFile._safe_read(fp, size) - - ct = si16(read(2)) - - # sanity check - if ct_bytes < (abs(ct) * 20): - msg = "Layer block too short for number of layers requested" - raise SyntaxError(msg) - - for _ in range(abs(ct)): - # bounding box - y0 = si32(read(4)) - x0 = si32(read(4)) - y1 = si32(read(4)) - x1 = si32(read(4)) - - # image info - mode = [] - ct_types = i16(read(2)) - if ct_types > 4: - fp.seek(ct_types * 6 + 12, io.SEEK_CUR) - size = i32(read(4)) - fp.seek(size, io.SEEK_CUR) - continue - - for _ in range(ct_types): - type = i16(read(2)) - - if type == 65535: - m = "A" - else: - m = "RGBA"[type] - - mode.append(m) - read(4) # size - - # figure out the image mode - mode.sort() - if mode == ["R"]: - mode = "L" - elif mode == ["B", "G", "R"]: - mode = "RGB" - elif mode == ["A", "B", "G", "R"]: - mode = "RGBA" - else: - mode = None # unknown - - # skip over blend flags and extra information - read(12) # filler - name = "" - size = i32(read(4)) # length of the extra data field - if size: - data_end = fp.tell() + size - - length = i32(read(4)) - if length: - fp.seek(length - 16, io.SEEK_CUR) - - length = i32(read(4)) - if length: - fp.seek(length, io.SEEK_CUR) - - length = i8(read(1)) - if length: - # Don't know the proper encoding, - # Latin-1 should be a good guess - name = read(length).decode("latin-1", "replace") - - fp.seek(data_end) - layers.append((name, mode, (x0, y0, x1, y1))) - - # get tiles - for i, (name, mode, bbox) in enumerate(layers): - tile = [] - for m in mode: - t = _maketile(fp, m, bbox, 1) - if t: - tile.extend(t) - layers[i] = name, mode, bbox, tile - - return layers - - -def _maketile(file, mode, bbox, channels): - tile = None - read = file.read - - compression = i16(read(2)) - - xsize = bbox[2] - bbox[0] - ysize = bbox[3] - bbox[1] - - offset = file.tell() - - if compression == 0: - # - # raw compression - tile = [] - for channel in range(channels): - layer = mode[channel] - if mode == "CMYK": - layer += ";I" - tile.append(("raw", bbox, offset, layer)) - offset = offset + xsize * ysize - - elif compression == 1: - # - # packbits compression - i = 0 - tile = [] - bytecount = read(channels * ysize * 2) - offset = file.tell() - for channel in range(channels): - layer = mode[channel] - if mode == "CMYK": - layer += ";I" - tile.append(("packbits", bbox, offset, layer)) - for y in range(ysize): - offset = offset + i16(bytecount, i) - i += 2 - - file.seek(offset) - - if offset & 1: - read(1) # padding - - return tile - - -# -------------------------------------------------------------------- -# registry - - -Image.register_open(PsdImageFile.format, PsdImageFile, _accept) - -Image.register_extension(PsdImageFile.format, ".psd") - -Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop") diff --git a/.flatpak-builder/cache/objects/80/6cd12ce643da178f30b68ae97b6bd8d4971051c20cde0cc70c54b77941d78d.file b/.flatpak-builder/cache/objects/80/6cd12ce643da178f30b68ae97b6bd8d4971051c20cde0cc70c54b77941d78d.file deleted file mode 100644 index 35b7f6a9de5694f5fb3c132fe11584e655d7f6f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8476 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 diff --git a/.flatpak-builder/cache/objects/81/403b7e3eba66ff7664b73a11c9746b535b8a437d1dbd7842a7df672c27e533.file b/.flatpak-builder/cache/objects/81/403b7e3eba66ff7664b73a11c9746b535b8a437d1dbd7842a7df672c27e533.file deleted file mode 100644 index be422c3..0000000 --- a/.flatpak-builder/cache/objects/81/403b7e3eba66ff7664b73a11c9746b535b8a437d1dbd7842a7df672c27e533.file +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python - -""" -requests.certs -~~~~~~~~~~~~~~ - -This module returns the preferred default CA certificate bundle. There is -only one — the one from the certifi package. - -If you are packaging Requests, e.g., for a Linux distribution or a managed -environment, you can change the definition of where() to return a separately -packaged CA bundle. -""" -from certifi import where - -if __name__ == "__main__": - print(where()) diff --git a/.flatpak-builder/cache/objects/81/8ad38c06da3963cb0035f858ea7408dddf513a0db4244cf3f22e1d787a0f9e.file b/.flatpak-builder/cache/objects/81/8ad38c06da3963cb0035f858ea7408dddf513a0db4244cf3f22e1d787a0f9e.file deleted file mode 100644 index faafb01700f676275b05419fdcef1b1193755212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmZ3^%ge>gz`&ri{19WxL9P3bfowQng0eoF0U6U7QW#Pga~N_NqZk<(Qkhbivcd92 zJWLF!jLU#3R>L(iGNdpEgRv&dOGcouCgUxxcSAUA-7^AdAY 1: - data.byteswap() # the values are always big-endian - self.quantization[v & 15] = [data[i] for i in zigzag_index] - s = s[qt_length:] - - -# -# JPEG marker table - -MARKER = { - 0xFFC0: ("SOF0", "Baseline DCT", SOF), - 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), - 0xFFC2: ("SOF2", "Progressive DCT", SOF), - 0xFFC3: ("SOF3", "Spatial lossless", SOF), - 0xFFC4: ("DHT", "Define Huffman table", Skip), - 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), - 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), - 0xFFC7: ("SOF7", "Differential spatial", SOF), - 0xFFC8: ("JPG", "Extension", None), - 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), - 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), - 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), - 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), - 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), - 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), - 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), - 0xFFD0: ("RST0", "Restart 0", None), - 0xFFD1: ("RST1", "Restart 1", None), - 0xFFD2: ("RST2", "Restart 2", None), - 0xFFD3: ("RST3", "Restart 3", None), - 0xFFD4: ("RST4", "Restart 4", None), - 0xFFD5: ("RST5", "Restart 5", None), - 0xFFD6: ("RST6", "Restart 6", None), - 0xFFD7: ("RST7", "Restart 7", None), - 0xFFD8: ("SOI", "Start of image", None), - 0xFFD9: ("EOI", "End of image", None), - 0xFFDA: ("SOS", "Start of scan", Skip), - 0xFFDB: ("DQT", "Define quantization table", DQT), - 0xFFDC: ("DNL", "Define number of lines", Skip), - 0xFFDD: ("DRI", "Define restart interval", Skip), - 0xFFDE: ("DHP", "Define hierarchical progression", SOF), - 0xFFDF: ("EXP", "Expand reference component", Skip), - 0xFFE0: ("APP0", "Application segment 0", APP), - 0xFFE1: ("APP1", "Application segment 1", APP), - 0xFFE2: ("APP2", "Application segment 2", APP), - 0xFFE3: ("APP3", "Application segment 3", APP), - 0xFFE4: ("APP4", "Application segment 4", APP), - 0xFFE5: ("APP5", "Application segment 5", APP), - 0xFFE6: ("APP6", "Application segment 6", APP), - 0xFFE7: ("APP7", "Application segment 7", APP), - 0xFFE8: ("APP8", "Application segment 8", APP), - 0xFFE9: ("APP9", "Application segment 9", APP), - 0xFFEA: ("APP10", "Application segment 10", APP), - 0xFFEB: ("APP11", "Application segment 11", APP), - 0xFFEC: ("APP12", "Application segment 12", APP), - 0xFFED: ("APP13", "Application segment 13", APP), - 0xFFEE: ("APP14", "Application segment 14", APP), - 0xFFEF: ("APP15", "Application segment 15", APP), - 0xFFF0: ("JPG0", "Extension 0", None), - 0xFFF1: ("JPG1", "Extension 1", None), - 0xFFF2: ("JPG2", "Extension 2", None), - 0xFFF3: ("JPG3", "Extension 3", None), - 0xFFF4: ("JPG4", "Extension 4", None), - 0xFFF5: ("JPG5", "Extension 5", None), - 0xFFF6: ("JPG6", "Extension 6", None), - 0xFFF7: ("JPG7", "Extension 7", None), - 0xFFF8: ("JPG8", "Extension 8", None), - 0xFFF9: ("JPG9", "Extension 9", None), - 0xFFFA: ("JPG10", "Extension 10", None), - 0xFFFB: ("JPG11", "Extension 11", None), - 0xFFFC: ("JPG12", "Extension 12", None), - 0xFFFD: ("JPG13", "Extension 13", None), - 0xFFFE: ("COM", "Comment", COM), -} - - -def _accept(prefix): - # Magic number was taken from https://en.wikipedia.org/wiki/JPEG - return prefix[:3] == b"\xFF\xD8\xFF" - - -## -# Image plugin for JPEG and JFIF images. - - -class JpegImageFile(ImageFile.ImageFile): - format = "JPEG" - format_description = "JPEG (ISO 10918)" - - def _open(self): - s = self.fp.read(3) - - if not _accept(s): - msg = "not a JPEG file" - raise SyntaxError(msg) - s = b"\xFF" - - # Create attributes - self.bits = self.layers = 0 - - # JPEG specifics (internal) - self.layer = [] - self.huffman_dc = {} - self.huffman_ac = {} - self.quantization = {} - self.app = {} # compatibility - self.applist = [] - self.icclist = [] - - while True: - i = s[0] - if i == 0xFF: - s = s + self.fp.read(1) - i = i16(s) - else: - # Skip non-0xFF junk - s = self.fp.read(1) - continue - - if i in MARKER: - name, description, handler = MARKER[i] - if handler is not None: - handler(self, i) - if i == 0xFFDA: # start of scan - rawmode = self.mode - if self.mode == "CMYK": - rawmode = "CMYK;I" # assume adobe conventions - self.tile = [("jpeg", (0, 0) + self.size, 0, (rawmode, ""))] - # self.__offset = self.fp.tell() - break - s = self.fp.read(1) - elif i in {0, 0xFFFF}: - # padded marker or junk; move on - s = b"\xff" - elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) - s = self.fp.read(1) - else: - msg = "no marker found" - raise SyntaxError(msg) - - def load_read(self, read_bytes): - """ - internal: read more image data - For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker - so libjpeg can finish decoding - """ - s = self.fp.read(read_bytes) - - if not s and ImageFile.LOAD_TRUNCATED_IMAGES and not hasattr(self, "_ended"): - # Premature EOF. - # Pretend file is finished adding EOI marker - self._ended = True - return b"\xFF\xD9" - - return s - - def draft(self, mode, size): - if len(self.tile) != 1: - return - - # Protect from second call - if self.decoderconfig: - return - - d, e, o, a = self.tile[0] - scale = 1 - original_size = self.size - - if a[0] == "RGB" and mode in ["L", "YCbCr"]: - self._mode = mode - a = mode, "" - - if size: - scale = min(self.size[0] // size[0], self.size[1] // size[1]) - for s in [8, 4, 2, 1]: - if scale >= s: - break - e = ( - e[0], - e[1], - (e[2] - e[0] + s - 1) // s + e[0], - (e[3] - e[1] + s - 1) // s + e[1], - ) - self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s) - scale = s - - self.tile = [(d, e, o, a)] - self.decoderconfig = (scale, 0) - - box = (0, 0, original_size[0] / scale, original_size[1] / scale) - return self.mode, box - - def load_djpeg(self): - # ALTERNATIVE: handle JPEGs via the IJG command line utilities - - f, path = tempfile.mkstemp() - os.close(f) - if os.path.exists(self.filename): - subprocess.check_call(["djpeg", "-outfile", path, self.filename]) - else: - try: - os.unlink(path) - except OSError: - pass - - msg = "Invalid Filename" - raise ValueError(msg) - - try: - with Image.open(path) as _im: - _im.load() - self.im = _im.im - finally: - try: - os.unlink(path) - except OSError: - pass - - self._mode = self.im.mode - self._size = self.im.size - - self.tile = [] - - def _getexif(self): - return _getexif(self) - - def _getmp(self): - return _getmp(self) - - def getxmp(self): - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - - for segment, content in self.applist: - if segment == "APP1": - marker, xmp_tags = content.split(b"\x00")[:2] - if marker == b"http://ns.adobe.com/xap/1.0/": - return self._getxmp(xmp_tags) - return {} - - -def _getexif(self): - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - -def _getmp(self): - # Extract MP information. This method was inspired by the "highly - # experimental" _getexif version that's been in use for years now, - # itself based on the ImageFileDirectory class in the TIFF plugin. - - # The MP record essentially consists of a TIFF file embedded in a JPEG - # application marker. - try: - data = self.info["mp"] - except KeyError: - return None - file_contents = io.BytesIO(data) - head = file_contents.read(8) - endianness = ">" if head[:4] == b"\x4d\x4d\x00\x2a" else "<" - # process dictionary - from . import TiffImagePlugin - - try: - info = TiffImagePlugin.ImageFileDirectory_v2(head) - file_contents.seek(info.next) - info.load(file_contents) - mp = dict(info) - except Exception as e: - msg = "malformed MP Index (unreadable directory)" - raise SyntaxError(msg) from e - # it's an error not to have a number of images - try: - quant = mp[0xB001] - except KeyError as e: - msg = "malformed MP Index (no number of images)" - raise SyntaxError(msg) from e - # get MP entries - mpentries = [] - try: - rawmpentries = mp[0xB002] - for entrynum in range(0, quant): - unpackedentry = struct.unpack_from( - f"{endianness}LLLHH", rawmpentries, entrynum * 16 - ) - labels = ("Attribute", "Size", "DataOffset", "EntryNo1", "EntryNo2") - mpentry = dict(zip(labels, unpackedentry)) - mpentryattr = { - "DependentParentImageFlag": bool(mpentry["Attribute"] & (1 << 31)), - "DependentChildImageFlag": bool(mpentry["Attribute"] & (1 << 30)), - "RepresentativeImageFlag": bool(mpentry["Attribute"] & (1 << 29)), - "Reserved": (mpentry["Attribute"] & (3 << 27)) >> 27, - "ImageDataFormat": (mpentry["Attribute"] & (7 << 24)) >> 24, - "MPType": mpentry["Attribute"] & 0x00FFFFFF, - } - if mpentryattr["ImageDataFormat"] == 0: - mpentryattr["ImageDataFormat"] = "JPEG" - else: - msg = "unsupported picture format in MPO" - raise SyntaxError(msg) - mptypemap = { - 0x000000: "Undefined", - 0x010001: "Large Thumbnail (VGA Equivalent)", - 0x010002: "Large Thumbnail (Full HD Equivalent)", - 0x020001: "Multi-Frame Image (Panorama)", - 0x020002: "Multi-Frame Image: (Disparity)", - 0x020003: "Multi-Frame Image: (Multi-Angle)", - 0x030000: "Baseline MP Primary Image", - } - mpentryattr["MPType"] = mptypemap.get(mpentryattr["MPType"], "Unknown") - mpentry["Attribute"] = mpentryattr - mpentries.append(mpentry) - mp[0xB002] = mpentries - except KeyError as e: - msg = "malformed MP Index (bad MP Entry)" - raise SyntaxError(msg) from e - # Next we should try and parse the individual image unique ID list; - # we don't because I've never seen this actually used in a real MPO - # file and so can't test it. - return mp - - -# -------------------------------------------------------------------- -# stuff to save JPEG files - -RAWMODE = { - "1": "L", - "L": "L", - "RGB": "RGB", - "RGBX": "RGB", - "CMYK": "CMYK;I", # assume adobe conventions - "YCbCr": "YCbCr", -} - -# fmt: off -zigzag_index = ( - 0, 1, 5, 6, 14, 15, 27, 28, - 2, 4, 7, 13, 16, 26, 29, 42, - 3, 8, 12, 17, 25, 30, 41, 43, - 9, 11, 18, 24, 31, 40, 44, 53, - 10, 19, 23, 32, 39, 45, 52, 54, - 20, 22, 33, 38, 46, 51, 55, 60, - 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63, -) - -samplings = { - (1, 1, 1, 1, 1, 1): 0, - (2, 1, 1, 1, 1, 1): 1, - (2, 2, 1, 1, 1, 1): 2, -} -# fmt: on - - -def get_sampling(im): - # There's no subsampling when images have only 1 layer - # (grayscale images) or when they are CMYK (4 layers), - # so set subsampling to the default value. - # - # NOTE: currently Pillow can't encode JPEG to YCCK format. - # If YCCK support is added in the future, subsampling code will have - # to be updated (here and in JpegEncode.c) to deal with 4 layers. - if not hasattr(im, "layers") or im.layers in (1, 4): - return -1 - sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] - return samplings.get(sampling, -1) - - -def _save(im, fp, filename): - if im.width == 0 or im.height == 0: - msg = "cannot write empty image as JPEG" - raise ValueError(msg) - - try: - rawmode = RAWMODE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as JPEG" - raise OSError(msg) from e - - info = im.encoderinfo - - dpi = [round(x) for x in info.get("dpi", (0, 0))] - - quality = info.get("quality", -1) - subsampling = info.get("subsampling", -1) - qtables = info.get("qtables") - - if quality == "keep": - quality = -1 - subsampling = "keep" - qtables = "keep" - elif quality in presets: - preset = presets[quality] - quality = -1 - subsampling = preset.get("subsampling", -1) - qtables = preset.get("quantization") - elif not isinstance(quality, int): - msg = "Invalid quality setting" - raise ValueError(msg) - else: - if subsampling in presets: - subsampling = presets[subsampling].get("subsampling", -1) - if isinstance(qtables, str) and qtables in presets: - qtables = presets[qtables].get("quantization") - - if subsampling == "4:4:4": - subsampling = 0 - elif subsampling == "4:2:2": - subsampling = 1 - elif subsampling == "4:2:0": - subsampling = 2 - elif subsampling == "4:1:1": - # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. - # Set 4:2:0 if someone is still using that value. - subsampling = 2 - elif subsampling == "keep": - if im.format != "JPEG": - msg = "Cannot use 'keep' when original image is not a JPEG" - raise ValueError(msg) - subsampling = get_sampling(im) - - def validate_qtables(qtables): - if qtables is None: - return qtables - if isinstance(qtables, str): - try: - lines = [ - int(num) - for line in qtables.splitlines() - for num in line.split("#", 1)[0].split() - ] - except ValueError as e: - msg = "Invalid quantization table" - raise ValueError(msg) from e - else: - qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)] - if isinstance(qtables, (tuple, list, dict)): - if isinstance(qtables, dict): - qtables = [ - qtables[key] for key in range(len(qtables)) if key in qtables - ] - elif isinstance(qtables, tuple): - qtables = list(qtables) - if not (0 < len(qtables) < 5): - msg = "None or too many quantization tables" - raise ValueError(msg) - for idx, table in enumerate(qtables): - try: - if len(table) != 64: - msg = "Invalid quantization table" - raise TypeError(msg) - table = array.array("H", table) - except TypeError as e: - msg = "Invalid quantization table" - raise ValueError(msg) from e - else: - qtables[idx] = list(table) - return qtables - - if qtables == "keep": - if im.format != "JPEG": - msg = "Cannot use 'keep' when original image is not a JPEG" - raise ValueError(msg) - qtables = getattr(im, "quantization", None) - qtables = validate_qtables(qtables) - - extra = info.get("extra", b"") - - MAX_BYTES_IN_MARKER = 65533 - icc_profile = info.get("icc_profile") - if icc_profile: - ICC_OVERHEAD_LEN = 14 - MAX_DATA_BYTES_IN_MARKER = MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN - markers = [] - while icc_profile: - markers.append(icc_profile[:MAX_DATA_BYTES_IN_MARKER]) - icc_profile = icc_profile[MAX_DATA_BYTES_IN_MARKER:] - i = 1 - for marker in markers: - size = o16(2 + ICC_OVERHEAD_LEN + len(marker)) - extra += ( - b"\xFF\xE2" - + size - + b"ICC_PROFILE\0" - + o8(i) - + o8(len(markers)) - + marker - ) - i += 1 - - comment = info.get("comment", im.info.get("comment")) - - # "progressive" is the official name, but older documentation - # says "progression" - # FIXME: issue a warning if the wrong form is used (post-1.1.7) - progressive = info.get("progressive", False) or info.get("progression", False) - - optimize = info.get("optimize", False) - - exif = info.get("exif", b"") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - if len(exif) > MAX_BYTES_IN_MARKER: - msg = "EXIF data is too long" - raise ValueError(msg) - - # get keyword arguments - im.encoderconfig = ( - quality, - progressive, - info.get("smooth", 0), - optimize, - info.get("keep_rgb", False), - info.get("streamtype", 0), - dpi[0], - dpi[1], - subsampling, - info.get("restart_marker_blocks", 0), - info.get("restart_marker_rows", 0), - qtables, - comment, - extra, - exif, - ) - - # if we optimize, libjpeg needs a buffer big enough to hold the whole image - # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is - # channels*size, this is a value that's been used in a django patch. - # https://github.com/matthewwithanm/django-imagekit/issues/50 - bufsize = 0 - if optimize or progressive: - # CMYK can be bigger - if im.mode == "CMYK": - bufsize = 4 * im.size[0] * im.size[1] - # keep sets quality to -1, but the actual value may be high. - elif quality >= 95 or quality == -1: - bufsize = 2 * im.size[0] * im.size[1] - else: - bufsize = im.size[0] * im.size[1] - if exif: - bufsize += len(exif) + 5 - if extra: - bufsize += len(extra) + 1 - else: - # The EXIF info needs to be written as one block, + APP1, + one spare byte. - # Ensure that our buffer is big enough. Same with the icc_profile block. - bufsize = max(bufsize, len(exif) + 5, len(extra) + 1) - - ImageFile._save(im, fp, [("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize) - - -def _save_cjpeg(im, fp, filename): - # ALTERNATIVE: handle JPEGs via the IJG command line utilities. - tempfile = im._dump() - subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) - try: - os.unlink(tempfile) - except OSError: - pass - - -## -# Factory for making JPEG and MPO instances -def jpeg_factory(fp=None, filename=None): - im = JpegImageFile(fp, filename) - try: - mpheader = im._getmp() - if mpheader[45057] > 1: - # It's actually an MPO - from .MpoImagePlugin import MpoImageFile - - # Don't reload everything, just convert it. - im = MpoImageFile.adopt(im, mpheader) - except (TypeError, IndexError): - # It is really a JPEG - pass - except SyntaxError: - warnings.warn( - "Image appears to be a malformed MPO file, it will be " - "interpreted as a base JPEG file" - ) - return im - - -# --------------------------------------------------------------------- -# Registry stuff - -Image.register_open(JpegImageFile.format, jpeg_factory, _accept) -Image.register_save(JpegImageFile.format, _save) - -Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) - -Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/.flatpak-builder/cache/objects/82/76639a9ef84e274a81c2d86dff5a7512fb371501124ae189f6d7bf21fe334a.dirtree b/.flatpak-builder/cache/objects/82/76639a9ef84e274a81c2d86dff5a7512fb371501124ae189f6d7bf21fe334a.dirtree deleted file mode 100644 index 115a9e5eea4b6d5e7b1a9193ee3574f528f103bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58 zcmYe!&(+IHO-n0IEz)z$DM(CC)GNqKXE?mxwfsbA^@YU7#~qvW&Tbb!q|6y0|7|rF O>-*|w51i`6Ei3`fCm9(4 diff --git a/.flatpak-builder/cache/objects/83/bec69f59dbdf6837ca980995e6c44d183bf25fc8c2b62a365b0ac0dd417b47.file b/.flatpak-builder/cache/objects/83/bec69f59dbdf6837ca980995e6c44d183bf25fc8c2b62a365b0ac0dd417b47.file deleted file mode 100644 index eb2009d74a39f85a8abe7b8c8659ac9ed2a36576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1903 zcmah}&2Jk;6rcTGujANGn-55pMx>zlfK3DeQXx=)s49(0gacByidI|iI5Ao8x-;wM z=1`If=lXxDG11mu4sz!zhp}AFS&AE zF_pS%s&&oO>bj{5gi2qgPVgLgRY9I@yrB-eJ#*2j~T--^o_xu9bOlnK-%c1ar_4%cPLs zN9%$RrESmi13Res9=}q%CeV=odDNl+Qh|D~S8(Zr?}{ zQmDPww3!2N(yX^pLFkil93J6d2qZg%5>s#pq)T&@Eg90K!ew-ZP?1~ax;+Eyvb!u6WVOe$GX}ZYw zS=QaA?Is#F2&Rvq67kqYBp9%mAPAoX(mI_TQOI2CkpCbFNE~p*TC^(uA_OZ{@$cEJ zW_!W8QW3RSlhNS_AjGorq7v(fNbz(1q5Q;Y_!vwO>Oska=gL{iNQ zl9!JH+>7&xosJD&CM*vudl?8MQRdXGvdgeJ&SD&eNM_(~Gk?}w5k-j45h@8v{A8$! zBIE!u*f^3n2WSb>VHDsa8FmbtK!UE%M0^alNKnoZrW^6LJRSC|1%MnL&eK}y=7zZ|en*@q~@GqKOY5Ee(Z2~7dT!7wk8=<`V88$42z zN@X%g8GhIpKAm9&Mt%1vBmKRkmfvSnV1^CLIna(I2tu2@5}sdA zNvajkHZfZ9Y?JBm|JGAU-IFeCul+8Kh0<7C9uIp~N7j@}ZM_ustiyJCs6!M5TIGba z^|A2$>d0aW40_2kls$ieqN4%Y;o)H?M~v+K^jQsTKlgoSKGhudSFLkx0 zc2tte-Pg9Y2XBS?ttYfoA1tr6Vu^4 nH^Si?d-?fRKR~CihQ_UFc4 diff --git a/.flatpak-builder/cache/objects/84/28af64e195390feb3309272b34ed0d38fd4a3b416ec42866272735422bbb0f.file b/.flatpak-builder/cache/objects/84/28af64e195390feb3309272b34ed0d38fd4a3b416ec42866272735422bbb0f.file deleted file mode 100644 index 5998f3a..0000000 --- a/.flatpak-builder/cache/objects/84/28af64e195390feb3309272b34ed0d38fd4a3b416ec42866272735422bbb0f.file +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.21.1 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/.flatpak-builder/cache/objects/84/3df803e34b6765840c48c895063aebcdf8b45a4f4c1ac0e9088c30da7b6c74.file b/.flatpak-builder/cache/objects/84/3df803e34b6765840c48c895063aebcdf8b45a4f4c1ac0e9088c30da7b6c74.file deleted file mode 100644 index a367417..0000000 --- a/.flatpak-builder/cache/objects/84/3df803e34b6765840c48c895063aebcdf8b45a4f4c1ac0e9088c30da7b6c74.file +++ /dev/null @@ -1,1094 +0,0 @@ -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. -""" - -import codecs -import contextlib -import io -import os -import re -import socket -import struct -import sys -import tempfile -import warnings -import zipfile -from collections import OrderedDict - -from urllib3.util import make_headers, parse_url - -from . import certs -from .__version__ import __version__ - -# to_native_string is unused here, but imported here for backwards compatibility -from ._internal_utils import ( # noqa: F401 - _HEADER_VALIDATORS_BYTE, - _HEADER_VALIDATORS_STR, - HEADER_VALIDATORS, - to_native_string, -) -from .compat import ( - Mapping, - basestring, - bytes, - getproxies, - getproxies_environment, - integer_types, -) -from .compat import parse_http_list as _parse_list_header -from .compat import ( - proxy_bypass, - proxy_bypass_environment, - quote, - str, - unquote, - urlparse, - urlunparse, -) -from .cookies import cookiejar_from_dict -from .exceptions import ( - FileModeWarning, - InvalidHeader, - InvalidURL, - UnrewindableBodyError, -) -from .structures import CaseInsensitiveDict - -NETRC_FILES = (".netrc", "_netrc") - -DEFAULT_CA_BUNDLE_PATH = certs.where() - -DEFAULT_PORTS = {"http": 80, "https": 443} - -# Ensure that ', ' is used to preserve previous delimiter behavior. -DEFAULT_ACCEPT_ENCODING = ", ".join( - re.split(r",\s*", make_headers(accept_encoding=True)["accept-encoding"]) -) - - -if sys.platform == "win32": - # provide a proxy_bypass version on Windows without DNS lookups - - def proxy_bypass_registry(host): - try: - import winreg - except ImportError: - return False - - try: - internetSettings = winreg.OpenKey( - winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", - ) - # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it - proxyEnable = int(winreg.QueryValueEx(internetSettings, "ProxyEnable")[0]) - # ProxyOverride is almost always a string - proxyOverride = winreg.QueryValueEx(internetSettings, "ProxyOverride")[0] - except (OSError, ValueError): - return False - if not proxyEnable or not proxyOverride: - return False - - # make a check value list from the registry entry: replace the - # '' string by the localhost entry and the corresponding - # canonical entry. - proxyOverride = proxyOverride.split(";") - # now check if we match one of the registry values. - for test in proxyOverride: - if test == "": - if "." not in host: - return True - test = test.replace(".", r"\.") # mask dots - test = test.replace("*", r".*") # change glob sequence - test = test.replace("?", r".") # change glob char - if re.match(test, host, re.I): - return True - return False - - def proxy_bypass(host): # noqa - """Return True, if the host should be bypassed. - - Checks proxy settings gathered from the environment, if specified, - or the registry. - """ - if getproxies_environment(): - return proxy_bypass_environment(host) - else: - return proxy_bypass_registry(host) - - -def dict_to_sequence(d): - """Returns an internal sequence dictionary update.""" - - if hasattr(d, "items"): - d = d.items() - - return d - - -def super_len(o): - total_length = None - current_position = 0 - - if hasattr(o, "__len__"): - total_length = len(o) - - elif hasattr(o, "len"): - total_length = o.len - - elif hasattr(o, "fileno"): - try: - fileno = o.fileno() - except (io.UnsupportedOperation, AttributeError): - # AttributeError is a surprising exception, seeing as how we've just checked - # that `hasattr(o, 'fileno')`. It happens for objects obtained via - # `Tarfile.extractfile()`, per issue 5229. - pass - else: - total_length = os.fstat(fileno).st_size - - # Having used fstat to determine the file length, we need to - # confirm that this file was opened up in binary mode. - if "b" not in o.mode: - warnings.warn( - ( - "Requests has determined the content-length for this " - "request using the binary size of the file: however, the " - "file has been opened in text mode (i.e. without the 'b' " - "flag in the mode). This may lead to an incorrect " - "content-length. In Requests 3.0, support will be removed " - "for files in text mode." - ), - FileModeWarning, - ) - - if hasattr(o, "tell"): - try: - current_position = o.tell() - except OSError: - # This can happen in some weird situations, such as when the file - # is actually a special file descriptor like stdin. In this - # instance, we don't know what the length is, so set it to zero and - # let requests chunk it instead. - if total_length is not None: - current_position = total_length - else: - if hasattr(o, "seek") and total_length is None: - # StringIO and BytesIO have seek but no usable fileno - try: - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) - except OSError: - total_length = 0 - - if total_length is None: - total_length = 0 - - return max(0, total_length - current_position) - - -def get_netrc_auth(url, raise_errors=False): - """Returns the Requests tuple auth for a given url from netrc.""" - - netrc_file = os.environ.get("NETRC") - if netrc_file is not None: - netrc_locations = (netrc_file,) - else: - netrc_locations = (f"~/{f}" for f in NETRC_FILES) - - try: - from netrc import NetrcParseError, netrc - - netrc_path = None - - for f in netrc_locations: - try: - loc = os.path.expanduser(f) - except KeyError: - # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See https://bugs.python.org/issue20164 & - # https://github.com/psf/requests/issues/1846 - return - - if os.path.exists(loc): - netrc_path = loc - break - - # Abort early if there isn't one. - if netrc_path is None: - return - - ri = urlparse(url) - - # Strip port numbers from netloc. This weird `if...encode`` dance is - # used for Python 3.2, which doesn't support unicode literals. - splitstr = b":" - if isinstance(url, str): - splitstr = splitstr.decode("ascii") - host = ri.netloc.split(splitstr)[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = 0 if _netrc[0] else 1 - return (_netrc[login_i], _netrc[2]) - except (NetrcParseError, OSError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth unless explicitly asked to raise errors. - if raise_errors: - raise - - # App Engine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, "name", None) - if name and isinstance(name, basestring) and name[0] != "<" and name[-1] != ">": - return os.path.basename(name) - - -def extract_zipped_paths(path): - """Replace nonexistent paths that look like they refer to a member of a zip - archive with the location of an extracted copy of the target, or else - just return the provided path unchanged. - """ - if os.path.exists(path): - # this is already a valid path, no need to do anything further - return path - - # find the first valid part of the provided path and treat that as a zip archive - # assume the rest of the path is the name of a member in the archive - archive, member = os.path.split(path) - while archive and not os.path.exists(archive): - archive, prefix = os.path.split(archive) - if not prefix: - # If we don't check for an empty prefix after the split (in other words, archive remains unchanged after the split), - # we _can_ end up in an infinite loop on a rare corner case affecting a small number of users - break - member = "/".join([prefix, member]) - - if not zipfile.is_zipfile(archive): - return path - - zip_file = zipfile.ZipFile(archive) - if member not in zip_file.namelist(): - return path - - # we have a valid zip archive and a valid member of that archive - tmp = tempfile.gettempdir() - extracted_path = os.path.join(tmp, member.split("/")[-1]) - if not os.path.exists(extracted_path): - # use read + write to avoid the creating nested folders, we only want the file, avoids mkdir racing condition - with atomic_open(extracted_path) as file_handler: - file_handler.write(zip_file.read(member)) - return extracted_path - - -@contextlib.contextmanager -def atomic_open(filename): - """Write a file to the disk in an atomic fashion""" - tmp_descriptor, tmp_name = tempfile.mkstemp(dir=os.path.dirname(filename)) - try: - with os.fdopen(tmp_descriptor, "wb") as tmp_handler: - yield tmp_handler - os.replace(tmp_name, filename) - except BaseException: - os.remove(tmp_name) - raise - - -def from_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - Traceback (most recent call last): - ... - ValueError: cannot encode objects that are not 2-tuples - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - - :rtype: OrderedDict - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError("cannot encode objects that are not 2-tuples") - - return OrderedDict(value) - - -def to_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - Traceback (most recent call last): - ... - ValueError: cannot encode objects that are not 2-tuples - - :rtype: list - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError("cannot encode objects that are not 2-tuples") - - if isinstance(value, Mapping): - value = value.items() - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - :rtype: list - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - :rtype: dict - """ - result = {} - for item in _parse_list_header(value): - if "=" not in item: - result[item] = None - continue - name, value = item.split("=", 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - :rtype: str - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != "\\\\": - return value.replace("\\\\", "\\").replace('\\"', '"') - return value - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - :rtype: dict - """ - - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - :rtype: CookieJar - """ - - return cookiejar_from_dict(cookie_dict, cj) - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - warnings.warn( - ( - "In requests 3.0, get_encodings_from_content will be removed. For " - "more information, please see the discussion on issue #2266. (This" - " warning should only appear once.)" - ), - DeprecationWarning, - ) - - charset_re = re.compile(r']', flags=re.I) - pragma_re = re.compile(r']', flags=re.I) - xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') - - return ( - charset_re.findall(content) - + pragma_re.findall(content) - + xml_re.findall(content) - ) - - -def _parse_content_type_header(header): - """Returns content type and parameters from given header - - :param header: string - :return: tuple containing content type and dictionary of - parameters - """ - - tokens = header.split(";") - content_type, params = tokens[0].strip(), tokens[1:] - params_dict = {} - items_to_strip = "\"' " - - for param in params: - param = param.strip() - if param: - key, value = param, True - index_of_equals = param.find("=") - if index_of_equals != -1: - key = param[:index_of_equals].strip(items_to_strip) - value = param[index_of_equals + 1 :].strip(items_to_strip) - params_dict[key.lower()] = value - return content_type, params_dict - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - :rtype: str - """ - - content_type = headers.get("content-type") - - if not content_type: - return None - - content_type, params = _parse_content_type_header(content_type) - - if "charset" in params: - return params["charset"].strip("'\"") - - if "text" in content_type: - return "ISO-8859-1" - - if "application/json" in content_type: - # Assume UTF-8 based on RFC 4627: https://www.ietf.org/rfc/rfc4627.txt since the charset was unset - return "utf-8" - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes an iterator.""" - - if r.encoding is None: - yield from iterator - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors="replace") - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode(b"", final=True) - if rv: - yield rv - - -def iter_slices(string, slice_length): - """Iterate over slices of a string.""" - pos = 0 - if slice_length is None or slice_length <= 0: - slice_length = len(string) - while pos < len(string): - yield string[pos : pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - 2. fall back and replace all unicode characters - - :rtype: str - """ - warnings.warn( - ( - "In requests 3.0, get_unicode_from_response will be removed. For " - "more information, please see the discussion on issue #2266. (This" - " warning should only appear once.)" - ), - DeprecationWarning, - ) - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors="replace") - except TypeError: - return r.content - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~" -) - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - - :rtype: str - """ - parts = uri.split("%") - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - try: - c = chr(int(h, 16)) - except ValueError: - raise InvalidURL(f"Invalid percent-escape sequence: '{h}'") - - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = f"%{parts[i]}" - else: - parts[i] = f"%{parts[i]}" - return "".join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - - :rtype: str - """ - safe_with_percent = "!#$%&'()*+,/:;=?@[]~" - safe_without_percent = "!#$&'()*+,/:;=?@[]~" - try: - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, - # unreserved, or '%') - return quote(unquote_unreserved(uri), safe=safe_with_percent) - except InvalidURL: - # We couldn't unquote the given URI, so let's try quoting it, but - # there may be unquoted '%'s in the URI. We need to make sure they're - # properly quoted so they do not cause issues elsewhere. - return quote(uri, safe=safe_without_percent) - - -def address_in_network(ip, net): - """This function allows you to check if an IP belongs to a network subnet - - Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 - returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 - - :rtype: bool - """ - ipaddr = struct.unpack("=L", socket.inet_aton(ip))[0] - netaddr, bits = net.split("/") - netmask = struct.unpack("=L", socket.inet_aton(dotted_netmask(int(bits))))[0] - network = struct.unpack("=L", socket.inet_aton(netaddr))[0] & netmask - return (ipaddr & netmask) == (network & netmask) - - -def dotted_netmask(mask): - """Converts mask from /xx format to xxx.xxx.xxx.xxx - - Example: if mask is 24 function returns 255.255.255.0 - - :rtype: str - """ - bits = 0xFFFFFFFF ^ (1 << 32 - mask) - 1 - return socket.inet_ntoa(struct.pack(">I", bits)) - - -def is_ipv4_address(string_ip): - """ - :rtype: bool - """ - try: - socket.inet_aton(string_ip) - except OSError: - return False - return True - - -def is_valid_cidr(string_network): - """ - Very simple check of the cidr format in no_proxy variable. - - :rtype: bool - """ - if string_network.count("/") == 1: - try: - mask = int(string_network.split("/")[1]) - except ValueError: - return False - - if mask < 1 or mask > 32: - return False - - try: - socket.inet_aton(string_network.split("/")[0]) - except OSError: - return False - else: - return False - return True - - -@contextlib.contextmanager -def set_environ(env_name, value): - """Set the environment variable 'env_name' to 'value' - - Save previous value, yield, and then restore the previous value stored in - the environment variable 'env_name'. - - If 'value' is None, do nothing""" - value_changed = value is not None - if value_changed: - old_value = os.environ.get(env_name) - os.environ[env_name] = value - try: - yield - finally: - if value_changed: - if old_value is None: - del os.environ[env_name] - else: - os.environ[env_name] = old_value - - -def should_bypass_proxies(url, no_proxy): - """ - Returns whether we should bypass proxies or not. - - :rtype: bool - """ - # Prioritize lowercase environment variables over uppercase - # to keep a consistent behaviour with other http projects (curl, wget). - def get_proxy(key): - return os.environ.get(key) or os.environ.get(key.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy_arg = no_proxy - if no_proxy is None: - no_proxy = get_proxy("no_proxy") - parsed = urlparse(url) - - if parsed.hostname is None: - # URLs don't always have hostnames, e.g. file:/// urls. - return True - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the hostname, both with and without the port. - no_proxy = (host for host in no_proxy.replace(" ", "").split(",") if host) - - if is_ipv4_address(parsed.hostname): - for proxy_ip in no_proxy: - if is_valid_cidr(proxy_ip): - if address_in_network(parsed.hostname, proxy_ip): - return True - elif parsed.hostname == proxy_ip: - # If no_proxy ip was defined in plain IP notation instead of cidr notation & - # matches the IP of the index - return True - else: - host_with_port = parsed.hostname - if parsed.port: - host_with_port += f":{parsed.port}" - - for host in no_proxy: - if parsed.hostname.endswith(host) or host_with_port.endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return True - - with set_environ("no_proxy", no_proxy_arg): - # parsed.hostname can be `None` in cases such as a file URI. - try: - bypass = proxy_bypass(parsed.hostname) - except (TypeError, socket.gaierror): - bypass = False - - if bypass: - return True - - return False - - -def get_environ_proxies(url, no_proxy=None): - """ - Return a dict of environment proxies. - - :rtype: dict - """ - if should_bypass_proxies(url, no_proxy=no_proxy): - return {} - else: - return getproxies() - - -def select_proxy(url, proxies): - """Select a proxy for the url, if applicable. - - :param url: The url being for the request - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - """ - proxies = proxies or {} - urlparts = urlparse(url) - if urlparts.hostname is None: - return proxies.get(urlparts.scheme, proxies.get("all")) - - proxy_keys = [ - urlparts.scheme + "://" + urlparts.hostname, - urlparts.scheme, - "all://" + urlparts.hostname, - "all", - ] - proxy = None - for proxy_key in proxy_keys: - if proxy_key in proxies: - proxy = proxies[proxy_key] - break - - return proxy - - -def resolve_proxies(request, proxies, trust_env=True): - """This method takes proxy information from a request and configuration - input to resolve a mapping of target proxies. This will consider settings - such a NO_PROXY to strip proxy configurations. - - :param request: Request or PreparedRequest - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - :param trust_env: Boolean declaring whether to trust environment configs - - :rtype: dict - """ - proxies = proxies if proxies is not None else {} - url = request.url - scheme = urlparse(url).scheme - no_proxy = proxies.get("no_proxy") - new_proxies = proxies.copy() - - if trust_env and not should_bypass_proxies(url, no_proxy=no_proxy): - environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) - - proxy = environ_proxies.get(scheme, environ_proxies.get("all")) - - if proxy: - new_proxies.setdefault(scheme, proxy) - return new_proxies - - -def default_user_agent(name="python-requests"): - """ - Return a string representing the default user agent. - - :rtype: str - """ - return f"{name}/{__version__}" - - -def default_headers(): - """ - :rtype: requests.structures.CaseInsensitiveDict - """ - return CaseInsensitiveDict( - { - "User-Agent": default_user_agent(), - "Accept-Encoding": DEFAULT_ACCEPT_ENCODING, - "Accept": "*/*", - "Connection": "keep-alive", - } - ) - - -def parse_header_links(value): - """Return a list of parsed link headers proxies. - - i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" - - :rtype: list - """ - - links = [] - - replace_chars = " '\"" - - value = value.strip(replace_chars) - if not value: - return links - - for val in re.split(", *<", value): - try: - url, params = val.split(";", 1) - except ValueError: - url, params = val, "" - - link = {"url": url.strip("<> '\"")} - - for param in params.split(";"): - try: - key, value = param.split("=") - except ValueError: - break - - link[key.strip(replace_chars)] = value.strip(replace_chars) - - links.append(link) - - return links - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = "\x00".encode("ascii") # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data): - """ - :rtype: str - """ - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - return "utf-32" # BOM included - if sample[:3] == codecs.BOM_UTF8: - return "utf-8-sig" # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return "utf-16" # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return "utf-8" - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return "utf-16-be" - if sample[1::2] == _null2: # 2nd and 4th are null - return "utf-16-le" - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return "utf-32-be" - if sample[1:] == _null3: - return "utf-32-le" - # Did not detect a valid UTF-32 ascii-range character - return None - - -def prepend_scheme_if_needed(url, new_scheme): - """Given a URL that may or may not have a scheme, prepend the given scheme. - Does not replace a present scheme with the one provided as an argument. - - :rtype: str - """ - parsed = parse_url(url) - scheme, auth, host, port, path, query, fragment = parsed - - # A defect in urlparse determines that there isn't a netloc present in some - # urls. We previously assumed parsing was overly cautious, and swapped the - # netloc and path. Due to a lack of tests on the original defect, this is - # maintained with parse_url for backwards compatibility. - netloc = parsed.netloc - if not netloc: - netloc, path = path, netloc - - if auth: - # parse_url doesn't provide the netloc with auth - # so we'll add it ourselves. - netloc = "@".join([auth, netloc]) - if scheme is None: - scheme = new_scheme - if path is None: - path = "" - - return urlunparse((scheme, netloc, path, "", query, fragment)) - - -def get_auth_from_url(url): - """Given a url with authentication components, extract them into a tuple of - username,password. - - :rtype: (str,str) - """ - parsed = urlparse(url) - - try: - auth = (unquote(parsed.username), unquote(parsed.password)) - except (AttributeError, TypeError): - auth = ("", "") - - return auth - - -def check_header_validity(header): - """Verifies that header parts don't contain leading whitespace - reserved characters, or return characters. - - :param header: tuple, in the format (name, value). - """ - name, value = header - _validate_header_part(header, name, 0) - _validate_header_part(header, value, 1) - - -def _validate_header_part(header, header_part, header_validator_index): - if isinstance(header_part, str): - validator = _HEADER_VALIDATORS_STR[header_validator_index] - elif isinstance(header_part, bytes): - validator = _HEADER_VALIDATORS_BYTE[header_validator_index] - else: - raise InvalidHeader( - f"Header part ({header_part!r}) from {header} " - f"must be of type str or bytes, not {type(header_part)}" - ) - - if not validator.match(header_part): - header_kind = "name" if header_validator_index == 0 else "value" - raise InvalidHeader( - f"Invalid leading whitespace, reserved character(s), or return" - f"character(s) in header {header_kind}: {header_part!r}" - ) - - -def urldefragauth(url): - """ - Given a url remove the fragment and the authentication part. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url) - - # see func:`prepend_scheme_if_needed` - if not netloc: - netloc, path = path, netloc - - netloc = netloc.rsplit("@", 1)[-1] - - return urlunparse((scheme, netloc, path, params, query, "")) - - -def rewind_body(prepared_request): - """Move file pointer back to its recorded starting position - so it can be read again on redirect. - """ - body_seek = getattr(prepared_request.body, "seek", None) - if body_seek is not None and isinstance( - prepared_request._body_position, integer_types - ): - try: - body_seek(prepared_request._body_position) - except OSError: - raise UnrewindableBodyError( - "An error occurred when rewinding request body for redirect." - ) - else: - raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/.flatpak-builder/cache/objects/84/7330d3c79a3260564d825460ec10344d4854bbf8a9da1731ded0979e6170d9.file b/.flatpak-builder/cache/objects/84/7330d3c79a3260564d825460ec10344d4854bbf8a9da1731ded0979e6170d9.file deleted file mode 100644 index d66fbc2..0000000 --- a/.flatpak-builder/cache/objects/84/7330d3c79a3260564d825460ec10344d4854bbf8a9da1731ded0979e6170d9.file +++ /dev/null @@ -1,358 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Windows Icon support for PIL -# -# History: -# 96-05-27 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - -# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis -# . -# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki -# -# Icon format references: -# * https://en.wikipedia.org/wiki/ICO_(file_format) -# * https://msdn.microsoft.com/en-us/library/ms997538.aspx -from __future__ import annotations - -import warnings -from io import BytesIO -from math import ceil, log - -from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o16le as o16 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -_MAGIC = b"\0\0\1\0" - - -def _save(im, fp, filename): - fp.write(_MAGIC) # (2+2) - bmp = im.encoderinfo.get("bitmap_format") == "bmp" - sizes = im.encoderinfo.get( - "sizes", - [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], - ) - frames = [] - provided_ims = [im] + im.encoderinfo.get("append_images", []) - width, height = im.size - for size in sorted(set(sizes)): - if size[0] > width or size[1] > height or size[0] > 256 or size[1] > 256: - continue - - for provided_im in provided_ims: - if provided_im.size != size: - continue - frames.append(provided_im) - if bmp: - bits = BmpImagePlugin.SAVE[provided_im.mode][1] - bits_used = [bits] - for other_im in provided_ims: - if other_im.size != size: - continue - bits = BmpImagePlugin.SAVE[other_im.mode][1] - if bits not in bits_used: - # Another image has been supplied for this size - # with a different bit depth - frames.append(other_im) - bits_used.append(bits) - break - else: - # TODO: invent a more convenient method for proportional scalings - frame = provided_im.copy() - frame.thumbnail(size, Image.Resampling.LANCZOS, reducing_gap=None) - frames.append(frame) - fp.write(o16(len(frames))) # idCount(2) - offset = fp.tell() + len(frames) * 16 - for frame in frames: - width, height = frame.size - # 0 means 256 - fp.write(o8(width if width < 256 else 0)) # bWidth(1) - fp.write(o8(height if height < 256 else 0)) # bHeight(1) - - bits, colors = BmpImagePlugin.SAVE[frame.mode][1:] if bmp else (32, 0) - fp.write(o8(colors)) # bColorCount(1) - fp.write(b"\0") # bReserved(1) - fp.write(b"\0\0") # wPlanes(2) - fp.write(o16(bits)) # wBitCount(2) - - image_io = BytesIO() - if bmp: - frame.save(image_io, "dib") - - if bits != 32: - and_mask = Image.new("1", size) - ImageFile._save( - and_mask, image_io, [("raw", (0, 0) + size, 0, ("1", 0, -1))] - ) - else: - frame.save(image_io, "png") - image_io.seek(0) - image_bytes = image_io.read() - if bmp: - image_bytes = image_bytes[:8] + o32(height * 2) + image_bytes[12:] - bytes_len = len(image_bytes) - fp.write(o32(bytes_len)) # dwBytesInRes(4) - fp.write(o32(offset)) # dwImageOffset(4) - current = fp.tell() - fp.seek(offset) - fp.write(image_bytes) - offset = offset + bytes_len - fp.seek(current) - - -def _accept(prefix): - return prefix[:4] == _MAGIC - - -class IcoFile: - def __init__(self, buf): - """ - Parse image from file-like object containing ico file data - """ - - # check magic - s = buf.read(6) - if not _accept(s): - msg = "not an ICO file" - raise SyntaxError(msg) - - self.buf = buf - self.entry = [] - - # Number of items in file - self.nb_items = i16(s, 4) - - # Get headers for each item - for i in range(self.nb_items): - s = buf.read(16) - - icon_header = { - "width": s[0], - "height": s[1], - "nb_color": s[2], # No. of colors in image (0 if >=8bpp) - "reserved": s[3], - "planes": i16(s, 4), - "bpp": i16(s, 6), - "size": i32(s, 8), - "offset": i32(s, 12), - } - - # See Wikipedia - for j in ("width", "height"): - if not icon_header[j]: - icon_header[j] = 256 - - # See Wikipedia notes about color depth. - # We need this just to differ images with equal sizes - icon_header["color_depth"] = ( - icon_header["bpp"] - or ( - icon_header["nb_color"] != 0 - and ceil(log(icon_header["nb_color"], 2)) - ) - or 256 - ) - - icon_header["dim"] = (icon_header["width"], icon_header["height"]) - icon_header["square"] = icon_header["width"] * icon_header["height"] - - self.entry.append(icon_header) - - self.entry = sorted(self.entry, key=lambda x: x["color_depth"]) - # ICO images are usually squares - self.entry = sorted(self.entry, key=lambda x: x["square"], reverse=True) - - def sizes(self): - """ - Get a list of all available icon sizes and color depths. - """ - return {(h["width"], h["height"]) for h in self.entry} - - def getentryindex(self, size, bpp=False): - for i, h in enumerate(self.entry): - if size == h["dim"] and (bpp is False or bpp == h["color_depth"]): - return i - return 0 - - def getimage(self, size, bpp=False): - """ - Get an image from the icon - """ - return self.frame(self.getentryindex(size, bpp)) - - def frame(self, idx): - """ - Get an image from frame idx - """ - - header = self.entry[idx] - - self.buf.seek(header["offset"]) - data = self.buf.read(8) - self.buf.seek(header["offset"]) - - if data[:8] == PngImagePlugin._MAGIC: - # png frame - im = PngImagePlugin.PngImageFile(self.buf) - Image._decompression_bomb_check(im.size) - else: - # XOR + AND mask bmp frame - im = BmpImagePlugin.DibImageFile(self.buf) - Image._decompression_bomb_check(im.size) - - # change tile dimension to only encompass XOR image - im._size = (im.size[0], int(im.size[1] / 2)) - d, e, o, a = im.tile[0] - im.tile[0] = d, (0, 0) + im.size, o, a - - # figure out where AND mask image starts - bpp = header["bpp"] - if 32 == bpp: - # 32-bit color depth icon image allows semitransparent areas - # PIL's DIB format ignores transparency bits, recover them. - # The DIB is packed in BGRX byte order where X is the alpha - # channel. - - # Back up to start of bmp data - self.buf.seek(o) - # extract every 4th byte (eg. 3,7,11,15,...) - alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] - - # convert to an 8bpp grayscale image - mask = Image.frombuffer( - "L", # 8bpp - im.size, # (w, h) - alpha_bytes, # source chars - "raw", # raw decoder - ("L", 0, -1), # 8bpp inverted, unpadded, reversed - ) - else: - # get AND image from end of bitmap - w = im.size[0] - if (w % 32) > 0: - # bitmap row data is aligned to word boundaries - w += 32 - (im.size[0] % 32) - - # the total mask data is - # padded row size * height / bits per char - - total_bytes = int((w * im.size[1]) / 8) - and_mask_offset = header["offset"] + header["size"] - total_bytes - - self.buf.seek(and_mask_offset) - mask_data = self.buf.read(total_bytes) - - # convert raw data to image - mask = Image.frombuffer( - "1", # 1 bpp - im.size, # (w, h) - mask_data, # source chars - "raw", # raw decoder - ("1;I", int(w / 8), -1), # 1bpp inverted, padded, reversed - ) - - # now we have two images, im is XOR image and mask is AND image - - # apply mask image as alpha channel - im = im.convert("RGBA") - im.putalpha(mask) - - return im - - -## -# Image plugin for Windows Icon files. - - -class IcoImageFile(ImageFile.ImageFile): - """ - PIL read-only image support for Microsoft Windows .ico files. - - By default the largest resolution image in the file will be loaded. This - can be changed by altering the 'size' attribute before calling 'load'. - - The info dictionary has a key 'sizes' that is a list of the sizes available - in the icon file. - - Handles classic, XP and Vista icon formats. - - When saving, PNG compression is used. Support for this was only added in - Windows Vista. If you are unable to view the icon in Windows, convert the - image to "RGBA" mode before saving. - - This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis - . - https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki - """ - - format = "ICO" - format_description = "Windows Icon" - - def _open(self): - self.ico = IcoFile(self.fp) - self.info["sizes"] = self.ico.sizes() - self.size = self.ico.entry[0]["dim"] - self.load() - - @property - def size(self): - return self._size - - @size.setter - def size(self, value): - if value not in self.info["sizes"]: - msg = "This is not one of the allowed sizes of this image" - raise ValueError(msg) - self._size = value - - def load(self): - if self.im is not None and self.im.size == self.size: - # Already loaded - return Image.Image.load(self) - im = self.ico.getimage(self.size) - # if tile is PNG, it won't really be loaded yet - im.load() - self.im = im.im - self.pyaccess = None - self._mode = im.mode - if im.palette: - self.palette = im.palette - if im.size != self.size: - warnings.warn("Image was not the expected size") - - index = self.ico.getentryindex(self.size) - sizes = list(self.info["sizes"]) - sizes[index] = im.size - self.info["sizes"] = set(sizes) - - self.size = im.size - - def load_seek(self, pos): - # Flag the ImageFile.Parser so that it - # just does all the decode at the end. - pass - - -# -# -------------------------------------------------------------------- - - -Image.register_open(IcoImageFile.format, IcoImageFile, _accept) -Image.register_save(IcoImageFile.format, _save) -Image.register_extension(IcoImageFile.format, ".ico") - -Image.register_mime(IcoImageFile.format, "image/x-icon") diff --git a/.flatpak-builder/cache/objects/84/ec9c62ede3093d9a93d7317b6d1faf4437564ef781f5948d59dd5d5a97530c.file b/.flatpak-builder/cache/objects/84/ec9c62ede3093d9a93d7317b6d1faf4437564ef781f5948d59dd5d5a97530c.file deleted file mode 100644 index c5f1a49..0000000 --- a/.flatpak-builder/cache/objects/84/ec9c62ede3093d9a93d7317b6d1faf4437564ef781f5948d59dd5d5a97530c.file +++ /dev/null @@ -1,69 +0,0 @@ -# main.py -# -# Copyright 2024 Unknown -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# SPDX-License-Identifier: GPL-3.0-or-later - -import sys -import gi - -gi.require_version('Gtk', '4.0') -gi.require_version('Adw', '1') - -from gi.repository import Gtk, Gio, Adw -from .window import AlpacaWindow - -class AlpacaApplication(Adw.Application): - """The main application singleton class.""" - - def __init__(self): - super().__init__(application_id='com.jeffser.Alpaca', - flags=Gio.ApplicationFlags.DEFAULT_FLAGS) - self.create_action('quit', lambda *_: self.quit(), ['q']) - self.create_action('clear', lambda *_: AlpacaWindow.clear_conversation_dialog(self.props.active_window), ['e']) - self.create_action('reconnect', lambda *_: AlpacaWindow.show_connection_dialog(self.props.active_window), ['r']) - self.create_action('about', self.on_about_action) - - def do_activate(self): - win = self.props.active_window - if not win: - win = AlpacaWindow(application=self) - win.present() - - def on_about_action(self, widget, _): - about = Adw.AboutWindow(transient_for=self.props.active_window, - application_name='Alpaca', - application_icon='com.jeffser.Alpaca', - developer_name='Jeffry Samuel Eduarte Rojas', - version='0.4.0', - developers=['Jeffser https://jeffser.com'], - designers=['Jeffser https://jeffser.com'], - translator_credits='Alex K (Russian) https://github.com/alexkdeveloper', - copyright='© 2024 Jeffser', - issue_url='https://github.com/Jeffser/Alpaca/issues') - about.present() - - def create_action(self, name, callback, shortcuts=None): - action = Gio.SimpleAction.new(name, None) - action.connect("activate", callback) - self.add_action(action) - if shortcuts: - self.set_accels_for_action(f"app.{name}", shortcuts) - - -def main(version): - app = AlpacaApplication() - return app.run(sys.argv) diff --git a/.flatpak-builder/cache/objects/85/aa6c39a7f49553e9423feac13f87062e15f679b8db95194288f8172dd9f022.file b/.flatpak-builder/cache/objects/85/aa6c39a7f49553e9423feac13f87062e15f679b8db95194288f8172dd9f022.file deleted file mode 100644 index 7572bfd..0000000 --- a/.flatpak-builder/cache/objects/85/aa6c39a7f49553e9423feac13f87062e15f679b8db95194288f8172dd9f022.file +++ /dev/null @@ -1,529 +0,0 @@ -from __future__ import annotations - -import email -import logging -import random -import re -import time -import typing -from itertools import takewhile -from types import TracebackType - -from ..exceptions import ( - ConnectTimeoutError, - InvalidHeader, - MaxRetryError, - ProtocolError, - ProxyError, - ReadTimeoutError, - ResponseError, -) -from .util import reraise - -if typing.TYPE_CHECKING: - from ..connectionpool import ConnectionPool - from ..response import BaseHTTPResponse - -log = logging.getLogger(__name__) - - -# Data structure for representing the metadata of requests that result in a retry. -class RequestHistory(typing.NamedTuple): - method: str | None - url: str | None - error: Exception | None - status: int | None - redirect_location: str | None - - -class Retry: - """Retry configuration. - - Each retry attempt will create a new Retry object with updated values, so - they can be safely reused. - - Retries can be defined as a default for a pool: - - .. code-block:: python - - retries = Retry(connect=5, read=2, redirect=5) - http = PoolManager(retries=retries) - response = http.request("GET", "https://example.com/") - - Or per-request (which overrides the default for the pool): - - .. code-block:: python - - response = http.request("GET", "https://example.com/", retries=Retry(10)) - - Retries can be disabled by passing ``False``: - - .. code-block:: python - - response = http.request("GET", "https://example.com/", retries=False) - - Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless - retries are disabled, in which case the causing exception will be raised. - - :param int total: - Total number of retries to allow. Takes precedence over other counts. - - Set to ``None`` to remove this constraint and fall back on other - counts. - - Set to ``0`` to fail on the first retry. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int connect: - How many connection-related errors to retry on. - - These are errors raised before the request is sent to the remote server, - which we assume has not triggered the server to process the request. - - Set to ``0`` to fail on the first retry of this type. - - :param int read: - How many times to retry on read errors. - - These errors are raised after the request was sent to the server, so the - request may have side-effects. - - Set to ``0`` to fail on the first retry of this type. - - :param int redirect: - How many redirects to perform. Limit this to avoid infinite redirect - loops. - - A redirect is a HTTP response with a status code 301, 302, 303, 307 or - 308. - - Set to ``0`` to fail on the first retry of this type. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int status: - How many times to retry on bad status codes. - - These are retries made on responses, where status code matches - ``status_forcelist``. - - Set to ``0`` to fail on the first retry of this type. - - :param int other: - How many times to retry on other errors. - - Other errors are errors that are not connect, read, redirect or status errors. - These errors might be raised after the request was sent to the server, so the - request might have side-effects. - - Set to ``0`` to fail on the first retry of this type. - - If ``total`` is not set, it's a good idea to set this to 0 to account - for unexpected edge cases and avoid infinite retry loops. - - :param Collection allowed_methods: - Set of uppercased HTTP method verbs that we should retry on. - - By default, we only retry on methods which are considered to be - idempotent (multiple requests with the same parameters end with the - same state). See :attr:`Retry.DEFAULT_ALLOWED_METHODS`. - - Set to a ``None`` value to retry on any verb. - - :param Collection status_forcelist: - A set of integer HTTP status codes that we should force a retry on. - A retry is initiated if the request method is in ``allowed_methods`` - and the response status code is in ``status_forcelist``. - - By default, this is disabled with ``None``. - - :param float backoff_factor: - A backoff factor to apply between attempts after the second try - (most errors are resolved immediately by a second try without a - delay). urllib3 will sleep for:: - - {backoff factor} * (2 ** ({number of previous retries})) - - seconds. If `backoff_jitter` is non-zero, this sleep is extended by:: - - random.uniform(0, {backoff jitter}) - - seconds. For example, if the backoff_factor is 0.1, then :func:`Retry.sleep` will - sleep for [0.0s, 0.2s, 0.4s, 0.8s, ...] between retries. No backoff will ever - be longer than `backoff_max`. - - By default, backoff is disabled (factor set to 0). - - :param bool raise_on_redirect: Whether, if the number of redirects is - exhausted, to raise a MaxRetryError, or to return a response with a - response code in the 3xx range. - - :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: - whether we should raise an exception, or return a response, - if status falls in ``status_forcelist`` range and retries have - been exhausted. - - :param tuple history: The history of the request encountered during - each call to :meth:`~Retry.increment`. The list is in the order - the requests occurred. Each list item is of class :class:`RequestHistory`. - - :param bool respect_retry_after_header: - Whether to respect Retry-After header on status codes defined as - :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. - - :param Collection remove_headers_on_redirect: - Sequence of headers to remove from the request when a response - indicating a redirect is returned before firing off the redirected - request. - """ - - #: Default methods to be used for ``allowed_methods`` - DEFAULT_ALLOWED_METHODS = frozenset( - ["HEAD", "GET", "PUT", "DELETE", "OPTIONS", "TRACE"] - ) - - #: Default status codes to be used for ``status_forcelist`` - RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) - - #: Default headers to be used for ``remove_headers_on_redirect`` - DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset(["Cookie", "Authorization"]) - - #: Default maximum backoff time. - DEFAULT_BACKOFF_MAX = 120 - - # Backward compatibility; assigned outside of the class. - DEFAULT: typing.ClassVar[Retry] - - def __init__( - self, - total: bool | int | None = 10, - connect: int | None = None, - read: int | None = None, - redirect: bool | int | None = None, - status: int | None = None, - other: int | None = None, - allowed_methods: typing.Collection[str] | None = DEFAULT_ALLOWED_METHODS, - status_forcelist: typing.Collection[int] | None = None, - backoff_factor: float = 0, - backoff_max: float = DEFAULT_BACKOFF_MAX, - raise_on_redirect: bool = True, - raise_on_status: bool = True, - history: tuple[RequestHistory, ...] | None = None, - respect_retry_after_header: bool = True, - remove_headers_on_redirect: typing.Collection[ - str - ] = DEFAULT_REMOVE_HEADERS_ON_REDIRECT, - backoff_jitter: float = 0.0, - ) -> None: - self.total = total - self.connect = connect - self.read = read - self.status = status - self.other = other - - if redirect is False or total is False: - redirect = 0 - raise_on_redirect = False - - self.redirect = redirect - self.status_forcelist = status_forcelist or set() - self.allowed_methods = allowed_methods - self.backoff_factor = backoff_factor - self.backoff_max = backoff_max - self.raise_on_redirect = raise_on_redirect - self.raise_on_status = raise_on_status - self.history = history or () - self.respect_retry_after_header = respect_retry_after_header - self.remove_headers_on_redirect = frozenset( - h.lower() for h in remove_headers_on_redirect - ) - self.backoff_jitter = backoff_jitter - - def new(self, **kw: typing.Any) -> Retry: - params = dict( - total=self.total, - connect=self.connect, - read=self.read, - redirect=self.redirect, - status=self.status, - other=self.other, - allowed_methods=self.allowed_methods, - status_forcelist=self.status_forcelist, - backoff_factor=self.backoff_factor, - backoff_max=self.backoff_max, - raise_on_redirect=self.raise_on_redirect, - raise_on_status=self.raise_on_status, - history=self.history, - remove_headers_on_redirect=self.remove_headers_on_redirect, - respect_retry_after_header=self.respect_retry_after_header, - backoff_jitter=self.backoff_jitter, - ) - - params.update(kw) - return type(self)(**params) # type: ignore[arg-type] - - @classmethod - def from_int( - cls, - retries: Retry | bool | int | None, - redirect: bool | int | None = True, - default: Retry | bool | int | None = None, - ) -> Retry: - """Backwards-compatibility for the old retries format.""" - if retries is None: - retries = default if default is not None else cls.DEFAULT - - if isinstance(retries, Retry): - return retries - - redirect = bool(redirect) and None - new_retries = cls(retries, redirect=redirect) - log.debug("Converted retries value: %r -> %r", retries, new_retries) - return new_retries - - def get_backoff_time(self) -> float: - """Formula for computing the current backoff - - :rtype: float - """ - # We want to consider only the last consecutive errors sequence (Ignore redirects). - consecutive_errors_len = len( - list( - takewhile(lambda x: x.redirect_location is None, reversed(self.history)) - ) - ) - if consecutive_errors_len <= 1: - return 0 - - backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) - if self.backoff_jitter != 0.0: - backoff_value += random.random() * self.backoff_jitter - return float(max(0, min(self.backoff_max, backoff_value))) - - def parse_retry_after(self, retry_after: str) -> float: - seconds: float - # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 - if re.match(r"^\s*[0-9]+\s*$", retry_after): - seconds = int(retry_after) - else: - retry_date_tuple = email.utils.parsedate_tz(retry_after) - if retry_date_tuple is None: - raise InvalidHeader(f"Invalid Retry-After header: {retry_after}") - - retry_date = email.utils.mktime_tz(retry_date_tuple) - seconds = retry_date - time.time() - - seconds = max(seconds, 0) - - return seconds - - def get_retry_after(self, response: BaseHTTPResponse) -> float | None: - """Get the value of Retry-After in seconds.""" - - retry_after = response.headers.get("Retry-After") - - if retry_after is None: - return None - - return self.parse_retry_after(retry_after) - - def sleep_for_retry(self, response: BaseHTTPResponse) -> bool: - retry_after = self.get_retry_after(response) - if retry_after: - time.sleep(retry_after) - return True - - return False - - def _sleep_backoff(self) -> None: - backoff = self.get_backoff_time() - if backoff <= 0: - return - time.sleep(backoff) - - def sleep(self, response: BaseHTTPResponse | None = None) -> None: - """Sleep between retry attempts. - - This method will respect a server's ``Retry-After`` response header - and sleep the duration of the time requested. If that is not present, it - will use an exponential backoff. By default, the backoff factor is 0 and - this method will return immediately. - """ - - if self.respect_retry_after_header and response: - slept = self.sleep_for_retry(response) - if slept: - return - - self._sleep_backoff() - - def _is_connection_error(self, err: Exception) -> bool: - """Errors when we're fairly sure that the server did not receive the - request, so it should be safe to retry. - """ - if isinstance(err, ProxyError): - err = err.original_error - return isinstance(err, ConnectTimeoutError) - - def _is_read_error(self, err: Exception) -> bool: - """Errors that occur after the request has been started, so we should - assume that the server began processing it. - """ - return isinstance(err, (ReadTimeoutError, ProtocolError)) - - def _is_method_retryable(self, method: str) -> bool: - """Checks if a given HTTP method should be retried upon, depending if - it is included in the allowed_methods - """ - if self.allowed_methods and method.upper() not in self.allowed_methods: - return False - return True - - def is_retry( - self, method: str, status_code: int, has_retry_after: bool = False - ) -> bool: - """Is this method/status code retryable? (Based on allowlists and control - variables such as the number of total retries to allow, whether to - respect the Retry-After header, whether this header is present, and - whether the returned status code is on the list of status codes to - be retried upon on the presence of the aforementioned header) - """ - if not self._is_method_retryable(method): - return False - - if self.status_forcelist and status_code in self.status_forcelist: - return True - - return bool( - self.total - and self.respect_retry_after_header - and has_retry_after - and (status_code in self.RETRY_AFTER_STATUS_CODES) - ) - - def is_exhausted(self) -> bool: - """Are we out of retries?""" - retry_counts = [ - x - for x in ( - self.total, - self.connect, - self.read, - self.redirect, - self.status, - self.other, - ) - if x - ] - if not retry_counts: - return False - - return min(retry_counts) < 0 - - def increment( - self, - method: str | None = None, - url: str | None = None, - response: BaseHTTPResponse | None = None, - error: Exception | None = None, - _pool: ConnectionPool | None = None, - _stacktrace: TracebackType | None = None, - ) -> Retry: - """Return a new Retry object with incremented retry counters. - - :param response: A response object, or None, if the server did not - return a response. - :type response: :class:`~urllib3.response.BaseHTTPResponse` - :param Exception error: An error encountered during the request, or - None if the response was received successfully. - - :return: A new ``Retry`` object. - """ - if self.total is False and error: - # Disabled, indicate to re-raise the error. - raise reraise(type(error), error, _stacktrace) - - total = self.total - if total is not None: - total -= 1 - - connect = self.connect - read = self.read - redirect = self.redirect - status_count = self.status - other = self.other - cause = "unknown" - status = None - redirect_location = None - - if error and self._is_connection_error(error): - # Connect retry? - if connect is False: - raise reraise(type(error), error, _stacktrace) - elif connect is not None: - connect -= 1 - - elif error and self._is_read_error(error): - # Read retry? - if read is False or method is None or not self._is_method_retryable(method): - raise reraise(type(error), error, _stacktrace) - elif read is not None: - read -= 1 - - elif error: - # Other retry? - if other is not None: - other -= 1 - - elif response and response.get_redirect_location(): - # Redirect retry? - if redirect is not None: - redirect -= 1 - cause = "too many redirects" - response_redirect_location = response.get_redirect_location() - if response_redirect_location: - redirect_location = response_redirect_location - status = response.status - - else: - # Incrementing because of a server error like a 500 in - # status_forcelist and the given method is in the allowed_methods - cause = ResponseError.GENERIC_ERROR - if response and response.status: - if status_count is not None: - status_count -= 1 - cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status) - status = response.status - - history = self.history + ( - RequestHistory(method, url, error, status, redirect_location), - ) - - new_retry = self.new( - total=total, - connect=connect, - read=read, - redirect=redirect, - status=status_count, - other=other, - history=history, - ) - - if new_retry.is_exhausted(): - reason = error or ResponseError(cause) - raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] - - log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) - - return new_retry - - def __repr__(self) -> str: - return ( - f"{type(self).__name__}(total={self.total}, connect={self.connect}, " - f"read={self.read}, redirect={self.redirect}, status={self.status})" - ) - - -# For backwards compatibility (equivalent to pre-v1.9): -Retry.DEFAULT = Retry(3) diff --git a/.flatpak-builder/cache/objects/85/b2f885336829dd8f2ac2bc1b9dd2d985848dbaea9fb1a63b73a6e99317e994.file b/.flatpak-builder/cache/objects/85/b2f885336829dd8f2ac2bc1b9dd2d985848dbaea9fb1a63b73a6e99317e994.file deleted file mode 100644 index a30d78e06040e8437fee4c7840f39457ceac5af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1214 zcmZWo&1)M+6rb4-*3T$%kgo? zLfqg3Y#2QY4v5NwYf$uo=n_0=0<=KyeM{1{2FGMPjBU>;;Hg2Nk&e#VpvTcDqS4vPT0C`1W*U~l6D*U?YL zPHqXkLfnRwYotcytJG$jtR;n7mXM=sRT{_DX1H37+p-b0u2rsFsftjtFJtPj(K-{= zjOVImpc1!_oS7i>r5~-wvs;$}R-+qD=^bZhnvqYNVz%;s$t0{KE&_DWVctD{_R8J) z-qllg2wCLf)c*GF-GwE+Tkb%Jj{>CQXO`dvh)sZs3jiI|*FAr|4$a==-M8RbuKw6p ztY(q}BM&-!0Q%EbOg#hTFKMUu&3%z@t`F`QtkGFrg-SeL= z?ks{kQW&6|J^e@i{T9cwP|sp2yW3^)1kQd+)X!jm{kZ w^s~GKb!vj*Yk+}?F&-EWwgyPS1>_XFg^oSQVSE|(nZZYSe13pF1ig*_099Z=D*ylh diff --git a/.flatpak-builder/cache/objects/86/36899390b825d1987bc2f2f3d9b688cd9f7cb280675f5be84cfc81d3b9db39.file b/.flatpak-builder/cache/objects/86/36899390b825d1987bc2f2f3d9b688cd9f7cb280675f5be84cfc81d3b9db39.file deleted file mode 100644 index 296cb234419d896d088f992fd1d4e9e57aa4d599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29657 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 diff --git a/.flatpak-builder/cache/objects/86/bded9fddedc4ad138c48df7dd361d02e8083456e0c6b7ec70d07533d503aee.file b/.flatpak-builder/cache/objects/86/bded9fddedc4ad138c48df7dd361d02e8083456e0c6b7ec70d07533d503aee.file deleted file mode 100644 index 70c78d1028cdc708dd9ffb277d139f27b8b8106e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16169 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 adcWKx@O{gO8u)U^6!2bou`I6QE diff --git a/.flatpak-builder/cache/objects/86/f6dfa279c125a269c71b93c589c1f3a1c817f3b507cd3c768611fcc23dfb60.dirtree b/.flatpak-builder/cache/objects/86/f6dfa279c125a269c71b93c589c1f3a1c817f3b507cd3c768611fcc23dfb60.dirtree deleted file mode 100644 index b440d5c60c5a97d65631121e2d50f0422cb401b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmXRa&0`4B7MUKsseAE)4cdaP2j|c7dnx!bE+Wr5V|qrZf$+R|7S){0B!)Z_?m7QA zSIwBS)aBXk3ND?B39|N^%`M7W1sAi4uU{bRlEwE?y5?Z|=WWbSTaUkcx2^Qo5}~Va Yioa=gyyngc=}=)Q$t|FQDQ-P#0BdPdn*aa+ diff --git a/.flatpak-builder/cache/objects/87/9b98bc4a6a4bee5b5ba6cc99f9acb2e878509e917c47bf980864aa7577d646.commit b/.flatpak-builder/cache/objects/87/9b98bc4a6a4bee5b5ba6cc99f9acb2e878509e917c47bf980864aa7577d646.commit deleted file mode 100644 index 960a513bcb190d792c27fd6e7f9bbaf5868a7fb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2180 zcmV-~2z&QqXkl(=WpjD}000000000ViwFP!000001GSrbY*SSn$2<0Zzc)5E_F!XU zTif-qH;I{Bw-wf{TML`<(cIp9ZhNxc2lw8xl}OaY#Hc9YA3`8Lh%sVBjfsXBVlbix z{R4dcp@e@RCdyv~4F-fn+r3;bLwZhs`>*Tn_jArY=XYM;Uk{H%NHvGB-^?L@IAGx8 z|BiiH?>n;`(Snj_Gg&MT`L|ic8ZycZJI4f&O7yVV?Hnf-n0;7a0$2=~*rmseHjBl$ z(A(|nwi`oO3@;c1V%VfgrU$-oVtiImH@XO3+vpMmMhk9u8ImGzcp=){hLtdn{4yn6 zmBI>()_k2{sQ+(;9_9EENz_K7Pn+aO!m5z$j5ZZ=hr-eJA`uF-!Z5FRw6LE}JrsRK z28&2>PLim?3SDu->;k2bQ|W{bnO3-fc`p-C2_z#}qbzJBgeisOAvz*c_Q8mTD3zmr z%6J*&7IlPgIEs17;;$7 zlWJVCeHf`m;)q+pwYV1}6it#x>hgp`E+cP-DdG*N^9Rm+7b8^}fdk}jEY zp>(N~Cjz&JaAl#}w?tKxOSzlnXoWOqGB@p^!_86dBcnn$qo_m+p&KtSl)GfNNEw@M znYIU2+8&GyvMf?b#`}~+c{cI{XoWK75M^I@!Xll}%aEPHy#a=@Ak0&SbxcWkB%WbH zG<(Szv2huF<2=w`|h&7*&NFp#;B$UVzmSKa)=cACs zd1z~_y=VnkDqOs|20;|SiR;*L0NAxY9Rx1kzyl!aoIMC)yyXW#)Ompr#1)eefTed2 zA&~L5A_Ng|IO~i^2%^rR1VHMnO9bDPzAv1 zomLQ}1WgpcfzhwQKuc~e7)=0VE&9Juw8i5)B+Lp%Td|U%cuD`503a@>K_E!5 z2N!+f1OgeKQ2`->T6b=6dq|g@fgvtuZ6IL!bPfblgdWGb1P}yK1&_p)lo0?+mrDX5 z>XJ+l#QU;O5YYIv6aaB4Uj+e*Ph>$5br~)oB$Uw`mlK2F>5^p-NCCP5*GaEIQ2o&J z*DUyqxSFX0VJ)ZdAXt7ZGD-vl#UWWiECX}A_Gxoi)R5xivB<%!#y%|~>n^KMqrw^v zfq?cSMa2?GjPZ!k!qI~b1WQ4(q|hJIm!pax$NXRL5Qwml(Dfr?o*coXngp&W(I6>m z^6;BX6hw-8By!)0ib+$KMD9h=K`CnU@C#H46LqsB!Pr@z3<(sAa~{F-D^nYRB$4}H zWH5s6S)D%OT=e(HnSbFrqOcA@rCZR1vL>sMO~>Yk`ORrgojQ2mkmtM#UagALy{R5o&rA2t5d zxO>})ZNG1`H9g<-ebd%v+uaqyS_gN$yyNl?W7{)r z7u)LFmG*P(r5&i_Oh>kHkMSMj9pi-QP1AMLfcaJPWpi8S!Olya&6at~H6%vt6|r?GgKV`z?E0*MY7Nx>CA(yI<=5yt}Mtyys-k<(`gSzV}$~h2FcpV||gn z(|uR^^83g7U+Mp@zieRdz=?q?1I;_}&VK>ng0!VIJ^%m!VR;Dv0001TWo>VEVQh1H z000000000ViwFP!0000010~Br3cw%?MA2SIL+~=)1siM)ii)NSZ{I+718@EiWid2kG&V6bF=J#kVqrHlW@ceBVliQ6WH~fpVKp{1Ha2BqF*h&( zLUn0ubRckfbZBpGGc9mwY;13L3IG5A0001HNdh&XXLl4l0k(T|j|>)t_FKV##krY7X%me8Fe)wgcsb$L{X7b^4?d)$DWjDTwO}Y*dI?2rmd32-pYM G2e=0@Ip-Dt diff --git a/.flatpak-builder/cache/objects/87/a302bdd88b3152c89882a7b51be17ea45140265458e6b82c317d5b756bb640.file b/.flatpak-builder/cache/objects/87/a302bdd88b3152c89882a7b51be17ea45140265458e6b82c317d5b756bb640.file deleted file mode 100644 index 4cfea68..0000000 --- a/.flatpak-builder/cache/objects/87/a302bdd88b3152c89882a7b51be17ea45140265458e6b82c317d5b756bb640.file +++ /dev/null @@ -1,176 +0,0 @@ -Metadata-Version: 2.1 -Name: pillow -Version: 10.3.0 -Summary: Python Imaging Library (Fork) -Author-email: "Jeffrey A. Clark" -License: HPND -Project-URL: Changelog, https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst -Project-URL: Documentation, https://pillow.readthedocs.io -Project-URL: Funding, https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=pypi -Project-URL: Homepage, https://python-pillow.org -Project-URL: Mastodon, https://fosstodon.org/@pillow -Project-URL: Release notes, https://pillow.readthedocs.io/en/stable/releasenotes/index.html -Project-URL: Source, https://github.com/python-pillow/Pillow -Keywords: Imaging -Classifier: Development Status :: 6 - Mature -Classifier: License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND) -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Multimedia :: Graphics -Classifier: Topic :: Multimedia :: Graphics :: Capture :: Digital Camera -Classifier: Topic :: Multimedia :: Graphics :: Capture :: Screen Capture -Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion -Classifier: Topic :: Multimedia :: Graphics :: Viewers -Classifier: Typing :: Typed -Requires-Python: >=3.8 -Description-Content-Type: text/markdown -License-File: LICENSE -Provides-Extra: docs -Requires-Dist: furo ; extra == 'docs' -Requires-Dist: olefile ; extra == 'docs' -Requires-Dist: sphinx >=2.4 ; extra == 'docs' -Requires-Dist: sphinx-copybutton ; extra == 'docs' -Requires-Dist: sphinx-inline-tabs ; extra == 'docs' -Requires-Dist: sphinx-removed-in ; extra == 'docs' -Requires-Dist: sphinxext-opengraph ; extra == 'docs' -Provides-Extra: fpx -Requires-Dist: olefile ; extra == 'fpx' -Provides-Extra: mic -Requires-Dist: olefile ; extra == 'mic' -Provides-Extra: tests -Requires-Dist: check-manifest ; extra == 'tests' -Requires-Dist: coverage ; extra == 'tests' -Requires-Dist: defusedxml ; extra == 'tests' -Requires-Dist: markdown2 ; extra == 'tests' -Requires-Dist: olefile ; extra == 'tests' -Requires-Dist: packaging ; extra == 'tests' -Requires-Dist: pyroma ; extra == 'tests' -Requires-Dist: pytest ; extra == 'tests' -Requires-Dist: pytest-cov ; extra == 'tests' -Requires-Dist: pytest-timeout ; extra == 'tests' -Provides-Extra: typing -Requires-Dist: typing-extensions ; (python_version < "3.10") and extra == 'typing' -Provides-Extra: xmp -Requires-Dist: defusedxml ; extra == 'xmp' - -

- Pillow logo -

- -# Pillow - -## Python Imaging Library (Fork) - -Pillow is the friendly PIL fork by [Jeffrey A. Clark and -contributors](https://github.com/python-pillow/Pillow/graphs/contributors). -PIL is the Python Imaging Library by Fredrik Lundh and contributors. -As of 2019, Pillow development is -[supported by Tidelift](https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=readme&utm_campaign=enterprise). - - - - - - - - - - - - - - - - - - -
docs - Documentation Status -
tests - GitHub Actions build status (Lint) - GitHub Actions build status (Test Linux and macOS) - GitHub Actions build status (Test Windows) - GitHub Actions build status (Test MinGW) - GitHub Actions build status (Test Cygwin) - GitHub Actions build status (Test Docker) - AppVeyor CI build status (Windows) - GitHub Actions build status (Wheels) - Code coverage - Fuzzing Status -
package - Zenodo - Tidelift - Newest PyPI version - Number of PyPI downloads - OpenSSF Best Practices -
social - Join the chat at https://gitter.im/python-pillow/Pillow - Follow on https://fosstodon.org/@pillow -
- -## Overview - -The Python Imaging Library adds image processing capabilities to your Python interpreter. - -This library provides extensive file format support, an efficient internal representation, and fairly powerful image processing capabilities. - -The core image library is designed for fast access to data stored in a few basic pixel formats. It should provide a solid foundation for a general image processing tool. - -## More Information - -- [Documentation](https://pillow.readthedocs.io/) - - [Installation](https://pillow.readthedocs.io/en/latest/installation.html) - - [Handbook](https://pillow.readthedocs.io/en/latest/handbook/index.html) -- [Contribute](https://github.com/python-pillow/Pillow/blob/main/.github/CONTRIBUTING.md) - - [Issues](https://github.com/python-pillow/Pillow/issues) - - [Pull requests](https://github.com/python-pillow/Pillow/pulls) -- [Release notes](https://pillow.readthedocs.io/en/stable/releasenotes/index.html) -- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - - [Pre-fork](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst#pre-fork) - -## Report a Vulnerability - -To report a security vulnerability, please follow the procedure described in the [Tidelift security policy](https://tidelift.com/docs/security). diff --git a/.flatpak-builder/cache/objects/87/adc4d2eb414d438bf0c5cdabec6a84325c46421d607f8c9f2ffa9ed6839017.file b/.flatpak-builder/cache/objects/87/adc4d2eb414d438bf0c5cdabec6a84325c46421d607f8c9f2ffa9ed6839017.file deleted file mode 100644 index 303b4ee..0000000 --- a/.flatpak-builder/cache/objects/87/adc4d2eb414d438bf0c5cdabec6a84325c46421d607f8c9f2ffa9ed6839017.file +++ /dev/null @@ -1,276 +0,0 @@ -from __future__ import annotations - -import json as _json -import logging -import typing -from contextlib import contextmanager -from dataclasses import dataclass -from http.client import HTTPException as HTTPException -from io import BytesIO, IOBase - -from ...exceptions import InvalidHeader, TimeoutError -from ...response import BaseHTTPResponse -from ...util.retry import Retry -from .request import EmscriptenRequest - -if typing.TYPE_CHECKING: - from ..._base_connection import BaseHTTPConnection, BaseHTTPSConnection - -log = logging.getLogger(__name__) - - -@dataclass -class EmscriptenResponse: - status_code: int - headers: dict[str, str] - body: IOBase | bytes - request: EmscriptenRequest - - -class EmscriptenHttpResponseWrapper(BaseHTTPResponse): - def __init__( - self, - internal_response: EmscriptenResponse, - url: str | None = None, - connection: BaseHTTPConnection | BaseHTTPSConnection | None = None, - ): - self._pool = None # set by pool class - self._body = None - self._response = internal_response - self._url = url - self._connection = connection - self._closed = False - super().__init__( - headers=internal_response.headers, - status=internal_response.status_code, - request_url=url, - version=0, - reason="", - decode_content=True, - ) - self.length_remaining = self._init_length(self._response.request.method) - self.length_is_certain = False - - @property - def url(self) -> str | None: - return self._url - - @url.setter - def url(self, url: str | None) -> None: - self._url = url - - @property - def connection(self) -> BaseHTTPConnection | BaseHTTPSConnection | None: - return self._connection - - @property - def retries(self) -> Retry | None: - return self._retries - - @retries.setter - def retries(self, retries: Retry | None) -> None: - # Override the request_url if retries has a redirect location. - self._retries = retries - - def stream( - self, amt: int | None = 2**16, decode_content: bool | None = None - ) -> typing.Generator[bytes, None, None]: - """ - A generator wrapper for the read() method. A call will block until - ``amt`` bytes have been read from the connection or until the - connection is closed. - - :param amt: - How much of the content to read. The generator will return up to - much data per iteration, but may return less. This is particularly - likely when using compressed data. However, the empty string will - never be returned. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - while True: - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data - else: - break - - def _init_length(self, request_method: str | None) -> int | None: - length: int | None - content_length: str | None = self.headers.get("content-length") - - if content_length is not None: - try: - # RFC 7230 section 3.3.2 specifies multiple content lengths can - # be sent in a single Content-Length header - # (e.g. Content-Length: 42, 42). This line ensures the values - # are all valid ints and that as long as the `set` length is 1, - # all values are the same. Otherwise, the header is invalid. - lengths = {int(val) for val in content_length.split(",")} - if len(lengths) > 1: - raise InvalidHeader( - "Content-Length contained multiple " - "unmatching values (%s)" % content_length - ) - length = lengths.pop() - except ValueError: - length = None - else: - if length < 0: - length = None - - else: # if content_length is None - length = None - - # Check for responses that shouldn't include a body - if ( - self.status in (204, 304) - or 100 <= self.status < 200 - or request_method == "HEAD" - ): - length = 0 - - return length - - def read( - self, - amt: int | None = None, - decode_content: bool | None = None, # ignored because browser decodes always - cache_content: bool = False, - ) -> bytes: - if ( - self._closed - or self._response is None - or (isinstance(self._response.body, IOBase) and self._response.body.closed) - ): - return b"" - - with self._error_catcher(): - # body has been preloaded as a string by XmlHttpRequest - if not isinstance(self._response.body, IOBase): - self.length_remaining = len(self._response.body) - self.length_is_certain = True - # wrap body in IOStream - self._response.body = BytesIO(self._response.body) - if amt is not None: - # don't cache partial content - cache_content = False - data = self._response.body.read(amt) - if self.length_remaining is not None: - self.length_remaining = max(self.length_remaining - len(data), 0) - if (self.length_is_certain and self.length_remaining == 0) or len( - data - ) < amt: - # definitely finished reading, close response stream - self._response.body.close() - return typing.cast(bytes, data) - else: # read all we can (and cache it) - data = self._response.body.read() - if cache_content: - self._body = data - if self.length_remaining is not None: - self.length_remaining = max(self.length_remaining - len(data), 0) - if len(data) == 0 or ( - self.length_is_certain and self.length_remaining == 0 - ): - # definitely finished reading, close response stream - self._response.body.close() - return typing.cast(bytes, data) - - def read_chunked( - self, - amt: int | None = None, - decode_content: bool | None = None, - ) -> typing.Generator[bytes, None, None]: - # chunked is handled by browser - while True: - bytes = self.read(amt, decode_content) - if not bytes: - break - yield bytes - - def release_conn(self) -> None: - if not self._pool or not self._connection: - return None - - self._pool._put_conn(self._connection) - self._connection = None - - def drain_conn(self) -> None: - self.close() - - @property - def data(self) -> bytes: - if self._body: - return self._body - else: - return self.read(cache_content=True) - - def json(self) -> typing.Any: - """ - Parses the body of the HTTP response as JSON. - - To use a custom JSON decoder pass the result of :attr:`HTTPResponse.data` to the decoder. - - This method can raise either `UnicodeDecodeError` or `json.JSONDecodeError`. - - Read more :ref:`here `. - """ - data = self.data.decode("utf-8") - return _json.loads(data) - - def close(self) -> None: - if not self._closed: - if isinstance(self._response.body, IOBase): - self._response.body.close() - if self._connection: - self._connection.close() - self._connection = None - self._closed = True - - @contextmanager - def _error_catcher(self) -> typing.Generator[None, None, None]: - """ - Catch Emscripten specific exceptions thrown by fetch.py, - instead re-raising urllib3 variants, so that low-level exceptions - are not leaked in the high-level api. - - On exit, release the connection back to the pool. - """ - from .fetch import _RequestError, _TimeoutError # avoid circular import - - clean_exit = False - - try: - yield - # If no exception is thrown, we should avoid cleaning up - # unnecessarily. - clean_exit = True - except _TimeoutError as e: - raise TimeoutError(str(e)) - except _RequestError as e: - raise HTTPException(str(e)) - finally: - # If we didn't terminate cleanly, we need to throw away our - # connection. - if not clean_exit: - # The response may not be closed but we're not going to use it - # anymore so close it now - if ( - isinstance(self._response.body, IOBase) - and not self._response.body.closed - ): - self._response.body.close() - # release the connection back to the pool - self.release_conn() - else: - # If we have read everything from the response stream, - # return the connection back to the pool. - if ( - isinstance(self._response.body, IOBase) - and self._response.body.closed - ): - self.release_conn() diff --git a/.flatpak-builder/cache/objects/87/fe1dbc05735fe46e13202bb9d939a7bd015aad96b360f55b7acda944b521d0.file b/.flatpak-builder/cache/objects/87/fe1dbc05735fe46e13202bb9d939a7bd015aad96b360f55b7acda944b521d0.file deleted file mode 100644 index aa5c547..0000000 --- a/.flatpak-builder/cache/objects/87/fe1dbc05735fe46e13202bb9d939a7bd015aad96b360f55b7acda944b521d0.file +++ /dev/null @@ -1,930 +0,0 @@ -from __future__ import annotations - -import datetime -import logging -import os -import re -import socket -import sys -import typing -import warnings -from http.client import HTTPConnection as _HTTPConnection -from http.client import HTTPException as HTTPException # noqa: F401 -from http.client import ResponseNotReady -from socket import timeout as SocketTimeout - -if typing.TYPE_CHECKING: - from typing import Literal - - from .response import HTTPResponse - from .util.ssl_ import _TYPE_PEER_CERT_RET_DICT - from .util.ssltransport import SSLTransport - -from ._collections import HTTPHeaderDict -from .util.response import assert_header_parsing -from .util.timeout import _DEFAULT_TIMEOUT, _TYPE_TIMEOUT, Timeout -from .util.util import to_str -from .util.wait import wait_for_read - -try: # Compiled with SSL? - import ssl - - BaseSSLError = ssl.SSLError -except (ImportError, AttributeError): - ssl = None # type: ignore[assignment] - - class BaseSSLError(BaseException): # type: ignore[no-redef] - pass - - -from ._base_connection import _TYPE_BODY -from ._base_connection import ProxyConfig as ProxyConfig -from ._base_connection import _ResponseOptions as _ResponseOptions -from ._version import __version__ -from .exceptions import ( - ConnectTimeoutError, - HeaderParsingError, - NameResolutionError, - NewConnectionError, - ProxyError, - SystemTimeWarning, -) -from .util import SKIP_HEADER, SKIPPABLE_HEADERS, connection, ssl_ -from .util.request import body_to_chunks -from .util.ssl_ import assert_fingerprint as _assert_fingerprint -from .util.ssl_ import ( - create_urllib3_context, - is_ipaddress, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, -) -from .util.ssl_match_hostname import CertificateError, match_hostname -from .util.url import Url - -# Not a no-op, we're adding this to the namespace so it can be imported. -ConnectionError = ConnectionError -BrokenPipeError = BrokenPipeError - - -log = logging.getLogger(__name__) - -port_by_scheme = {"http": 80, "https": 443} - -# When it comes time to update this value as a part of regular maintenance -# (ie test_recent_date is failing) update it to ~6 months before the current date. -RECENT_DATE = datetime.date(2023, 6, 1) - -_CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]") - -_HAS_SYS_AUDIT = hasattr(sys, "audit") - - -class HTTPConnection(_HTTPConnection): - """ - Based on :class:`http.client.HTTPConnection` but provides an extra constructor - backwards-compatibility layer between older and newer Pythons. - - Additional keyword parameters are used to configure attributes of the connection. - Accepted parameters include: - - - ``source_address``: Set the source address for the current connection. - - ``socket_options``: Set specific options on the underlying socket. If not specified, then - defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling - Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. - - For example, if you wish to enable TCP Keep Alive in addition to the defaults, - you might pass: - - .. code-block:: python - - HTTPConnection.default_socket_options + [ - (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), - ] - - Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). - """ - - default_port: typing.ClassVar[int] = port_by_scheme["http"] # type: ignore[misc] - - #: Disable Nagle's algorithm by default. - #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` - default_socket_options: typing.ClassVar[connection._TYPE_SOCKET_OPTIONS] = [ - (socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - ] - - #: Whether this connection verifies the host's certificate. - is_verified: bool = False - - #: Whether this proxy connection verified the proxy host's certificate. - # If no proxy is currently connected to the value will be ``None``. - proxy_is_verified: bool | None = None - - blocksize: int - source_address: tuple[str, int] | None - socket_options: connection._TYPE_SOCKET_OPTIONS | None - - _has_connected_to_proxy: bool - _response_options: _ResponseOptions | None - _tunnel_host: str | None - _tunnel_port: int | None - _tunnel_scheme: str | None - - def __init__( - self, - host: str, - port: int | None = None, - *, - timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, - source_address: tuple[str, int] | None = None, - blocksize: int = 16384, - socket_options: None - | (connection._TYPE_SOCKET_OPTIONS) = default_socket_options, - proxy: Url | None = None, - proxy_config: ProxyConfig | None = None, - ) -> None: - super().__init__( - host=host, - port=port, - timeout=Timeout.resolve_default_timeout(timeout), - source_address=source_address, - blocksize=blocksize, - ) - self.socket_options = socket_options - self.proxy = proxy - self.proxy_config = proxy_config - - self._has_connected_to_proxy = False - self._response_options = None - self._tunnel_host: str | None = None - self._tunnel_port: int | None = None - self._tunnel_scheme: str | None = None - - @property - def host(self) -> str: - """ - Getter method to remove any trailing dots that indicate the hostname is an FQDN. - - In general, SSL certificates don't include the trailing dot indicating a - fully-qualified domain name, and thus, they don't validate properly when - checked against a domain name that includes the dot. In addition, some - servers may not expect to receive the trailing dot when provided. - - However, the hostname with trailing dot is critical to DNS resolution; doing a - lookup with the trailing dot will properly only resolve the appropriate FQDN, - whereas a lookup without a trailing dot will search the system's search domain - list. Thus, it's important to keep the original host around for use only in - those cases where it's appropriate (i.e., when doing DNS lookup to establish the - actual TCP connection across which we're going to send HTTP requests). - """ - return self._dns_host.rstrip(".") - - @host.setter - def host(self, value: str) -> None: - """ - Setter for the `host` property. - - We assume that only urllib3 uses the _dns_host attribute; httplib itself - only uses `host`, and it seems reasonable that other libraries follow suit. - """ - self._dns_host = value - - def _new_conn(self) -> socket.socket: - """Establish a socket connection and set nodelay settings on it. - - :return: New socket connection. - """ - try: - sock = connection.create_connection( - (self._dns_host, self.port), - self.timeout, - source_address=self.source_address, - socket_options=self.socket_options, - ) - except socket.gaierror as e: - raise NameResolutionError(self.host, self, e) from e - except SocketTimeout as e: - raise ConnectTimeoutError( - self, - f"Connection to {self.host} timed out. (connect timeout={self.timeout})", - ) from e - - except OSError as e: - raise NewConnectionError( - self, f"Failed to establish a new connection: {e}" - ) from e - - # Audit hooks are only available in Python 3.8+ - if _HAS_SYS_AUDIT: - sys.audit("http.client.connect", self, self.host, self.port) - - return sock - - def set_tunnel( - self, - host: str, - port: int | None = None, - headers: typing.Mapping[str, str] | None = None, - scheme: str = "http", - ) -> None: - if scheme not in ("http", "https"): - raise ValueError( - f"Invalid proxy scheme for tunneling: {scheme!r}, must be either 'http' or 'https'" - ) - super().set_tunnel(host, port=port, headers=headers) - self._tunnel_scheme = scheme - - def connect(self) -> None: - self.sock = self._new_conn() - if self._tunnel_host: - # If we're tunneling it means we're connected to our proxy. - self._has_connected_to_proxy = True - - # TODO: Fix tunnel so it doesn't depend on self.sock state. - self._tunnel() # type: ignore[attr-defined] - - # If there's a proxy to be connected to we are fully connected. - # This is set twice (once above and here) due to forwarding proxies - # not using tunnelling. - self._has_connected_to_proxy = bool(self.proxy) - - if self._has_connected_to_proxy: - self.proxy_is_verified = False - - @property - def is_closed(self) -> bool: - return self.sock is None - - @property - def is_connected(self) -> bool: - if self.sock is None: - return False - return not wait_for_read(self.sock, timeout=0.0) - - @property - def has_connected_to_proxy(self) -> bool: - return self._has_connected_to_proxy - - @property - def proxy_is_forwarding(self) -> bool: - """ - Return True if a forwarding proxy is configured, else return False - """ - return bool(self.proxy) and self._tunnel_host is None - - def close(self) -> None: - try: - super().close() - finally: - # Reset all stateful properties so connection - # can be re-used without leaking prior configs. - self.sock = None - self.is_verified = False - self.proxy_is_verified = None - self._has_connected_to_proxy = False - self._response_options = None - self._tunnel_host = None - self._tunnel_port = None - self._tunnel_scheme = None - - def putrequest( - self, - method: str, - url: str, - skip_host: bool = False, - skip_accept_encoding: bool = False, - ) -> None: - """""" - # Empty docstring because the indentation of CPython's implementation - # is broken but we don't want this method in our documentation. - match = _CONTAINS_CONTROL_CHAR_RE.search(method) - if match: - raise ValueError( - f"Method cannot contain non-token characters {method!r} (found at least {match.group()!r})" - ) - - return super().putrequest( - method, url, skip_host=skip_host, skip_accept_encoding=skip_accept_encoding - ) - - def putheader(self, header: str, *values: str) -> None: # type: ignore[override] - """""" - if not any(isinstance(v, str) and v == SKIP_HEADER for v in values): - super().putheader(header, *values) - elif to_str(header.lower()) not in SKIPPABLE_HEADERS: - skippable_headers = "', '".join( - [str.title(header) for header in sorted(SKIPPABLE_HEADERS)] - ) - raise ValueError( - f"urllib3.util.SKIP_HEADER only supports '{skippable_headers}'" - ) - - # `request` method's signature intentionally violates LSP. - # urllib3's API is different from `http.client.HTTPConnection` and the subclassing is only incidental. - def request( # type: ignore[override] - self, - method: str, - url: str, - body: _TYPE_BODY | None = None, - headers: typing.Mapping[str, str] | None = None, - *, - chunked: bool = False, - preload_content: bool = True, - decode_content: bool = True, - enforce_content_length: bool = True, - ) -> None: - # Update the inner socket's timeout value to send the request. - # This only triggers if the connection is re-used. - if self.sock is not None: - self.sock.settimeout(self.timeout) - - # Store these values to be fed into the HTTPResponse - # object later. TODO: Remove this in favor of a real - # HTTP lifecycle mechanism. - - # We have to store these before we call .request() - # because sometimes we can still salvage a response - # off the wire even if we aren't able to completely - # send the request body. - self._response_options = _ResponseOptions( - request_method=method, - request_url=url, - preload_content=preload_content, - decode_content=decode_content, - enforce_content_length=enforce_content_length, - ) - - if headers is None: - headers = {} - header_keys = frozenset(to_str(k.lower()) for k in headers) - skip_accept_encoding = "accept-encoding" in header_keys - skip_host = "host" in header_keys - self.putrequest( - method, url, skip_accept_encoding=skip_accept_encoding, skip_host=skip_host - ) - - # Transform the body into an iterable of sendall()-able chunks - # and detect if an explicit Content-Length is doable. - chunks_and_cl = body_to_chunks(body, method=method, blocksize=self.blocksize) - chunks = chunks_and_cl.chunks - content_length = chunks_and_cl.content_length - - # When chunked is explicit set to 'True' we respect that. - if chunked: - if "transfer-encoding" not in header_keys: - self.putheader("Transfer-Encoding", "chunked") - else: - # Detect whether a framing mechanism is already in use. If so - # we respect that value, otherwise we pick chunked vs content-length - # depending on the type of 'body'. - if "content-length" in header_keys: - chunked = False - elif "transfer-encoding" in header_keys: - chunked = True - - # Otherwise we go off the recommendation of 'body_to_chunks()'. - else: - chunked = False - if content_length is None: - if chunks is not None: - chunked = True - self.putheader("Transfer-Encoding", "chunked") - else: - self.putheader("Content-Length", str(content_length)) - - # Now that framing headers are out of the way we send all the other headers. - if "user-agent" not in header_keys: - self.putheader("User-Agent", _get_default_user_agent()) - for header, value in headers.items(): - self.putheader(header, value) - self.endheaders() - - # If we're given a body we start sending that in chunks. - if chunks is not None: - for chunk in chunks: - # Sending empty chunks isn't allowed for TE: chunked - # as it indicates the end of the body. - if not chunk: - continue - if isinstance(chunk, str): - chunk = chunk.encode("utf-8") - if chunked: - self.send(b"%x\r\n%b\r\n" % (len(chunk), chunk)) - else: - self.send(chunk) - - # Regardless of whether we have a body or not, if we're in - # chunked mode we want to send an explicit empty chunk. - if chunked: - self.send(b"0\r\n\r\n") - - def request_chunked( - self, - method: str, - url: str, - body: _TYPE_BODY | None = None, - headers: typing.Mapping[str, str] | None = None, - ) -> None: - """ - Alternative to the common request method, which sends the - body with chunked encoding and not as one block - """ - warnings.warn( - "HTTPConnection.request_chunked() is deprecated and will be removed " - "in urllib3 v2.1.0. Instead use HTTPConnection.request(..., chunked=True).", - category=DeprecationWarning, - stacklevel=2, - ) - self.request(method, url, body=body, headers=headers, chunked=True) - - def getresponse( # type: ignore[override] - self, - ) -> HTTPResponse: - """ - Get the response from the server. - - If the HTTPConnection is in the correct state, returns an instance of HTTPResponse or of whatever object is returned by the response_class variable. - - If a request has not been sent or if a previous response has not be handled, ResponseNotReady is raised. If the HTTP response indicates that the connection should be closed, then it will be closed before the response is returned. When the connection is closed, the underlying socket is closed. - """ - # Raise the same error as http.client.HTTPConnection - if self._response_options is None: - raise ResponseNotReady() - - # Reset this attribute for being used again. - resp_options = self._response_options - self._response_options = None - - # Since the connection's timeout value may have been updated - # we need to set the timeout on the socket. - self.sock.settimeout(self.timeout) - - # This is needed here to avoid circular import errors - from .response import HTTPResponse - - # Get the response from http.client.HTTPConnection - httplib_response = super().getresponse() - - try: - assert_header_parsing(httplib_response.msg) - except (HeaderParsingError, TypeError) as hpe: - log.warning( - "Failed to parse headers (url=%s): %s", - _url_from_connection(self, resp_options.request_url), - hpe, - exc_info=True, - ) - - headers = HTTPHeaderDict(httplib_response.msg.items()) - - response = HTTPResponse( - body=httplib_response, - headers=headers, - status=httplib_response.status, - version=httplib_response.version, - reason=httplib_response.reason, - preload_content=resp_options.preload_content, - decode_content=resp_options.decode_content, - original_response=httplib_response, - enforce_content_length=resp_options.enforce_content_length, - request_method=resp_options.request_method, - request_url=resp_options.request_url, - ) - return response - - -class HTTPSConnection(HTTPConnection): - """ - Many of the parameters to this constructor are passed to the underlying SSL - socket by means of :py:func:`urllib3.util.ssl_wrap_socket`. - """ - - default_port = port_by_scheme["https"] # type: ignore[misc] - - cert_reqs: int | str | None = None - ca_certs: str | None = None - ca_cert_dir: str | None = None - ca_cert_data: None | str | bytes = None - ssl_version: int | str | None = None - ssl_minimum_version: int | None = None - ssl_maximum_version: int | None = None - assert_fingerprint: str | None = None - - def __init__( - self, - host: str, - port: int | None = None, - *, - timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, - source_address: tuple[str, int] | None = None, - blocksize: int = 16384, - socket_options: None - | (connection._TYPE_SOCKET_OPTIONS) = HTTPConnection.default_socket_options, - proxy: Url | None = None, - proxy_config: ProxyConfig | None = None, - cert_reqs: int | str | None = None, - assert_hostname: None | str | Literal[False] = None, - assert_fingerprint: str | None = None, - server_hostname: str | None = None, - ssl_context: ssl.SSLContext | None = None, - ca_certs: str | None = None, - ca_cert_dir: str | None = None, - ca_cert_data: None | str | bytes = None, - ssl_minimum_version: int | None = None, - ssl_maximum_version: int | None = None, - ssl_version: int | str | None = None, # Deprecated - cert_file: str | None = None, - key_file: str | None = None, - key_password: str | None = None, - ) -> None: - super().__init__( - host, - port=port, - timeout=timeout, - source_address=source_address, - blocksize=blocksize, - socket_options=socket_options, - proxy=proxy, - proxy_config=proxy_config, - ) - - self.key_file = key_file - self.cert_file = cert_file - self.key_password = key_password - self.ssl_context = ssl_context - self.server_hostname = server_hostname - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - self.ssl_version = ssl_version - self.ssl_minimum_version = ssl_minimum_version - self.ssl_maximum_version = ssl_maximum_version - self.ca_certs = ca_certs and os.path.expanduser(ca_certs) - self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) - self.ca_cert_data = ca_cert_data - - # cert_reqs depends on ssl_context so calculate last. - if cert_reqs is None: - if self.ssl_context is not None: - cert_reqs = self.ssl_context.verify_mode - else: - cert_reqs = resolve_cert_reqs(None) - self.cert_reqs = cert_reqs - - def set_cert( - self, - key_file: str | None = None, - cert_file: str | None = None, - cert_reqs: int | str | None = None, - key_password: str | None = None, - ca_certs: str | None = None, - assert_hostname: None | str | Literal[False] = None, - assert_fingerprint: str | None = None, - ca_cert_dir: str | None = None, - ca_cert_data: None | str | bytes = None, - ) -> None: - """ - This method should only be called once, before the connection is used. - """ - warnings.warn( - "HTTPSConnection.set_cert() is deprecated and will be removed " - "in urllib3 v2.1.0. Instead provide the parameters to the " - "HTTPSConnection constructor.", - category=DeprecationWarning, - stacklevel=2, - ) - - # If cert_reqs is not provided we'll assume CERT_REQUIRED unless we also - # have an SSLContext object in which case we'll use its verify_mode. - if cert_reqs is None: - if self.ssl_context is not None: - cert_reqs = self.ssl_context.verify_mode - else: - cert_reqs = resolve_cert_reqs(None) - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.key_password = key_password - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - self.ca_certs = ca_certs and os.path.expanduser(ca_certs) - self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) - self.ca_cert_data = ca_cert_data - - def connect(self) -> None: - sock: socket.socket | ssl.SSLSocket - self.sock = sock = self._new_conn() - server_hostname: str = self.host - tls_in_tls = False - - # Do we need to establish a tunnel? - if self._tunnel_host is not None: - # We're tunneling to an HTTPS origin so need to do TLS-in-TLS. - if self._tunnel_scheme == "https": - # _connect_tls_proxy will verify and assign proxy_is_verified - self.sock = sock = self._connect_tls_proxy(self.host, sock) - tls_in_tls = True - elif self._tunnel_scheme == "http": - self.proxy_is_verified = False - - # If we're tunneling it means we're connected to our proxy. - self._has_connected_to_proxy = True - - self._tunnel() # type: ignore[attr-defined] - # Override the host with the one we're requesting data from. - server_hostname = self._tunnel_host - - if self.server_hostname is not None: - server_hostname = self.server_hostname - - is_time_off = datetime.date.today() < RECENT_DATE - if is_time_off: - warnings.warn( - ( - f"System time is way off (before {RECENT_DATE}). This will probably " - "lead to SSL verification errors" - ), - SystemTimeWarning, - ) - - # Remove trailing '.' from fqdn hostnames to allow certificate validation - server_hostname_rm_dot = server_hostname.rstrip(".") - - sock_and_verified = _ssl_wrap_socket_and_match_hostname( - sock=sock, - cert_reqs=self.cert_reqs, - ssl_version=self.ssl_version, - ssl_minimum_version=self.ssl_minimum_version, - ssl_maximum_version=self.ssl_maximum_version, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - ca_cert_data=self.ca_cert_data, - cert_file=self.cert_file, - key_file=self.key_file, - key_password=self.key_password, - server_hostname=server_hostname_rm_dot, - ssl_context=self.ssl_context, - tls_in_tls=tls_in_tls, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint, - ) - self.sock = sock_and_verified.socket - - # Forwarding proxies can never have a verified target since - # the proxy is the one doing the verification. Should instead - # use a CONNECT tunnel in order to verify the target. - # See: https://github.com/urllib3/urllib3/issues/3267. - if self.proxy_is_forwarding: - self.is_verified = False - else: - self.is_verified = sock_and_verified.is_verified - - # If there's a proxy to be connected to we are fully connected. - # This is set twice (once above and here) due to forwarding proxies - # not using tunnelling. - self._has_connected_to_proxy = bool(self.proxy) - - # Set `self.proxy_is_verified` unless it's already set while - # establishing a tunnel. - if self._has_connected_to_proxy and self.proxy_is_verified is None: - self.proxy_is_verified = sock_and_verified.is_verified - - def _connect_tls_proxy(self, hostname: str, sock: socket.socket) -> ssl.SSLSocket: - """ - Establish a TLS connection to the proxy using the provided SSL context. - """ - # `_connect_tls_proxy` is called when self._tunnel_host is truthy. - proxy_config = typing.cast(ProxyConfig, self.proxy_config) - ssl_context = proxy_config.ssl_context - sock_and_verified = _ssl_wrap_socket_and_match_hostname( - sock, - cert_reqs=self.cert_reqs, - ssl_version=self.ssl_version, - ssl_minimum_version=self.ssl_minimum_version, - ssl_maximum_version=self.ssl_maximum_version, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - ca_cert_data=self.ca_cert_data, - server_hostname=hostname, - ssl_context=ssl_context, - assert_hostname=proxy_config.assert_hostname, - assert_fingerprint=proxy_config.assert_fingerprint, - # Features that aren't implemented for proxies yet: - cert_file=None, - key_file=None, - key_password=None, - tls_in_tls=False, - ) - self.proxy_is_verified = sock_and_verified.is_verified - return sock_and_verified.socket # type: ignore[return-value] - - -class _WrappedAndVerifiedSocket(typing.NamedTuple): - """ - Wrapped socket and whether the connection is - verified after the TLS handshake - """ - - socket: ssl.SSLSocket | SSLTransport - is_verified: bool - - -def _ssl_wrap_socket_and_match_hostname( - sock: socket.socket, - *, - cert_reqs: None | str | int, - ssl_version: None | str | int, - ssl_minimum_version: int | None, - ssl_maximum_version: int | None, - cert_file: str | None, - key_file: str | None, - key_password: str | None, - ca_certs: str | None, - ca_cert_dir: str | None, - ca_cert_data: None | str | bytes, - assert_hostname: None | str | Literal[False], - assert_fingerprint: str | None, - server_hostname: str | None, - ssl_context: ssl.SSLContext | None, - tls_in_tls: bool = False, -) -> _WrappedAndVerifiedSocket: - """Logic for constructing an SSLContext from all TLS parameters, passing - that down into ssl_wrap_socket, and then doing certificate verification - either via hostname or fingerprint. This function exists to guarantee - that both proxies and targets have the same behavior when connecting via TLS. - """ - default_ssl_context = False - if ssl_context is None: - default_ssl_context = True - context = create_urllib3_context( - ssl_version=resolve_ssl_version(ssl_version), - ssl_minimum_version=ssl_minimum_version, - ssl_maximum_version=ssl_maximum_version, - cert_reqs=resolve_cert_reqs(cert_reqs), - ) - else: - context = ssl_context - - context.verify_mode = resolve_cert_reqs(cert_reqs) - - # In some cases, we want to verify hostnames ourselves - if ( - # `ssl` can't verify fingerprints or alternate hostnames - assert_fingerprint - or assert_hostname - # assert_hostname can be set to False to disable hostname checking - or assert_hostname is False - # We still support OpenSSL 1.0.2, which prevents us from verifying - # hostnames easily: https://github.com/pyca/pyopenssl/pull/933 - or ssl_.IS_PYOPENSSL - or not ssl_.HAS_NEVER_CHECK_COMMON_NAME - ): - context.check_hostname = False - - # Try to load OS default certs if none are given. We need to do the hasattr() check - # for custom pyOpenSSL SSLContext objects because they don't support - # load_default_certs(). - if ( - not ca_certs - and not ca_cert_dir - and not ca_cert_data - and default_ssl_context - and hasattr(context, "load_default_certs") - ): - context.load_default_certs() - - # Ensure that IPv6 addresses are in the proper format and don't have a - # scope ID. Python's SSL module fails to recognize scoped IPv6 addresses - # and interprets them as DNS hostnames. - if server_hostname is not None: - normalized = server_hostname.strip("[]") - if "%" in normalized: - normalized = normalized[: normalized.rfind("%")] - if is_ipaddress(normalized): - server_hostname = normalized - - ssl_sock = ssl_wrap_socket( - sock=sock, - keyfile=key_file, - certfile=cert_file, - key_password=key_password, - ca_certs=ca_certs, - ca_cert_dir=ca_cert_dir, - ca_cert_data=ca_cert_data, - server_hostname=server_hostname, - ssl_context=context, - tls_in_tls=tls_in_tls, - ) - - try: - if assert_fingerprint: - _assert_fingerprint( - ssl_sock.getpeercert(binary_form=True), assert_fingerprint - ) - elif ( - context.verify_mode != ssl.CERT_NONE - and not context.check_hostname - and assert_hostname is not False - ): - cert: _TYPE_PEER_CERT_RET_DICT = ssl_sock.getpeercert() # type: ignore[assignment] - - # Need to signal to our match_hostname whether to use 'commonName' or not. - # If we're using our own constructed SSLContext we explicitly set 'False' - # because PyPy hard-codes 'True' from SSLContext.hostname_checks_common_name. - if default_ssl_context: - hostname_checks_common_name = False - else: - hostname_checks_common_name = ( - getattr(context, "hostname_checks_common_name", False) or False - ) - - _match_hostname( - cert, - assert_hostname or server_hostname, # type: ignore[arg-type] - hostname_checks_common_name, - ) - - return _WrappedAndVerifiedSocket( - socket=ssl_sock, - is_verified=context.verify_mode == ssl.CERT_REQUIRED - or bool(assert_fingerprint), - ) - except BaseException: - ssl_sock.close() - raise - - -def _match_hostname( - cert: _TYPE_PEER_CERT_RET_DICT | None, - asserted_hostname: str, - hostname_checks_common_name: bool = False, -) -> None: - # Our upstream implementation of ssl.match_hostname() - # only applies this normalization to IP addresses so it doesn't - # match DNS SANs so we do the same thing! - stripped_hostname = asserted_hostname.strip("[]") - if is_ipaddress(stripped_hostname): - asserted_hostname = stripped_hostname - - try: - match_hostname(cert, asserted_hostname, hostname_checks_common_name) - except CertificateError as e: - log.warning( - "Certificate did not match expected hostname: %s. Certificate: %s", - asserted_hostname, - cert, - ) - # Add cert to exception and reraise so client code can inspect - # the cert when catching the exception, if they want to - e._peer_cert = cert # type: ignore[attr-defined] - raise - - -def _wrap_proxy_error(err: Exception, proxy_scheme: str | None) -> ProxyError: - # Look for the phrase 'wrong version number', if found - # then we should warn the user that we're very sure that - # this proxy is HTTP-only and they have a configuration issue. - error_normalized = " ".join(re.split("[^a-z]", str(err).lower())) - is_likely_http_proxy = ( - "wrong version number" in error_normalized - or "unknown protocol" in error_normalized - or "record layer failure" in error_normalized - ) - http_proxy_warning = ( - ". Your proxy appears to only use HTTP and not HTTPS, " - "try changing your proxy URL to be HTTP. See: " - "https://urllib3.readthedocs.io/en/latest/advanced-usage.html" - "#https-proxy-error-http-proxy" - ) - new_err = ProxyError( - f"Unable to connect to proxy" - f"{http_proxy_warning if is_likely_http_proxy and proxy_scheme == 'https' else ''}", - err, - ) - new_err.__cause__ = err - return new_err - - -def _get_default_user_agent() -> str: - return f"python-urllib3/{__version__}" - - -class DummyConnection: - """Used to detect a failed ConnectionCls import.""" - - -if not ssl: - HTTPSConnection = DummyConnection # type: ignore[misc, assignment] # noqa: F811 - - -VerifiedHTTPSConnection = HTTPSConnection - - -def _url_from_connection( - conn: HTTPConnection | HTTPSConnection, path: str | None = None -) -> str: - """Returns the URL from a given connection. This is mainly used for testing and logging.""" - - scheme = "https" if isinstance(conn, HTTPSConnection) else "http" - - return Url(scheme=scheme, host=conn.host, port=conn.port, path=path).url diff --git a/.flatpak-builder/cache/objects/88/7aff0cab3d4f078b901f1e72db78e89323f6d337185d89cb8ac8965a443a46.file b/.flatpak-builder/cache/objects/88/7aff0cab3d4f078b901f1e72db78e89323f6d337185d89cb8ac8965a443a46.file deleted file mode 100644 index 4bd072b..0000000 --- a/.flatpak-builder/cache/objects/88/7aff0cab3d4f078b901f1e72db78e89323f6d337185d89cb8ac8965a443a46.file +++ /dev/null @@ -1,128 +0,0 @@ -r""" -The ``codes`` object defines a mapping from common names for HTTP statuses -to their numerical codes, accessible either as attributes or as dictionary -items. - -Example:: - - >>> import requests - >>> requests.codes['temporary_redirect'] - 307 - >>> requests.codes.teapot - 418 - >>> requests.codes['\o/'] - 200 - -Some codes have multiple names, and both upper- and lower-case versions of -the names are allowed. For example, ``codes.ok``, ``codes.OK``, and -``codes.okay`` all correspond to the HTTP status code 200. -""" - -from .structures import LookupDict - -_codes = { - # Informational. - 100: ("continue",), - 101: ("switching_protocols",), - 102: ("processing",), - 103: ("checkpoint",), - 122: ("uri_too_long", "request_uri_too_long"), - 200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"), - 201: ("created",), - 202: ("accepted",), - 203: ("non_authoritative_info", "non_authoritative_information"), - 204: ("no_content",), - 205: ("reset_content", "reset"), - 206: ("partial_content", "partial"), - 207: ("multi_status", "multiple_status", "multi_stati", "multiple_stati"), - 208: ("already_reported",), - 226: ("im_used",), - # Redirection. - 300: ("multiple_choices",), - 301: ("moved_permanently", "moved", "\\o-"), - 302: ("found",), - 303: ("see_other", "other"), - 304: ("not_modified",), - 305: ("use_proxy",), - 306: ("switch_proxy",), - 307: ("temporary_redirect", "temporary_moved", "temporary"), - 308: ( - "permanent_redirect", - "resume_incomplete", - "resume", - ), # "resume" and "resume_incomplete" to be removed in 3.0 - # Client Error. - 400: ("bad_request", "bad"), - 401: ("unauthorized",), - 402: ("payment_required", "payment"), - 403: ("forbidden",), - 404: ("not_found", "-o-"), - 405: ("method_not_allowed", "not_allowed"), - 406: ("not_acceptable",), - 407: ("proxy_authentication_required", "proxy_auth", "proxy_authentication"), - 408: ("request_timeout", "timeout"), - 409: ("conflict",), - 410: ("gone",), - 411: ("length_required",), - 412: ("precondition_failed", "precondition"), - 413: ("request_entity_too_large",), - 414: ("request_uri_too_large",), - 415: ("unsupported_media_type", "unsupported_media", "media_type"), - 416: ( - "requested_range_not_satisfiable", - "requested_range", - "range_not_satisfiable", - ), - 417: ("expectation_failed",), - 418: ("im_a_teapot", "teapot", "i_am_a_teapot"), - 421: ("misdirected_request",), - 422: ("unprocessable_entity", "unprocessable"), - 423: ("locked",), - 424: ("failed_dependency", "dependency"), - 425: ("unordered_collection", "unordered"), - 426: ("upgrade_required", "upgrade"), - 428: ("precondition_required", "precondition"), - 429: ("too_many_requests", "too_many"), - 431: ("header_fields_too_large", "fields_too_large"), - 444: ("no_response", "none"), - 449: ("retry_with", "retry"), - 450: ("blocked_by_windows_parental_controls", "parental_controls"), - 451: ("unavailable_for_legal_reasons", "legal_reasons"), - 499: ("client_closed_request",), - # Server Error. - 500: ("internal_server_error", "server_error", "/o\\", "✗"), - 501: ("not_implemented",), - 502: ("bad_gateway",), - 503: ("service_unavailable", "unavailable"), - 504: ("gateway_timeout",), - 505: ("http_version_not_supported", "http_version"), - 506: ("variant_also_negotiates",), - 507: ("insufficient_storage",), - 509: ("bandwidth_limit_exceeded", "bandwidth"), - 510: ("not_extended",), - 511: ("network_authentication_required", "network_auth", "network_authentication"), -} - -codes = LookupDict(name="status_codes") - - -def _init(): - for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith(("\\", "/")): - setattr(codes, title.upper(), code) - - def doc(code): - names = ", ".join(f"``{n}``" for n in _codes[code]) - return "* %d: %s" % (code, names) - - global __doc__ - __doc__ = ( - __doc__ + "\n" + "\n".join(doc(code) for code in sorted(_codes)) - if __doc__ is not None - else None - ) - - -_init() diff --git a/.flatpak-builder/cache/objects/88/e4de5a23b6462d64a0513e1adb9a452bd1fc51d3a76fed5634ab90ce253bd2.file b/.flatpak-builder/cache/objects/88/e4de5a23b6462d64a0513e1adb9a452bd1fc51d3a76fed5634ab90ce253bd2.file deleted file mode 100644 index bf5933312e649dfe91eb85178601c734178054d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14838 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 SaGlD7x+F~lt2_!49{L}TEY({8 diff --git a/.flatpak-builder/cache/objects/89/c6f508485e5dde514e95c702d98212925caa9adc9089c47abe97cd3b4c6e9c.file b/.flatpak-builder/cache/objects/89/c6f508485e5dde514e95c702d98212925caa9adc9089c47abe97cd3b4c6e9c.file deleted file mode 100644 index 3148acac72762b2a70b918279401ca3d722f4a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3932 zcma(UOKcn0@x5Ixxgsf1qEty~6l*QXb_vU((>QJ|xNZbXwGB8*3JC!s!=P5&m9+M9 zmwvmnC6@{WLqO?3Xzaj&bVvaKEt~{KfLsdr(4xpGhh9j42VwyO0&>cYh1$ZLlMn0_ZrF%bx?=7N}IjWI4L8Eh` z7S#e9fw_RzuF3G0v<|He-a$A$4DXN@fwMb3`I@UU)wP*=2960UFlLtxM@gHi<0wWZ zYw8)@avepr6r;9Ou@`RXX;*QVRaZ&F#DcEm99>gfTQO}r%emNhb;dWL(2Aqq$>~;F z9}Dxz_w5|t2)lrbuFTKhxH&(s*jZl|WTd9kI!K_`&tF(o3`^5j#(eqeOF6rHhG{BH zHGmsPGoD=?*H_Zx^Ve|w6k|4k!s zY%s1&fbv`qU-L1())S1(euO(^%y&)0&EO3Qeh^V~ZdN<#AFR)dZ~_!Rg&Yw&_ywE!j%uHbZO+6y?ke*1pE zkx?=^$5ocqyXYeQwvy4^Wn1&Ysf=NzxG@;APDoy8S#?y`WnRYwKw}~2>fE%f4d%Vj zk`9pzvvSsU3=H9fh^Lr~{=ArRmK+ob;%onWQq5+Qrm>LBuEKHF8)L7(o`hZcnXH<= z4dLP>-@SG{$!$7Q51j0(C#O<|Ww@!-{jPe{j@3ycz}vY3V4b{(^*&sy1%ye77ITWsZ#7aj;2Sra}G?$LW>MSP#!qX}VpKc-unVlOtXULwFxQ?3@_^G6)`QeYDg~YfS7pEpJxyL{P*3BgSpe&# zDoAaKO0;wH%175fyuKYTMF+~!fns!^(%tvuXNBpPFJgV@pTq&E#D~#S1KTr?lTVU6 zcZ$)Uyo6DeU=_R_l<$EuO#Tp_2#8PrB1N2Ln5x*T020zch_EiC4gm1l zXIwk$`DKT3|_JP(oDz4jvnYzis$@Fn$0=V6Pp3;<&z*fx3)8$F-CR*Ie~M^6=_ zr+`{`d-Lt>UzeiC5IGbrqZlnds71@*j#!G1l;b0xA1_8v*W+arBJPM(J+ zUJ<_*;uAgM*F6&8(+R=XH4G~t@G<6DKY~{faH`K`^$4-*gJ$N_a9B~J8z>$#;9KPF|S07T= zQJ{-(M>piWaG0M(^8!?6QGE@v6K^givRTv6q3u$ZjJvv}pt-TE^6mw?9bTKEL9-5e zEF1bQ?kUXr2DU4X->A$&hgDmzGF|aY8MJFEvPXaTWdhqBS8wd(V*HmLXjJ*$gKDc$ z)^TXl;M8WRK_kEU0`WmY?EAQsHQ9Vw$9?G>=(!rAHS2OD149O)dze_Z!1sA_vv&x7t5$e;j)fYY>kX70kt4rIUbs0vCWQ z)xJgr@=!S3K7a}xH5GV9Nr(*p5%3e+C}6dgYu(Q>=YaCRM1K!=9S86dWRDE{&vv{p zS(tnje|UBCYJ@AqZrpCcO zv?@|ct3!ki7s*ibvrAqrwm!S0yV&|vgC{5yiKF1}Nc+dZ#4IHjeo>Wr>6=yZLx9`k EKcsJ~^#A|> diff --git a/.flatpak-builder/cache/objects/89/caa4a7ebd180b2a8e2be0b5197dff39e85c78f91bae9e2c2a3574ac60a0d01.file b/.flatpak-builder/cache/objects/89/caa4a7ebd180b2a8e2be0b5197dff39e85c78f91bae9e2c2a3574ac60a0d01.file deleted file mode 100644 index ac9820b..0000000 --- a/.flatpak-builder/cache/objects/89/caa4a7ebd180b2a8e2be0b5197dff39e85c78f91bae9e2c2a3574ac60a0d01.file +++ /dev/null @@ -1,184 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# MPO file handling -# -# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the -# Camera & Imaging Products Association) -# -# The multi-picture object combines multiple JPEG images (with a modified EXIF -# data format) into a single file. While it can theoretically be used much like -# a GIF animation, it is commonly used to represent 3D photographs and is (as -# of this writing) the most commonly used format by 3D cameras. -# -# History: -# 2014-03-13 Feneric Created -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import itertools -import os -import struct - -from . import ( - Image, - ImageSequence, - JpegImagePlugin, - TiffImagePlugin, -) -from ._binary import o32le - - -def _save(im, fp, filename): - JpegImagePlugin._save(im, fp, filename) - - -def _save_all(im, fp, filename): - append_images = im.encoderinfo.get("append_images", []) - if not append_images: - try: - animated = im.is_animated - except AttributeError: - animated = False - if not animated: - _save(im, fp, filename) - return - - mpf_offset = 28 - offsets = [] - for imSequence in itertools.chain([im], append_images): - for im_frame in ImageSequence.Iterator(imSequence): - if not offsets: - # APP2 marker - im_frame.encoderinfo["extra"] = ( - b"\xFF\xE2" + struct.pack(">H", 6 + 82) + b"MPF\0" + b" " * 82 - ) - exif = im_frame.encoderinfo.get("exif") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - im_frame.encoderinfo["exif"] = exif - if exif: - mpf_offset += 4 + len(exif) - - JpegImagePlugin._save(im_frame, fp, filename) - offsets.append(fp.tell()) - else: - im_frame.save(fp, "JPEG") - offsets.append(fp.tell() - offsets[-1]) - - ifd = TiffImagePlugin.ImageFileDirectory_v2() - ifd[0xB000] = b"0100" - ifd[0xB001] = len(offsets) - - mpentries = b"" - data_offset = 0 - for i, size in enumerate(offsets): - if i == 0: - mptype = 0x030000 # Baseline MP Primary Image - else: - mptype = 0x000000 # Undefined - mpentries += struct.pack(" 1 - self._fp = self.fp # FIXME: hack - self._fp.seek(self.__mpoffsets[0]) # get ready to read first frame - self.__frame = 0 - self.offset = 0 - # for now we can only handle reading and individual frame extraction - self.readonly = 1 - - def load_seek(self, pos): - self._fp.seek(pos) - - def seek(self, frame): - if not self._seek_check(frame): - return - self.fp = self._fp - self.offset = self.__mpoffsets[frame] - - original_exif = self.info.get("exif") - if "exif" in self.info: - del self.info["exif"] - - self.fp.seek(self.offset + 2) # skip SOI marker - if not self.fp.read(2): - msg = "No data found for frame" - raise ValueError(msg) - self.fp.seek(self.offset) - JpegImagePlugin.JpegImageFile._open(self) - if self.info.get("exif") != original_exif: - self._reload_exif() - - self.tile = [("jpeg", (0, 0) + self.size, self.offset, self.tile[0][-1])] - self.__frame = frame - - def tell(self): - return self.__frame - - @staticmethod - def adopt(jpeg_instance, mpheader=None): - """ - Transform the instance of JpegImageFile into - an instance of MpoImageFile. - After the call, the JpegImageFile is extended - to be an MpoImageFile. - - This is essentially useful when opening a JPEG - file that reveals itself as an MPO, to avoid - double call to _open. - """ - jpeg_instance.__class__ = MpoImageFile - jpeg_instance._after_jpeg_open(mpheader) - return jpeg_instance - - -# --------------------------------------------------------------------- -# Registry stuff - -# Note that since MPO shares a factory with JPEG, we do not need to do a -# separate registration for it here. -# Image.register_open(MpoImageFile.format, -# JpegImagePlugin.jpeg_factory, _accept) -Image.register_save(MpoImageFile.format, _save) -Image.register_save_all(MpoImageFile.format, _save_all) - -Image.register_extension(MpoImageFile.format, ".mpo") - -Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/.flatpak-builder/cache/objects/8a/91ac7d4647fbb3749bf8df63b4aaaa9aa696018269184d8dc5ee7537d4c06f.file b/.flatpak-builder/cache/objects/8a/91ac7d4647fbb3749bf8df63b4aaaa9aa696018269184d8dc5ee7537d4c06f.file deleted file mode 100644 index 9733686..0000000 --- a/.flatpak-builder/cache/objects/8a/91ac7d4647fbb3749bf8df63b4aaaa9aa696018269184d8dc5ee7537d4c06f.file +++ /dev/null @@ -1,315 +0,0 @@ -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -import hashlib -import os -import re -import threading -import time -import warnings -from base64 import b64encode - -from ._internal_utils import to_native_string -from .compat import basestring, str, urlparse -from .cookies import extract_cookies_to_jar -from .utils import parse_dict_header - -CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded" -CONTENT_TYPE_MULTI_PART = "multipart/form-data" - - -def _basic_auth_str(username, password): - """Returns a Basic Auth string.""" - - # "I want us to put a big-ol' comment on top of it that - # says that this behaviour is dumb but we need to preserve - # it because people are relying on it." - # - Lukasa - # - # These are here solely to maintain backwards compatibility - # for things like ints. This will be removed in 3.0.0. - if not isinstance(username, basestring): - warnings.warn( - "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(username), - category=DeprecationWarning, - ) - username = str(username) - - if not isinstance(password, basestring): - warnings.warn( - "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(type(password)), - category=DeprecationWarning, - ) - password = str(password) - # -- End Removal -- - - if isinstance(username, str): - username = username.encode("latin1") - - if isinstance(password, str): - password = password.encode("latin1") - - authstr = "Basic " + to_native_string( - b64encode(b":".join((username, password))).strip() - ) - - return authstr - - -class AuthBase: - """Base class that all auth implementations derive from""" - - def __call__(self, r): - raise NotImplementedError("Auth hooks must be callable.") - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - - def __eq__(self, other): - return all( - [ - self.username == getattr(other, "username", None), - self.password == getattr(other, "password", None), - ] - ) - - def __ne__(self, other): - return not self == other - - def __call__(self, r): - r.headers["Authorization"] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authentication to a given Request object.""" - - def __call__(self, r): - r.headers["Proxy-Authorization"] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - # Keep state in per-thread local storage - self._thread_local = threading.local() - - def init_per_thread_state(self): - # Ensure state is initialized just once per-thread - if not hasattr(self._thread_local, "init"): - self._thread_local.init = True - self._thread_local.last_nonce = "" - self._thread_local.nonce_count = 0 - self._thread_local.chal = {} - self._thread_local.pos = None - self._thread_local.num_401_calls = None - - def build_digest_header(self, method, url): - """ - :rtype: str - """ - - realm = self._thread_local.chal["realm"] - nonce = self._thread_local.chal["nonce"] - qop = self._thread_local.chal.get("qop") - algorithm = self._thread_local.chal.get("algorithm") - opaque = self._thread_local.chal.get("opaque") - hash_utf8 = None - - if algorithm is None: - _algorithm = "MD5" - else: - _algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if _algorithm == "MD5" or _algorithm == "MD5-SESS": - - def md5_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.md5(x).hexdigest() - - hash_utf8 = md5_utf8 - elif _algorithm == "SHA": - - def sha_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha1(x).hexdigest() - - hash_utf8 = sha_utf8 - elif _algorithm == "SHA-256": - - def sha256_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha256(x).hexdigest() - - hash_utf8 = sha256_utf8 - elif _algorithm == "SHA-512": - - def sha512_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha512(x).hexdigest() - - hash_utf8 = sha512_utf8 - - KD = lambda s, d: hash_utf8(f"{s}:{d}") # noqa:E731 - - if hash_utf8 is None: - return None - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(url) - #: path is request-uri defined in RFC 2616 which should not be empty - path = p_parsed.path or "/" - if p_parsed.query: - path += f"?{p_parsed.query}" - - A1 = f"{self.username}:{realm}:{self.password}" - A2 = f"{method}:{path}" - - HA1 = hash_utf8(A1) - HA2 = hash_utf8(A2) - - if nonce == self._thread_local.last_nonce: - self._thread_local.nonce_count += 1 - else: - self._thread_local.nonce_count = 1 - ncvalue = f"{self._thread_local.nonce_count:08x}" - s = str(self._thread_local.nonce_count).encode("utf-8") - s += nonce.encode("utf-8") - s += time.ctime().encode("utf-8") - s += os.urandom(8) - - cnonce = hashlib.sha1(s).hexdigest()[:16] - if _algorithm == "MD5-SESS": - HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}") - - if not qop: - respdig = KD(HA1, f"{nonce}:{HA2}") - elif qop == "auth" or "auth" in qop.split(","): - noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}" - respdig = KD(HA1, noncebit) - else: - # XXX handle auth-int. - return None - - self._thread_local.last_nonce = nonce - - # XXX should the partial digests be encoded too? - base = ( - f'username="{self.username}", realm="{realm}", nonce="{nonce}", ' - f'uri="{path}", response="{respdig}"' - ) - if opaque: - base += f', opaque="{opaque}"' - if algorithm: - base += f', algorithm="{algorithm}"' - if entdig: - base += f', digest="{entdig}"' - if qop: - base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"' - - return f"Digest {base}" - - def handle_redirect(self, r, **kwargs): - """Reset num_401_calls counter on redirects.""" - if r.is_redirect: - self._thread_local.num_401_calls = 1 - - def handle_401(self, r, **kwargs): - """ - Takes the given response and tries digest-auth, if needed. - - :rtype: requests.Response - """ - - # If response is not 4xx, do not auth - # See https://github.com/psf/requests/issues/3772 - if not 400 <= r.status_code < 500: - self._thread_local.num_401_calls = 1 - return r - - if self._thread_local.pos is not None: - # Rewind the file position indicator of the body to where - # it was to resend the request. - r.request.body.seek(self._thread_local.pos) - s_auth = r.headers.get("www-authenticate", "") - - if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: - - self._thread_local.num_401_calls += 1 - pat = re.compile(r"digest ", flags=re.IGNORECASE) - self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) - - # Consume content and release the original connection - # to allow our new request to reuse the same one. - r.content - r.close() - prep = r.request.copy() - extract_cookies_to_jar(prep._cookies, r.request, r.raw) - prep.prepare_cookies(prep._cookies) - - prep.headers["Authorization"] = self.build_digest_header( - prep.method, prep.url - ) - _r = r.connection.send(prep, **kwargs) - _r.history.append(r) - _r.request = prep - - return _r - - self._thread_local.num_401_calls = 1 - return r - - def __call__(self, r): - # Initialize per-thread state, if needed - self.init_per_thread_state() - # If we have a saved nonce, skip the 401 - if self._thread_local.last_nonce: - r.headers["Authorization"] = self.build_digest_header(r.method, r.url) - try: - self._thread_local.pos = r.body.tell() - except AttributeError: - # In the case of HTTPDigestAuth being reused and the body of - # the previous request was a file-like object, pos has the - # file position of the previous body. Ensure it's set to - # None. - self._thread_local.pos = None - r.register_hook("response", self.handle_401) - r.register_hook("response", self.handle_redirect) - self._thread_local.num_401_calls = 1 - - return r - - def __eq__(self, other): - return all( - [ - self.username == getattr(other, "username", None), - self.password == getattr(other, "password", None), - ] - ) - - def __ne__(self, other): - return not self == other diff --git a/.flatpak-builder/cache/objects/8b/92f34bb279b3acc1f0df8945fb7419dfd424b04778a982453fc4165785a0b6.file b/.flatpak-builder/cache/objects/8b/92f34bb279b3acc1f0df8945fb7419dfd424b04778a982453fc4165785a0b6.file deleted file mode 100644 index 78e3bb6..0000000 --- a/.flatpak-builder/cache/objects/8b/92f34bb279b3acc1f0df8945fb7419dfd424b04778a982453fc4165785a0b6.file +++ /dev/null @@ -1,538 +0,0 @@ -""" -requests.adapters -~~~~~~~~~~~~~~~~~ - -This module contains the transport adapters that Requests uses to define -and maintain connections. -""" - -import os.path -import socket # noqa: F401 - -from urllib3.exceptions import ClosedPoolError, ConnectTimeoutError -from urllib3.exceptions import HTTPError as _HTTPError -from urllib3.exceptions import InvalidHeader as _InvalidHeader -from urllib3.exceptions import ( - LocationValueError, - MaxRetryError, - NewConnectionError, - ProtocolError, -) -from urllib3.exceptions import ProxyError as _ProxyError -from urllib3.exceptions import ReadTimeoutError, ResponseError -from urllib3.exceptions import SSLError as _SSLError -from urllib3.poolmanager import PoolManager, proxy_from_url -from urllib3.util import Timeout as TimeoutSauce -from urllib3.util import parse_url -from urllib3.util.retry import Retry - -from .auth import _basic_auth_str -from .compat import basestring, urlparse -from .cookies import extract_cookies_to_jar -from .exceptions import ( - ConnectionError, - ConnectTimeout, - InvalidHeader, - InvalidProxyURL, - InvalidSchema, - InvalidURL, - ProxyError, - ReadTimeout, - RetryError, - SSLError, -) -from .models import Response -from .structures import CaseInsensitiveDict -from .utils import ( - DEFAULT_CA_BUNDLE_PATH, - extract_zipped_paths, - get_auth_from_url, - get_encoding_from_headers, - prepend_scheme_if_needed, - select_proxy, - urldefragauth, -) - -try: - from urllib3.contrib.socks import SOCKSProxyManager -except ImportError: - - def SOCKSProxyManager(*args, **kwargs): - raise InvalidSchema("Missing dependencies for SOCKS support.") - - -DEFAULT_POOLBLOCK = False -DEFAULT_POOLSIZE = 10 -DEFAULT_RETRIES = 0 -DEFAULT_POOL_TIMEOUT = None - - -class BaseAdapter: - """The Base Transport Adapter""" - - def __init__(self): - super().__init__() - - def send( - self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None - ): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest ` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - """ - raise NotImplementedError - - def close(self): - """Cleans up adapter specific items.""" - raise NotImplementedError - - -class HTTPAdapter(BaseAdapter): - """The built-in HTTP Adapter for urllib3. - - Provides a general-case interface for Requests sessions to contact HTTP and - HTTPS urls by implementing the Transport Adapter interface. This class will - usually be created by the :class:`Session ` class under the - covers. - - :param pool_connections: The number of urllib3 connection pools to cache. - :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection - should attempt. Note, this applies only to failed DNS lookups, socket - connections and connection timeouts, never to requests where data has - made it to the server. By default, Requests does not retry failed - connections. If you need granular control over the conditions under - which we retry a request, import urllib3's ``Retry`` class and pass - that instead. - :param pool_block: Whether the connection pool should block for connections. - - Usage:: - - >>> import requests - >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter(max_retries=3) - >>> s.mount('http://', a) - """ - - __attrs__ = [ - "max_retries", - "config", - "_pool_connections", - "_pool_maxsize", - "_pool_block", - ] - - def __init__( - self, - pool_connections=DEFAULT_POOLSIZE, - pool_maxsize=DEFAULT_POOLSIZE, - max_retries=DEFAULT_RETRIES, - pool_block=DEFAULT_POOLBLOCK, - ): - if max_retries == DEFAULT_RETRIES: - self.max_retries = Retry(0, read=False) - else: - self.max_retries = Retry.from_int(max_retries) - self.config = {} - self.proxy_manager = {} - - super().__init__() - - self._pool_connections = pool_connections - self._pool_maxsize = pool_maxsize - self._pool_block = pool_block - - self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) - - def __getstate__(self): - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - # Can't handle by adding 'proxy_manager' to self.__attrs__ because - # self.poolmanager uses a lambda function, which isn't pickleable. - self.proxy_manager = {} - self.config = {} - - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager( - self._pool_connections, self._pool_maxsize, block=self._pool_block - ) - - def init_poolmanager( - self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs - ): - """Initializes a urllib3 PoolManager. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param connections: The number of urllib3 connection pools to cache. - :param maxsize: The maximum number of connections to save in the pool. - :param block: Block when no free connections are available. - :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. - """ - # save these values for pickling - self._pool_connections = connections - self._pool_maxsize = maxsize - self._pool_block = block - - self.poolmanager = PoolManager( - num_pools=connections, - maxsize=maxsize, - block=block, - **pool_kwargs, - ) - - def proxy_manager_for(self, proxy, **proxy_kwargs): - """Return urllib3 ProxyManager for the given proxy. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param proxy: The proxy to return a urllib3 ProxyManager for. - :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. - :returns: ProxyManager - :rtype: urllib3.ProxyManager - """ - if proxy in self.proxy_manager: - manager = self.proxy_manager[proxy] - elif proxy.lower().startswith("socks"): - username, password = get_auth_from_url(proxy) - manager = self.proxy_manager[proxy] = SOCKSProxyManager( - proxy, - username=username, - password=password, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs, - ) - else: - proxy_headers = self.proxy_headers(proxy) - manager = self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs, - ) - - return manager - - def cert_verify(self, conn, url, verify, cert): - """Verify a SSL certificate. This method should not be called from user - code, and is only exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param conn: The urllib3 connection object associated with the cert. - :param url: The requested URL. - :param verify: Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: The SSL certificate to verify. - """ - if url.lower().startswith("https") and verify: - - cert_loc = None - - # Allow self-specified cert location. - if verify is not True: - cert_loc = verify - - if not cert_loc: - cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) - - if not cert_loc or not os.path.exists(cert_loc): - raise OSError( - f"Could not find a suitable TLS CA certificate bundle, " - f"invalid path: {cert_loc}" - ) - - conn.cert_reqs = "CERT_REQUIRED" - - if not os.path.isdir(cert_loc): - conn.ca_certs = cert_loc - else: - conn.ca_cert_dir = cert_loc - else: - conn.cert_reqs = "CERT_NONE" - conn.ca_certs = None - conn.ca_cert_dir = None - - if cert: - if not isinstance(cert, basestring): - conn.cert_file = cert[0] - conn.key_file = cert[1] - else: - conn.cert_file = cert - conn.key_file = None - if conn.cert_file and not os.path.exists(conn.cert_file): - raise OSError( - f"Could not find the TLS certificate file, " - f"invalid path: {conn.cert_file}" - ) - if conn.key_file and not os.path.exists(conn.key_file): - raise OSError( - f"Could not find the TLS key file, invalid path: {conn.key_file}" - ) - - def build_response(self, req, resp): - """Builds a :class:`Response ` object from a urllib3 - response. This should not be called from user code, and is only exposed - for use when subclassing the - :class:`HTTPAdapter ` - - :param req: The :class:`PreparedRequest ` used to generate the response. - :param resp: The urllib3 response object. - :rtype: requests.Response - """ - response = Response() - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, "status", None) - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, "headers", {})) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - response.raw = resp - response.reason = response.raw.reason - - if isinstance(req.url, bytes): - response.url = req.url.decode("utf-8") - else: - response.url = req.url - - # Add new cookies from the server. - extract_cookies_to_jar(response.cookies, req, resp) - - # Give the Response some context. - response.request = req - response.connection = self - - return response - - def get_connection(self, url, proxies=None): - """Returns a urllib3 connection for the given URL. This should not be - called from user code, and is only exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param url: The URL to connect to. - :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: urllib3.ConnectionPool - """ - proxy = select_proxy(url, proxies) - - if proxy: - proxy = prepend_scheme_if_needed(proxy, "http") - proxy_url = parse_url(proxy) - if not proxy_url.host: - raise InvalidProxyURL( - "Please check proxy URL. It is malformed " - "and could be missing the host." - ) - proxy_manager = self.proxy_manager_for(proxy) - conn = proxy_manager.connection_from_url(url) - else: - # Only scheme should be lower case - parsed = urlparse(url) - url = parsed.geturl() - conn = self.poolmanager.connection_from_url(url) - - return conn - - def close(self): - """Disposes of any internal state. - - Currently, this closes the PoolManager and any active ProxyManager, - which closes any pooled connections. - """ - self.poolmanager.clear() - for proxy in self.proxy_manager.values(): - proxy.clear() - - def request_url(self, request, proxies): - """Obtain the url to use when making the final request. - - If the message is being sent through a HTTP proxy, the full URL has to - be used. Otherwise, we should only use the path portion of the URL. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param request: The :class:`PreparedRequest ` being sent. - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. - :rtype: str - """ - proxy = select_proxy(request.url, proxies) - scheme = urlparse(request.url).scheme - - is_proxied_http_request = proxy and scheme != "https" - using_socks_proxy = False - if proxy: - proxy_scheme = urlparse(proxy).scheme.lower() - using_socks_proxy = proxy_scheme.startswith("socks") - - url = request.path_url - if is_proxied_http_request and not using_socks_proxy: - url = urldefragauth(request.url) - - return url - - def add_headers(self, request, **kwargs): - """Add any headers needed by the connection. As of v2.0 this does - nothing by default, but is left for overriding by users that subclass - the :class:`HTTPAdapter `. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param request: The :class:`PreparedRequest ` to add headers to. - :param kwargs: The keyword arguments from the call to send(). - """ - pass - - def proxy_headers(self, proxy): - """Returns a dictionary of the headers to add to any request sent - through a proxy. This works with urllib3 magic to ensure that they are - correctly sent to the proxy, rather than in a tunnelled request if - CONNECT is being used. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param proxy: The url of the proxy being used for this request. - :rtype: dict - """ - headers = {} - username, password = get_auth_from_url(proxy) - - if username: - headers["Proxy-Authorization"] = _basic_auth_str(username, password) - - return headers - - def send( - self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None - ): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest ` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple or urllib3 Timeout object - :param verify: (optional) Either a boolean, in which case it controls whether - we verify the server's TLS certificate, or a string, in which case it - must be a path to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - :rtype: requests.Response - """ - - try: - conn = self.get_connection(request.url, proxies) - except LocationValueError as e: - raise InvalidURL(e, request=request) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers( - request, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - ) - - chunked = not (request.body is None or "Content-Length" in request.headers) - - if isinstance(timeout, tuple): - try: - connect, read = timeout - timeout = TimeoutSauce(connect=connect, read=read) - except ValueError: - raise ValueError( - f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " - f"or a single float to set both timeouts to the same value." - ) - elif isinstance(timeout, TimeoutSauce): - pass - else: - timeout = TimeoutSauce(connect=timeout, read=timeout) - - try: - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, - headers=request.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=timeout, - chunked=chunked, - ) - - except (ProtocolError, OSError) as err: - raise ConnectionError(err, request=request) - - except MaxRetryError as e: - if isinstance(e.reason, ConnectTimeoutError): - # TODO: Remove this in 3.0.0: see #2811 - if not isinstance(e.reason, NewConnectionError): - raise ConnectTimeout(e, request=request) - - if isinstance(e.reason, ResponseError): - raise RetryError(e, request=request) - - if isinstance(e.reason, _ProxyError): - raise ProxyError(e, request=request) - - if isinstance(e.reason, _SSLError): - # This branch is for urllib3 v1.22 and later. - raise SSLError(e, request=request) - - raise ConnectionError(e, request=request) - - except ClosedPoolError as e: - raise ConnectionError(e, request=request) - - except _ProxyError as e: - raise ProxyError(e) - - except (_SSLError, _HTTPError) as e: - if isinstance(e, _SSLError): - # This branch is for urllib3 versions earlier than v1.22 - raise SSLError(e, request=request) - elif isinstance(e, ReadTimeoutError): - raise ReadTimeout(e, request=request) - elif isinstance(e, _InvalidHeader): - raise InvalidHeader(e, request=request) - else: - raise - - return self.build_response(request, resp) diff --git a/.flatpak-builder/cache/objects/8b/ccb0956fee624d1de1be95d3145e29cfa8b339f8177eec0e65029c8c8ad050.file b/.flatpak-builder/cache/objects/8b/ccb0956fee624d1de1be95d3145e29cfa8b339f8177eec0e65029c8c8ad050.file deleted file mode 100644 index f46a9d90184d8c1aa55fb0f9c65abe9d2ba76724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2742 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 S5!19e{F39px=${jzW)VaR`Fc` diff --git a/.flatpak-builder/cache/objects/8f/0be0c3e97a15efd3d249ebdb12d757806a98bb7a8a81153c0838589badd077.file b/.flatpak-builder/cache/objects/8f/0be0c3e97a15efd3d249ebdb12d757806a98bb7a8a81153c0838589badd077.file deleted file mode 100644 index 3a45572..0000000 --- a/.flatpak-builder/cache/objects/8f/0be0c3e97a15efd3d249ebdb12d757806a98bb7a8a81153c0838589badd077.file +++ /dev/null @@ -1,1102 +0,0 @@ -# The Python Imaging Library. -# $Id$ - -# Optional color management support, based on Kevin Cazabon's PyCMS -# library. - -# Originally released under LGPL. Graciously donated to PIL in -# March 2009, for distribution under the standard PIL license - -# History: - -# 2009-03-08 fl Added to PIL. - -# Copyright (C) 2002-2003 Kevin Cazabon -# Copyright (c) 2009 by Fredrik Lundh -# Copyright (c) 2013 by Eric Soroos - -# See the README file for information on usage and redistribution. See -# below for the original description. -from __future__ import annotations - -import operator -import sys -from enum import IntEnum, IntFlag -from functools import reduce -from typing import Any, Literal, SupportsFloat, SupportsInt, Union - -from . import Image, __version__ -from ._deprecate import deprecate -from ._typing import SupportsRead - -try: - from . import _imagingcms as core -except ImportError as ex: - # Allow error import for doc purposes, but error out when accessing - # anything in core. - from ._util import DeferredError - - core = DeferredError.new(ex) - -_DESCRIPTION = """ -pyCMS - - a Python / PIL interface to the littleCMS ICC Color Management System - Copyright (C) 2002-2003 Kevin Cazabon - kevin@cazabon.com - https://www.cazabon.com - - pyCMS home page: https://www.cazabon.com/pyCMS - littleCMS home page: https://www.littlecms.com - (littleCMS is Copyright (C) 1998-2001 Marti Maria) - - Originally released under LGPL. Graciously donated to PIL in - March 2009, for distribution under the standard PIL license - - The pyCMS.py module provides a "clean" interface between Python/PIL and - pyCMSdll, taking care of some of the more complex handling of the direct - pyCMSdll functions, as well as error-checking and making sure that all - relevant data is kept together. - - While it is possible to call pyCMSdll functions directly, it's not highly - recommended. - - Version History: - - 1.0.0 pil Oct 2013 Port to LCMS 2. - - 0.1.0 pil mod March 10, 2009 - - Renamed display profile to proof profile. The proof - profile is the profile of the device that is being - simulated, not the profile of the device which is - actually used to display/print the final simulation - (that'd be the output profile) - also see LCMSAPI.txt - input colorspace -> using 'renderingIntent' -> proof - colorspace -> using 'proofRenderingIntent' -> output - colorspace - - Added LCMS FLAGS support. - Added FLAGS["SOFTPROOFING"] as default flag for - buildProofTransform (otherwise the proof profile/intent - would be ignored). - - 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms - - 0.0.2 alpha Jan 6, 2002 - - Added try/except statements around type() checks of - potential CObjects... Python won't let you use type() - on them, and raises a TypeError (stupid, if you ask - me!) - - Added buildProofTransformFromOpenProfiles() function. - Additional fixes in DLL, see DLL code for details. - - 0.0.1 alpha first public release, Dec. 26, 2002 - - Known to-do list with current version (of Python interface, not pyCMSdll): - - none - -""" - -_VERSION = "1.0.0 pil" - - -def __getattr__(name: str) -> Any: - if name == "DESCRIPTION": - deprecate("PIL.ImageCms.DESCRIPTION", 12) - return _DESCRIPTION - elif name == "VERSION": - deprecate("PIL.ImageCms.VERSION", 12) - return _VERSION - elif name == "FLAGS": - deprecate("PIL.ImageCms.FLAGS", 12, "PIL.ImageCms.Flags") - return _FLAGS - msg = f"module '{__name__}' has no attribute '{name}'" - raise AttributeError(msg) - - -# --------------------------------------------------------------------. - - -# -# intent/direction values - - -class Intent(IntEnum): - PERCEPTUAL = 0 - RELATIVE_COLORIMETRIC = 1 - SATURATION = 2 - ABSOLUTE_COLORIMETRIC = 3 - - -class Direction(IntEnum): - INPUT = 0 - OUTPUT = 1 - PROOF = 2 - - -# -# flags - - -class Flags(IntFlag): - """Flags and documentation are taken from ``lcms2.h``.""" - - NONE = 0 - NOCACHE = 0x0040 - """Inhibit 1-pixel cache""" - NOOPTIMIZE = 0x0100 - """Inhibit optimizations""" - NULLTRANSFORM = 0x0200 - """Don't transform anyway""" - GAMUTCHECK = 0x1000 - """Out of Gamut alarm""" - SOFTPROOFING = 0x4000 - """Do softproofing""" - BLACKPOINTCOMPENSATION = 0x2000 - NOWHITEONWHITEFIXUP = 0x0004 - """Don't fix scum dot""" - HIGHRESPRECALC = 0x0400 - """Use more memory to give better accuracy""" - LOWRESPRECALC = 0x0800 - """Use less memory to minimize resources""" - # this should be 8BITS_DEVICELINK, but that is not a valid name in Python: - USE_8BITS_DEVICELINK = 0x0008 - """Create 8 bits devicelinks""" - GUESSDEVICECLASS = 0x0020 - """Guess device class (for ``transform2devicelink``)""" - KEEP_SEQUENCE = 0x0080 - """Keep profile sequence for devicelink creation""" - FORCE_CLUT = 0x0002 - """Force CLUT optimization""" - CLUT_POST_LINEARIZATION = 0x0001 - """create postlinearization tables if possible""" - CLUT_PRE_LINEARIZATION = 0x0010 - """create prelinearization tables if possible""" - NONEGATIVES = 0x8000 - """Prevent negative numbers in floating point transforms""" - COPY_ALPHA = 0x04000000 - """Alpha channels are copied on ``cmsDoTransform()``""" - NODEFAULTRESOURCEDEF = 0x01000000 - - _GRIDPOINTS_1 = 1 << 16 - _GRIDPOINTS_2 = 2 << 16 - _GRIDPOINTS_4 = 4 << 16 - _GRIDPOINTS_8 = 8 << 16 - _GRIDPOINTS_16 = 16 << 16 - _GRIDPOINTS_32 = 32 << 16 - _GRIDPOINTS_64 = 64 << 16 - _GRIDPOINTS_128 = 128 << 16 - - @staticmethod - def GRIDPOINTS(n: int) -> Flags: - """ - Fine-tune control over number of gridpoints - - :param n: :py:class:`int` in range ``0 <= n <= 255`` - """ - return Flags.NONE | ((n & 0xFF) << 16) - - -_MAX_FLAG = reduce(operator.or_, Flags) - - -_FLAGS = { - "MATRIXINPUT": 1, - "MATRIXOUTPUT": 2, - "MATRIXONLY": (1 | 2), - "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot - # Don't create prelinearization tables on precalculated transforms - # (internal use): - "NOPRELINEARIZATION": 16, - "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) - "NOTCACHE": 64, # Inhibit 1-pixel cache - "NOTPRECALC": 256, - "NULLTRANSFORM": 512, # Don't transform anyway - "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy - "LOWRESPRECALC": 2048, # Use less memory to minimize resources - "WHITEBLACKCOMPENSATION": 8192, - "BLACKPOINTCOMPENSATION": 8192, - "GAMUTCHECK": 4096, # Out of Gamut alarm - "SOFTPROOFING": 16384, # Do softproofing - "PRESERVEBLACK": 32768, # Black preservation - "NODEFAULTRESOURCEDEF": 16777216, # CRD special - "GRIDPOINTS": lambda n: (n & 0xFF) << 16, # Gridpoints -} - - -# --------------------------------------------------------------------. -# Experimental PIL-level API -# --------------------------------------------------------------------. - -## -# Profile. - - -class ImageCmsProfile: - def __init__(self, profile: str | SupportsRead[bytes] | core.CmsProfile) -> None: - """ - :param profile: Either a string representing a filename, - a file like object containing a profile or a - low-level profile object - - """ - - if isinstance(profile, str): - if sys.platform == "win32": - profile_bytes_path = profile.encode() - try: - profile_bytes_path.decode("ascii") - except UnicodeDecodeError: - with open(profile, "rb") as f: - self._set(core.profile_frombytes(f.read())) - return - self._set(core.profile_open(profile), profile) - elif hasattr(profile, "read"): - self._set(core.profile_frombytes(profile.read())) - elif isinstance(profile, core.CmsProfile): - self._set(profile) - else: - msg = "Invalid type for Profile" # type: ignore[unreachable] - raise TypeError(msg) - - def _set(self, profile: core.CmsProfile, filename: str | None = None) -> None: - self.profile = profile - self.filename = filename - self.product_name = None # profile.product_name - self.product_info = None # profile.product_info - - def tobytes(self) -> bytes: - """ - Returns the profile in a format suitable for embedding in - saved images. - - :returns: a bytes object containing the ICC profile. - """ - - return core.profile_tobytes(self.profile) - - -class ImageCmsTransform(Image.ImagePointHandler): - """ - Transform. This can be used with the procedural API, or with the standard - :py:func:`~PIL.Image.Image.point` method. - - Will return the output profile in the ``output.info['icc_profile']``. - """ - - def __init__( - self, - input: ImageCmsProfile, - output: ImageCmsProfile, - input_mode: str, - output_mode: str, - intent: Intent = Intent.PERCEPTUAL, - proof: ImageCmsProfile | None = None, - proof_intent: Intent = Intent.ABSOLUTE_COLORIMETRIC, - flags: Flags = Flags.NONE, - ): - if proof is None: - self.transform = core.buildTransform( - input.profile, output.profile, input_mode, output_mode, intent, flags - ) - else: - self.transform = core.buildProofTransform( - input.profile, - output.profile, - proof.profile, - input_mode, - output_mode, - intent, - proof_intent, - flags, - ) - # Note: inputMode and outputMode are for pyCMS compatibility only - self.input_mode = self.inputMode = input_mode - self.output_mode = self.outputMode = output_mode - - self.output_profile = output - - def point(self, im: Image.Image) -> Image.Image: - return self.apply(im) - - def apply(self, im: Image.Image, imOut: Image.Image | None = None) -> Image.Image: - im.load() - if imOut is None: - imOut = Image.new(self.output_mode, im.size, None) - self.transform.apply(im.im.id, imOut.im.id) - imOut.info["icc_profile"] = self.output_profile.tobytes() - return imOut - - def apply_in_place(self, im: Image.Image) -> Image.Image: - im.load() - if im.mode != self.output_mode: - msg = "mode mismatch" - raise ValueError(msg) # wrong output mode - self.transform.apply(im.im.id, im.im.id) - im.info["icc_profile"] = self.output_profile.tobytes() - return im - - -def get_display_profile(handle: SupportsInt | None = None) -> ImageCmsProfile | None: - """ - (experimental) Fetches the profile for the current display device. - - :returns: ``None`` if the profile is not known. - """ - - if sys.platform != "win32": - return None - - from . import ImageWin # type: ignore[unused-ignore, unreachable] - - if isinstance(handle, ImageWin.HDC): - profile = core.get_display_profile_win32(int(handle), 1) - else: - profile = core.get_display_profile_win32(int(handle or 0)) - if profile is None: - return None - return ImageCmsProfile(profile) - - -# --------------------------------------------------------------------. -# pyCMS compatible layer -# --------------------------------------------------------------------. - -_CmsProfileCompatible = Union[ - str, SupportsRead[bytes], core.CmsProfile, ImageCmsProfile -] - - -class PyCMSError(Exception): - """(pyCMS) Exception class. - This is used for all errors in the pyCMS API.""" - - pass - - -def profileToProfile( - im: Image.Image, - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - renderingIntent: Intent = Intent.PERCEPTUAL, - outputMode: str | None = None, - inPlace: bool = False, - flags: Flags = Flags.NONE, -) -> Image.Image | None: - """ - (pyCMS) Applies an ICC transformation to a given image, mapping from - ``inputProfile`` to ``outputProfile``. - - If the input or output profiles specified are not valid filenames, a - :exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and - ``outputMode != im.mode``, a :exc:`PyCMSError` will be raised. - If an error occurs during application of the profiles, - a :exc:`PyCMSError` will be raised. - If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS), - a :exc:`PyCMSError` will be raised. - - This function applies an ICC transformation to im from ``inputProfile``'s - color space to ``outputProfile``'s color space using the specified rendering - intent to decide how to handle out-of-gamut colors. - - ``outputMode`` can be used to specify that a color mode conversion is to - be done using these profiles, but the specified profiles must be able - to handle that mode. I.e., if converting im from RGB to CMYK using - profiles, the input profile must handle RGB data, and the output - profile must handle CMYK data. - - :param im: An open :py:class:`~PIL.Image.Image` object (i.e. Image.new(...) - or Image.open(...), etc.) - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this image, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - profile you wish to use for this image, or a profile object - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param outputMode: A valid PIL mode for the output image (i.e. "RGB", - "CMYK", etc.). Note: if rendering the image "inPlace", outputMode - MUST be the same mode as the input, or omitted completely. If - omitted, the outputMode will be the same as the mode of the input - image (im.mode) - :param inPlace: Boolean. If ``True``, the original image is modified in-place, - and ``None`` is returned. If ``False`` (default), a new - :py:class:`~PIL.Image.Image` object is returned with the transform applied. - :param flags: Integer (0-...) specifying additional flags - :returns: Either None or a new :py:class:`~PIL.Image.Image` object, depending on - the value of ``inPlace`` - :exception PyCMSError: - """ - - if outputMode is None: - outputMode = im.mode - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - transform = ImageCmsTransform( - inputProfile, - outputProfile, - im.mode, - outputMode, - renderingIntent, - flags=flags, - ) - if inPlace: - transform.apply_in_place(im) - imOut = None - else: - imOut = transform.apply(im) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def getOpenProfile( - profileFilename: str | SupportsRead[bytes] | core.CmsProfile, -) -> ImageCmsProfile: - """ - (pyCMS) Opens an ICC profile file. - - The PyCMSProfile object can be passed back into pyCMS for use in creating - transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). - - If ``profileFilename`` is not a valid filename for an ICC profile, - a :exc:`PyCMSError` will be raised. - - :param profileFilename: String, as a valid filename path to the ICC profile - you wish to open, or a file-like object. - :returns: A CmsProfile class object. - :exception PyCMSError: - """ - - try: - return ImageCmsProfile(profileFilename) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildTransform( - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - inMode: str, - outMode: str, - renderingIntent: Intent = Intent.PERCEPTUAL, - flags: Flags = Flags.NONE, -) -> ImageCmsTransform: - """ - (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the - ``outputProfile``. Use applyTransform to apply the transform to a given - image. - - If the input or output profiles specified are not valid filenames, a - :exc:`PyCMSError` will be raised. If an error occurs during creation - of the transform, a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`PyCMSError` will be raised. - - This function builds and returns an ICC transform from the ``inputProfile`` - to the ``outputProfile`` using the ``renderingIntent`` to determine what to do - with out-of-gamut colors. It will ONLY work for converting images that - are in ``inMode`` to images that are in ``outMode`` color format (PIL mode, - i.e. "RGB", "RGBA", "CMYK", etc.). - - Building the transform is a fair part of the overhead in - ImageCms.profileToProfile(), so if you're planning on converting multiple - images using the same input/output settings, this can save you time. - Once you have a transform object, it can be used with - ImageCms.applyProfile() to convert images without the need to re-compute - the lookup table for the transform. - - The reason pyCMS returns a class object rather than a handle directly - to the transform is that it needs to keep track of the PIL input/output - modes that the transform is meant for. These attributes are stored in - the ``inMode`` and ``outMode`` attributes of the object (which can be - manually overridden if you really want to, but I don't know of any - time that would be of use, or would even work). - - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - profile you wish to use for this transform, or a profile object - :param inMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param outMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param flags: Integer (0-...) specifying additional flags - :returns: A CmsTransform class object. - :exception PyCMSError: - """ - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - return ImageCmsTransform( - inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags - ) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildProofTransform( - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - proofProfile: _CmsProfileCompatible, - inMode: str, - outMode: str, - renderingIntent: Intent = Intent.PERCEPTUAL, - proofRenderingIntent: Intent = Intent.ABSOLUTE_COLORIMETRIC, - flags: Flags = Flags.SOFTPROOFING, -) -> ImageCmsTransform: - """ - (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the - ``outputProfile``, but tries to simulate the result that would be - obtained on the ``proofProfile`` device. - - If the input, output, or proof profiles specified are not valid - filenames, a :exc:`PyCMSError` will be raised. - - If an error occurs during creation of the transform, - a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`PyCMSError` will be raised. - - This function builds and returns an ICC transform from the ``inputProfile`` - to the ``outputProfile``, but tries to simulate the result that would be - obtained on the ``proofProfile`` device using ``renderingIntent`` and - ``proofRenderingIntent`` to determine what to do with out-of-gamut - colors. This is known as "soft-proofing". It will ONLY work for - converting images that are in ``inMode`` to images that are in outMode - color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). - - Usage of the resulting transform object is exactly the same as with - ImageCms.buildTransform(). - - Proof profiling is generally used when using an output device to get a - good idea of what the final printed/displayed image would look like on - the ``proofProfile`` device when it's quicker and easier to use the - output device for judging color. Generally, this means that the - output device is a monitor, or a dye-sub printer (etc.), and the simulated - device is something more expensive, complicated, or time consuming - (making it difficult to make a real print for color judgement purposes). - - Soft-proofing basically functions by adjusting the colors on the - output device to match the colors of the device being simulated. However, - when the simulated device has a much wider gamut than the output - device, you may obtain marginal results. - - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - (monitor, usually) profile you wish to use for this transform, or a - profile object - :param proofProfile: String, as a valid filename path to the ICC proof - profile you wish to use for this transform, or a profile object - :param inMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param outMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the input->proof (simulated) transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param proofRenderingIntent: Integer (0-3) specifying the rendering intent - you wish to use for proof->output transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param flags: Integer (0-...) specifying additional flags - :returns: A CmsTransform class object. - :exception PyCMSError: - """ - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - if not isinstance(proofProfile, ImageCmsProfile): - proofProfile = ImageCmsProfile(proofProfile) - return ImageCmsTransform( - inputProfile, - outputProfile, - inMode, - outMode, - renderingIntent, - proofProfile, - proofRenderingIntent, - flags, - ) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -buildTransformFromOpenProfiles = buildTransform -buildProofTransformFromOpenProfiles = buildProofTransform - - -def applyTransform( - im: Image.Image, transform: ImageCmsTransform, inPlace: bool = False -) -> Image.Image | None: - """ - (pyCMS) Applies a transform to a given image. - - If ``im.mode != transform.inMode``, a :exc:`PyCMSError` is raised. - - If ``inPlace`` is ``True`` and ``transform.inMode != transform.outMode``, a - :exc:`PyCMSError` is raised. - - If ``im.mode``, ``transform.inMode`` or ``transform.outMode`` is not - supported by pyCMSdll or the profiles you used for the transform, a - :exc:`PyCMSError` is raised. - - If an error occurs while the transform is being applied, - a :exc:`PyCMSError` is raised. - - This function applies a pre-calculated transform (from - ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) - to an image. The transform can be used for multiple images, saving - considerable calculation time if doing the same conversion multiple times. - - If you want to modify im in-place instead of receiving a new image as - the return value, set ``inPlace`` to ``True``. This can only be done if - ``transform.inMode`` and ``transform.outMode`` are the same, because we can't - change the mode in-place (the buffer sizes for some modes are - different). The default behavior is to return a new :py:class:`~PIL.Image.Image` - object of the same dimensions in mode ``transform.outMode``. - - :param im: An :py:class:`~PIL.Image.Image` object, and im.mode must be the same - as the ``inMode`` supported by the transform. - :param transform: A valid CmsTransform class object - :param inPlace: Bool. If ``True``, ``im`` is modified in place and ``None`` is - returned, if ``False``, a new :py:class:`~PIL.Image.Image` object with the - transform applied is returned (and ``im`` is not changed). The default is - ``False``. - :returns: Either ``None``, or a new :py:class:`~PIL.Image.Image` object, - depending on the value of ``inPlace``. The profile will be returned in - the image's ``info['icc_profile']``. - :exception PyCMSError: - """ - - try: - if inPlace: - transform.apply_in_place(im) - imOut = None - else: - imOut = transform.apply(im) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def createProfile( - colorSpace: Literal["LAB", "XYZ", "sRGB"], colorTemp: SupportsFloat = -1 -) -> core.CmsProfile: - """ - (pyCMS) Creates a profile. - - If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, - a :exc:`PyCMSError` is raised. - - If using LAB and ``colorTemp`` is not a positive integer, - a :exc:`PyCMSError` is raised. - - If an error occurs while creating the profile, - a :exc:`PyCMSError` is raised. - - Use this function to create common profiles on-the-fly instead of - having to supply a profile on disk and knowing the path to it. It - returns a normal CmsProfile object that can be passed to - ImageCms.buildTransformFromOpenProfiles() to create a transform to apply - to images. - - :param colorSpace: String, the color space of the profile you wish to - create. - Currently only "LAB", "XYZ", and "sRGB" are supported. - :param colorTemp: Positive integer for the white point for the profile, in - degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 - illuminant if omitted (5000k). colorTemp is ONLY applied to LAB - profiles, and is ignored for XYZ and sRGB. - :returns: A CmsProfile class object - :exception PyCMSError: - """ - - if colorSpace not in ["LAB", "XYZ", "sRGB"]: - msg = ( - f"Color space not supported for on-the-fly profile creation ({colorSpace})" - ) - raise PyCMSError(msg) - - if colorSpace == "LAB": - try: - colorTemp = float(colorTemp) - except (TypeError, ValueError) as e: - msg = f'Color temperature must be numeric, "{colorTemp}" not valid' - raise PyCMSError(msg) from e - - try: - return core.createProfile(colorSpace, colorTemp) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileName(profile: _CmsProfileCompatible) -> str: - """ - - (pyCMS) Gets the internal product name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised If an error occurs while trying - to obtain the name tag, a :exc:`PyCMSError` is raised. - - Use this function to obtain the INTERNAL name of the profile (stored - in an ICC tag in the profile itself), usually the one used when the - profile was originally created. Sometimes this tag also contains - additional information supplied by the creator. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal name of the profile as stored - in an ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # do it in python, not c. - # // name was "%s - %s" (model, manufacturer) || Description , - # // but if the Model and Manufacturer were the same or the model - # // was long, Just the model, in 1.x - model = profile.profile.model - manufacturer = profile.profile.manufacturer - - if not (model or manufacturer): - return (profile.profile.profile_description or "") + "\n" - if not manufacturer or len(model) > 30: # type: ignore[arg-type] - return model + "\n" # type: ignore[operator] - return f"{model} - {manufacturer}\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileInfo(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the internal product information for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the info tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - info tag. This often contains details about the profile, and how it - was created, as supplied by the creator. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # add an extra newline to preserve pyCMS compatibility - # Python, not C. the white point bits weren't working well, - # so skipping. - # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint - description = profile.profile.profile_description - cpright = profile.profile.copyright - elements = [element for element in (description, cpright) if element] - return "\r\n\r\n".join(elements) + "\r\n\r\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileCopyright(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the copyright for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the copyright tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - copyright tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.copyright or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileManufacturer(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the manufacturer for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the manufacturer tag, a - :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - manufacturer tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.manufacturer or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileModel(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the model for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the model tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - model tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.model or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileDescription(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the description for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the description tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - description tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in an - ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.profile_description or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getDefaultIntent(profile: _CmsProfileCompatible) -> int: - """ - (pyCMS) Gets the default intent name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the default intent, a - :exc:`PyCMSError` is raised. - - Use this function to determine the default (and usually best optimized) - rendering intent for this profile. Most profiles support multiple - rendering intents, but are intended mostly for one type of conversion. - If you wish to use a different intent than returned, use - ImageCms.isIntentSupported() to verify it will work first. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: Integer 0-3 specifying the default rendering intent for this - profile. - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return profile.profile.rendering_intent - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def isIntentSupported( - profile: _CmsProfileCompatible, intent: Intent, direction: Direction -) -> Literal[-1, 1]: - """ - (pyCMS) Checks if a given intent is supported. - - Use this function to verify that you can use your desired - ``intent`` with ``profile``, and that ``profile`` can be used for the - input/output/proof profile as you desire. - - Some profiles are created specifically for one "direction", can cannot - be used for others. Some profiles can only be used for certain - rendering intents, so it's best to either verify this before trying - to create a transform with them (using this function), or catch the - potential :exc:`PyCMSError` that will occur if they don't - support the modes you select. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :param intent: Integer (0-3) specifying the rendering intent you wish to - use with this profile - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param direction: Integer specifying if the profile is to be used for - input, output, or proof - - INPUT = 0 (or use ImageCms.Direction.INPUT) - OUTPUT = 1 (or use ImageCms.Direction.OUTPUT) - PROOF = 2 (or use ImageCms.Direction.PROOF) - - :returns: 1 if the intent/direction are supported, -1 if they are not. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # FIXME: I get different results for the same data w. different - # compilers. Bug in LittleCMS or in the binding? - if profile.profile.is_intent_supported(intent, direction): - return 1 - else: - return -1 - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def versions() -> tuple[str, str, str, str]: - """ - (pyCMS) Fetches versions. - """ - - deprecate( - "PIL.ImageCms.versions()", - 12, - '(PIL.features.version("littlecms2"), sys.version, PIL.__version__)', - ) - return _VERSION, core.littlecms_version, sys.version.split()[0], __version__ diff --git a/.flatpak-builder/cache/objects/90/6d304624399676c4e54d6067ca0483ebbeca417aedd7ef412ae0ee3fb9d7f5.dirtree b/.flatpak-builder/cache/objects/90/6d304624399676c4e54d6067ca0483ebbeca417aedd7ef412ae0ee3fb9d7f5.dirtree deleted file mode 100644 index a29d1b16fbc7a461b468cec494b10fda6f8f2080..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 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 diff --git a/.flatpak-builder/cache/objects/91/548b466719e4e32f88f93765375d31d8d5388ca6621f3511be81ef27a9d3dc.file b/.flatpak-builder/cache/objects/91/548b466719e4e32f88f93765375d31d8d5388ca6621f3511be81ef27a9d3dc.file deleted file mode 100644 index a06d4258a9f74af5265252f625ca91bf10055644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1823 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 diff --git a/.flatpak-builder/cache/objects/91/9f3baf822cce36e02aa0f27aa67580a25b37e4e71b09634c1b7c5a48b2b319.file b/.flatpak-builder/cache/objects/91/9f3baf822cce36e02aa0f27aa67580a25b37e4e71b09634c1b7c5a48b2b319.file deleted file mode 100644 index 3e4b11febefaf9ee9f15bed6c32fbba09df44a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3896 zcmd5;OKTff6ux)#u%q!qu^qpngo#@>5pkqgHYOOyi31?&27jnX0kjpxv7+SMae6i>_|CMiRPn~SU!gD z3A6WUG#@u7%>;ChdDTpreNSWgUTO8ix+JXuSP5wj!cwJ`gw-dl%dq;TH3VxwTEnmg zG4BZGO+sIRz6?DIJp?@lJ#3DD!_wE*r$4nFL#%1GQ?2<~x8_4>UaeYng|7*G+m7XB z-q6m{JWvhCaec$LUB^o+L9}WVo&;*mA*~mMTM2j}h^?;qmKVf@<=2E0L~O?|aGKy< zQJ?`9Zw|rOVjF;F;;@auDP=`ammMr9;xIfKtR39V8r5pHY_DdkYyM-`naj-1W)wMve?}>hly+V_y5S#3^+V{hwXY-q1HSx&;Zg+SVMV<8Q z7K|Y`s55s9wEM#ngCSkI3!~E|lW(vMzKzyhykRkw4k#n*FB2Nd zXRh;|C45gawA>weJld_<1#Q*#y|m`}!gflU?`npl)f~?*IhKil@U4<1G6^}sV$~2v zMJp^G_Aa=NZ`ckE4Clje)X^&K1KdT;Efzh?hwAExHQr4pha4zNUxp{o1#Nprk;gAa zV0(m#riFOM?Ae8~C1|JD@iwnQY_h)xSl?LP|M}5#{z{$NQ>UKK?y1v_=(NQ3R6%|5 zL7-|EhUmJo^jIP)#sHBRhv)z@?uAIE&_E$CCP`2jo+@0w{1>=p5Tzx}a!lKB&M_F* zmF1J6TeSoQVD9Xo>q_7G!}OiY{r}SU!EwPBv*&Wi+8Y3C>FfaOO3h;dyU^6Mk3$Qo zDdGAEPqZ0#>z~2feHn{4gGf)=5e(`LJYgg2;!wM&;EY=!Yj$ zS7wfkPeJh_vYY%PmLG*Ae8-$U+4IOqG<8J}se+ppPF zqx1QLecU+e*^hIc+-IGlm-A~>*Dex0{F8llgcv!ZPWC&O22NfbA+Uv`8xovP(1><{ Q&h4MF_21UDrjkeW4=(B~WdHyG diff --git a/.flatpak-builder/cache/objects/92/15c98584be827211e71ae25ef225deece6acb852d3f7284f5292b6849a8743.file b/.flatpak-builder/cache/objects/92/15c98584be827211e71ae25ef225deece6acb852d3f7284f5292b6849a8743.file deleted file mode 100644 index dc31754..0000000 --- a/.flatpak-builder/cache/objects/92/15c98584be827211e71ae25ef225deece6acb852d3f7284f5292b6849a8743.file +++ /dev/null @@ -1,52 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read simple, teragon-style palette files -# -# History: -# 97-08-23 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from ._binary import o8 - - -class PaletteFile: - """File handler for Teragon-style palette files.""" - - rawmode = "RGB" - - def __init__(self, fp): - self.palette = [(i, i, i) for i in range(256)] - - while True: - s = fp.readline() - - if not s: - break - if s[:1] == b"#": - continue - if len(s) > 100: - msg = "bad palette file" - raise SyntaxError(msg) - - v = [int(x) for x in s.split()] - try: - [i, r, g, b] = v - except ValueError: - [i, r] = v - g = b = r - - if 0 <= i <= 255: - self.palette[i] = o8(r) + o8(g) + o8(b) - - self.palette = b"".join(self.palette) - - def getpalette(self): - return self.palette, self.rawmode diff --git a/.flatpak-builder/cache/objects/92/3c0c63b78d986acec6f26984938f9427e206bfcd4855c475483ffea30e014b.file b/.flatpak-builder/cache/objects/92/3c0c63b78d986acec6f26984938f9427e206bfcd4855c475483ffea30e014b.file deleted file mode 100644 index a510bb2a72d46a6ad794d70088ff483f19f6fc2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3067 zcmai0&2Jk;6rb5$Z|wLpUyTDz<0fgT)5K{$T2v(}YC=groT#c1qyc0(o=v;p*kN{! z6w8);s89|ZKp-^-4&^{8>ZJ!xoZvrjQ4iKgMMy|U+_oxQa^k(&wOh9!*4f{CzxUqE zzIn4dFW-g3-6|m@(O3NA^xzHWZL*LEY9i zG)fe*LYQ`oFyCE;ko$1E*M`r~ST_sY((Z!ce#=ZYbf#oTGWaK2l2in9#bU|M*=DI| ztpN`dcsZNT7K_83sSdFj(pAh(G@HYg*I3EfaxgavOwE-cDIAbl(h^T$MFwZx1! z4J*&h9lOLUL+|q3&W^zoTP2>@24BLmxmmnnrG$o5sKAA9GgoBRLDVkq6pZ)4GMPxF zQXdHaX3jEXnAGgu9Yb^>;vk(Hc9|E2wpJ<{dHuP(F>R( zb(t=ho6|eH_RUgpE;TbVZJD+)wUf(#l)GVA(^oI0r!Q@TiZxB`>*fdIRu`k(5=)z`v(&KITxt>2q5w&SOC7DS4^XLMZrjLaMRzs}FHpIFdMKOy zxST6^9>|oH^4To!$4LeOz9%vjxe$(fB>}UumH_JQUsD@vXk(5R@{Ks86An|~kVF0h z-09`a@+E4op`-k`9$Ee^sOxQF18rR&wzrAVkK}916{Zv^Q)|?O6M^}@q)caBfPRpE z7N}CzU4h|S8rXth3$hT{!fjiGMZpteJ%GKe53rvN03Kq4fN?ei_zHU!@Gu(&JifWYlPI)npX4GblcZ9!%GIA zn+hMGeiy9w+nx+zNj4$xlWY<)pTf*RrcknJb_(tpHVgOM*O6LRwd?t(z4#0kfC}g@ zKO;F`nOHGwE0J>#Db_y0+YrhYu&YUpp8(bxCiO9NtJhYR zz?p12RY9)_x+3TjmjN0Ctan6cd;+8KSm2X52VH*_dj5Yx&wHWEtJkk|h6=hY=&GRC z1-;@1`K~W-F7u8kmCxf7mE}#ixf`aY&%dw)w?wB}33_1{Gw*cHCFn&#GlIV3H!#|B zKHDh8-BGzp=~Q6yoKUWwuc(XVSpXB@9BSvxS)r8SM$2M(9?bxYCTiw;AinJ>-7y?F5rZY(uy7R6j0-L+GQR2+t z@;prX8S zal^224!#O5+!gC*IP&V`Z$BA`f3UG|C?|loN|Kb2>pvAjE;ymJc=Yn0+B{^&gntYO9IhG?5xv= zq~9Y0NDg^q5J{W_VvU~HogpNLy$Obq9P!8ql2LEW7?N=k=xOwxagHH5?vdA!obX5z z$pi_68g}vmFu;7t$FJ71NKAkp?_*G@cG$&c)2 zosrl8JQtw83i-!|_uqaL9j#w{930vohhnSuG7nBX3@$thE;O_S+4$g7>Fj#$>(qrk zdaDfo%R!IkDtMxX!tjda)LuSrH4oqvwrOQC(g3{TMZ*E7ciQG$+gnl3t|1y5A4-5Pqq HD)amYi&VQ( diff --git a/.flatpak-builder/cache/objects/92/5a1442524ea428cc10dec131e5749742117f963a3f334ada6f7fd1db26b591.file b/.flatpak-builder/cache/objects/92/5a1442524ea428cc10dec131e5749742117f963a3f334ada6f7fd1db26b591.file deleted file mode 100644 index beae2ef..0000000 --- a/.flatpak-builder/cache/objects/92/5a1442524ea428cc10dec131e5749742117f963a3f334ada6f7fd1db26b591.file +++ /dev/null @@ -1,4 +0,0 @@ -from .cli import cli_detect - -if __name__ == "__main__": - cli_detect() diff --git a/.flatpak-builder/cache/objects/92/5b037a9bcebdec8a52e6d3889f501c748a8b6b12c425cf77abb21a7cf5d875.file b/.flatpak-builder/cache/objects/92/5b037a9bcebdec8a52e6d3889f501c748a8b6b12c425cf77abb21a7cf5d875.file deleted file mode 100644 index 099114f1704214d37b13fe7b0a961d96573efaf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5324 zcmcgwO>Er86&~)NR;$&Ir8-F2!XC?3;%%grm0E{vQmK-iI6to3Mru*0hYhu)B&u9; zGvwNpq6R+Xpo0%a(85I!phA(zHk^YFE#hMiEl?CaXpIFd5C~wPK+)Xf%Dv>&_hz`W zq;_T3J!G_e9L}5fW;pY{Zyt5CyE_vnglxV0{^!=b6o~>T`js!uFHb1yG57LduB5@$_HdVuE$`cxSuY*YARKQq87@ z7+t3(zE(aX`xGh~)5>&FD|rqp&?&lTIj|D;60JCTmF{d)nP`S&OwVoHMndC z=InaREb-VlY-)}TFJijFOLIL6%v-G(1zM=A7D|@px`lV%|M43a^E`@#d`G&>B^XA7 zpIopETlX`%v1Hf=(>%jZ@;%GN{Df;*i+)P%m5V_^>DS|o) z8+A?37^!HbU&3a)qcG?wA2f);d}Y<|2qI#wuMwH~phX40?sq|4CI5Mb^c}tS-tW$S zJbCNbn6X%JWC-(IXM`9o!ow3osO+P8<`v!Dq>5CI4!Xpjimf03CCAn(rI;LuUXiHMC56Os&E%KqQ@daf($qzE-pbbONZ zq{r5kO-WFVK6u}P>yB)=Ojw5=4_ksAj?+?rHx59^qZ*-L+NM`5uJ!OR%Qv3Kpu78X5Le0WQFSA6Ewg*#)JCG7KDOJ{bA9MW z{=j(ce!&vh(Qr%Oy*eJtqOoN;Xc*8vN~0rw%S-3<~2oEL(LCj%OC z1lbNyk`R!)02N({0wVgfB7NyGWMWbD_!?BAJ%1hZ5Gz4h!P)WxRG_S+8&B)8Xhzb0 zPGEuj%}aC?fNQ3q(G&1aU5%&ky@ggrfiR@qCPK8OfUnT}n`%7~ok8>ovREJuP8`V@ zhUX$fqFWO74<^}npqA?qG!h3IVYo1U0y9K*oL4bV5eIwRHm<-4Zmz*e04h!;>=<@R zSE`<7RhBhB1H4m$G|@J!T)fFL?0eA7#m$D)N}Qkw=(Qsa_(-Oi#*Q~ZNT&I+xBs^< z{bpiw=;p{DMz-U%!L#+jv$cWoI{pfG$La$=_#$2#I9KaEU++D?k@!+Q{&8;e+^wUZ zsoQfkwNO_J_toip>hu@me=gM2nYucItn;8Pab^3iUAmt=buW8r^QZTR#_tV{ZBwu*iM>*%fNzZc&$PYrD zaIQP@VGLLiRMaQq6`c5>KqY_b=?oj~O<){sItG#Q2+%cD2} zB7EBOBXw<{872~gv)I!F(ZnFf)T^Joxt;uD=I&HYov5o5-wcY*;M`HX1=s%JC`uxL zT7^In+W%iD>YQEHSOq`I*7hPGavSYW#84>LmPSzoJq3WOj6nt;r03dGKuCNnhAm!f zB-K=-d}8pmCcm!n3pkQbOT7IPmhvFpAg%*i0%fRpiRMESd(r3yw8>t07;j1pHEr8u z;)phB*B+tZt1Sv2pHhU-7Ml@3ON;X{waEX8!jKO9)a;KgU7CCSDUjALLrDS+L(*LY zA%V6F8T0T*!=JuafBq$Lc6~D_I}4LwD1LzzOr-^IuxTdOg`dWYRrp^Fd>S(#OX3s3 zJGd4+XAob+JR^S&+c<2w*J#rIb@~ - - - - diff --git a/.flatpak-builder/cache/objects/92/b1d71536ae534614509cc699eebda2f4223f784c755d7e42c8a189741e8919.dirtree b/.flatpak-builder/cache/objects/92/b1d71536ae534614509cc699eebda2f4223f784c755d7e42c8a189741e8919.dirtree deleted file mode 100644 index 2a9f4146a7f48a52c708b8cabc29d76ebb79ebfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmdN(&n(GI&&w}LW%!hs#G;a?yWV=?v>w6t`2sUiO_Vj-@A0~STCza-&L30m+|-i9 zl*E!mhS}C}PC3eFSuPuVljhj8+n#&n!*!kEGFQT+e=OV}7ypn`CoC;9C$*U2(0mv5 z6Ksq^j??B&+_MsxHbrEx MgiKLk@#u>H0L%GrY5)KL diff --git a/.flatpak-builder/cache/objects/93/b9ae70b1f3ddafc3bb0f392f3ed6495357a4d6c36feec5e730b2b6ea7638b7.dirtree b/.flatpak-builder/cache/objects/93/b9ae70b1f3ddafc3bb0f392f3ed6495357a4d6c36feec5e730b2b6ea7638b7.dirtree deleted file mode 100644 index ec5c41c4a19d59e6f1ea55711f16809c68c37113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmYdJEh@=O%VdbNs63(1$}OK0Y*N&oyt$Z%`v8kIFmm5i-ujRd4^E*8H`LWm4T0&jYcRg__q*zwm7(WQntKW=dWn!?lCn+f58C-c9=b&eD%uc@6lKW z_k#j$dV8Pg3#i!6Ty?y*fRLfa!bPctrK!aw#S8&^KJKhLX%Z_aYPnfFkx{2l>|meE zT;4o8bvOQ%$`acN8KubyGfLM;&)87U0Lhv84<&9yZ^)ni)A#DT3Tx-fO$j%B`+uFz zFUrVU_36!w+l0)vk}56A$;nJIW>BuWrzooPewXx<;^^s9T8$5Ap4|GXbGE<xnWVu1H3{fQBRxYTH!iuFAH3tz>P_qa$lY*c_Bi}e`|!h4@A_CDfBVaHr|INn fLMB^Ccrh$z_`{IMxPtL7qX*Lxrguyp%nS?wrWl^J diff --git a/.flatpak-builder/cache/objects/94/248d1e70f60699fffa6c293830d0f7700968557234c7c2c6f6162c0d959c70.file b/.flatpak-builder/cache/objects/94/248d1e70f60699fffa6c293830d0f7700968557234c7c2c6f6162c0d959c70.file deleted file mode 100644 index 91f538b..0000000 --- a/.flatpak-builder/cache/objects/94/248d1e70f60699fffa6c293830d0f7700968557234c7c2c6f6162c0d959c70.file +++ /dev/null @@ -1,114 +0,0 @@ -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem or its contents. -""" -import sys -import atexit - -def exit_cacert_ctx() -> None: - _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] - - -if sys.version_info >= (3, 11): - - from importlib.resources import as_file, files - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the file - # in cases where we're inside of a zipimport situation until someone - # actually calls where(), but we don't want to re-extract the file - # on every call of where(), so we'll do it once then store it in a - # global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you to - # manage the cleanup of this file, so it doesn't actually return a - # path, it returns a context manager that will give you the path - # when you enter it and will do any cleanup when you leave it. In - # the common case of not needing a temporary file, it will just - # return the file system location and the __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem")) - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - atexit.register(exit_cacert_ctx) - - return _CACERT_PATH - - def contents() -> str: - return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii") - -elif sys.version_info >= (3, 7): - - from importlib.resources import path as get_path, read_text - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the - # file in cases where we're inside of a zipimport situation until - # someone actually calls where(), but we don't want to re-extract - # the file on every call of where(), so we'll do it once then store - # it in a global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you - # to manage the cleanup of this file, so it doesn't actually - # return a path, it returns a context manager that will give - # you the path when you enter it and will do any cleanup when - # you leave it. In the common case of not needing a temporary - # file, it will just return the file system location and the - # __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = get_path("certifi", "cacert.pem") - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - atexit.register(exit_cacert_ctx) - - return _CACERT_PATH - - def contents() -> str: - return read_text("certifi", "cacert.pem", encoding="ascii") - -else: - import os - import types - from typing import Union - - Package = Union[types.ModuleType, str] - Resource = Union[str, "os.PathLike"] - - # This fallback will work for Python versions prior to 3.7 that lack the - # importlib.resources module but relies on the existing `where` function - # so won't address issues with environments like PyOxidizer that don't set - # __file__ on modules. - def read_text( - package: Package, - resource: Resource, - encoding: str = 'utf-8', - errors: str = 'strict' - ) -> str: - with open(where(), encoding=encoding) as data: - return data.read() - - # If we don't have importlib.resources, then we will just do the old logic - # of assuming we're on the filesystem and munge the path directly. - def where() -> str: - f = os.path.dirname(__file__) - - return os.path.join(f, "cacert.pem") - - def contents() -> str: - return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/.flatpak-builder/cache/objects/96/06628a91ebcdf8ba307f197a594d5c774c96259e62b27f814b390106dd247d.file b/.flatpak-builder/cache/objects/96/06628a91ebcdf8ba307f197a594d5c774c96259e62b27f814b390106dd247d.file deleted file mode 100644 index 7cf1969cf938bf866b6e947a4f6a514f5464c31e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2841 zcma(SOKcm*b!I>Oh+onC#jzZQa_lg*t*Sn#RX(Va*o*>2mTlQ_7HEl;W~r=9F6r47 zWDzn#1Svop1VR-8tV0X1fRorT0wh6zB)1%T$gNA4K!^nl2q<#UAt(dqluP?&Dbijm zPWyJ}&D(iz-oD?w`6v(=;t@i({{4^dx0nC<y0xDt&V?;Q@ z7q}uX@kK!rilQXiYeK&G7bM?fIIl^5o8#HD zXHp6%OrKlv5pP9AhzwOYgq(6V-~V`i1x&DI0=qK4y*ii-88^Vt?mNhxrx+?6Ti97bnSQ; zVm9vlhaopZ%t*^srb=GDVu=fDhN4?8su(L&vxJ3GsjxUm5lAv=82J9PK-@sEb%1*zM!88O5I#Zqc>G?6aTplZ^3uEOqZRbPL+Ed zy^9SN7vSUH9hU=5-TocasUT|91WbxetPMND5aj&D?AS%Y- zG$OR_u)rD3N8~&YEOpA|Inch_ClNAOLGHq`uTK%Lk?hkDVaV;BL4IL(pwA;i#0MD) z_P<#Va%7Ahq&?vD7vu-Mhls?J=kvl6Bz5xisT5UYqH0TfMJaP;XB3cy=P0WXi$9xv+2X0Zn&E7&jWQ97%a`rL zYY9x75%oR&Sv3ONuw60bZ%CbpQ>__go zshN}W^CvBLxz`RYfk{|`p%e<1VDA(R@CO>Hpeu#E#TWG@3+p{Vo)57@Mm%*8jZToZ5J2^PN`cNIP_-i#YFS zCvvp*%Du?Q)?zD?Zb#ClKizd9Z=mk})|0&JNwz%u+n)WVXMfk_^2R&i=%)MIaO!S2 z)e5KE;dE`Pvo8vY0!KRW-#7Ss@u!=kt@z<~{ID55+zEvn!*!!UuUBf7PB_*LfQoJe z1%mHquV=4K*QehkR$`)^n1D6^cKpe$3r%uUZHZ}<%XGZ5i+FOIiZoIRQc2;lnNkAEw<;mqVxv1oF)=-XRbEUv&e=c`< zMK0`eT=^0$%7zu`%{ijzi%w(~{VX|&N%AoSk>st%q`AYMJydE%HU z#Jj=)@jULLU&1}DOyO)su&*l04p7hj2vAVAV0C^4u1T<(vbwPlW$lTw{$m#-TulqA zCet;_?p?~d0DTUSB~n>~%NtV*L)9(V#cvyK1*o#5>V`t?5~CAr3v=Xwmp^%4=*8+K z`Z6%s1**${yFA9Ydl=zS6Qv)1x6x7a@oxtuOy|4pjZ|Gwl)hlq-SGx%vD)Qp$$GMj zL>#nHb*dAH)Xq1?uU)KP>>@#gWk5CD8ICt%jmsO!O_1ijunY)FHa^k`M;csXYKz~< zHu1(wy<%>jZJxa~eCyop#3yHN2V2ifw4a%1g(tpD!y|t^`qk1mPk;5t*5pika;6oY z`GMyW!CJPK?ea`D&wd-kIMqc?6i#85+@HsdwRYmUA8h824~x8x5sp^HHri)K54EGe UGLOCZtviq5uE@ diff --git a/.flatpak-builder/cache/objects/96/26985ba4bb0934c77233f9c5e793b819a3f555060389006f2c14484cb6beaa.file b/.flatpak-builder/cache/objects/96/26985ba4bb0934c77233f9c5e793b819a3f555060389006f2c14484cb6beaa.file deleted file mode 100644 index 29a5c99..0000000 --- a/.flatpak-builder/cache/objects/96/26985ba4bb0934c77233f9c5e793b819a3f555060389006f2c14484cb6beaa.file +++ /dev/null @@ -1,311 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard channel operations -# -# History: -# 1996-03-24 fl Created -# 1996-08-13 fl Added logical operations (for "1" images) -# 2000-10-12 fl Added offset method (from Image.py) -# -# Copyright (c) 1997-2000 by Secret Labs AB -# Copyright (c) 1996-2000 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from __future__ import annotations - -from . import Image - - -def constant(image: Image.Image, value: int) -> Image.Image: - """Fill a channel with a given gray level. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.new("L", image.size, value) - - -def duplicate(image: Image.Image) -> Image.Image: - """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return image.copy() - - -def invert(image: Image.Image) -> Image.Image: - """ - Invert an image (channel). :: - - out = MAX - image - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image.load() - return image._new(image.im.chop_invert()) - - -def lighter(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Compares the two images, pixel by pixel, and returns a new image containing - the lighter values. :: - - out = max(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_lighter(image2.im)) - - -def darker(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Compares the two images, pixel by pixel, and returns a new image containing - the darker values. :: - - out = min(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_darker(image2.im)) - - -def difference(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Returns the absolute value of the pixel-by-pixel difference between the two - images. :: - - out = abs(image1 - image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_difference(image2.im)) - - -def multiply(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other. - - If you multiply an image with a solid black image, the result is black. If - you multiply with a solid white image, the image is unaffected. :: - - out = image1 * image2 / MAX - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_multiply(image2.im)) - - -def screen(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two inverted images on top of each other. :: - - out = MAX - ((MAX - image1) * (MAX - image2) / MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_screen(image2.im)) - - -def soft_light(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Soft Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_soft_light(image2.im)) - - -def hard_light(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Hard Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_hard_light(image2.im)) - - -def overlay(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Overlay algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_overlay(image2.im)) - - -def add( - image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 -) -> Image.Image: - """ - Adds two images, dividing the result by scale and adding the - offset. If omitted, scale defaults to 1.0, and offset to 0.0. :: - - out = ((image1 + image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add(image2.im, scale, offset)) - - -def subtract( - image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 -) -> Image.Image: - """ - Subtracts two images, dividing the result by scale and adding the offset. - If omitted, scale defaults to 1.0, and offset to 0.0. :: - - out = ((image1 - image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) - - -def add_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Add two images, without clipping the result. :: - - out = ((image1 + image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add_modulo(image2.im)) - - -def subtract_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Subtract two images, without clipping the result. :: - - out = ((image1 - image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract_modulo(image2.im)) - - -def logical_and(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical AND between two images. - - Both of the images must have mode "1". If you would like to perform a - logical AND on an image with a mode other than "1", try - :py:meth:`~PIL.ImageChops.multiply` instead, using a black-and-white mask - as the second image. :: - - out = ((image1 and image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_and(image2.im)) - - -def logical_or(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical OR between two images. - - Both of the images must have mode "1". :: - - out = ((image1 or image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_or(image2.im)) - - -def logical_xor(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical XOR between two images. - - Both of the images must have mode "1". :: - - out = ((bool(image1) != bool(image2)) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_xor(image2.im)) - - -def blend(image1: Image.Image, image2: Image.Image, alpha: float) -> Image.Image: - """Blend images using constant transparency weight. Alias for - :py:func:`PIL.Image.blend`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.blend(image1, image2, alpha) - - -def composite( - image1: Image.Image, image2: Image.Image, mask: Image.Image -) -> Image.Image: - """Create composite using transparency mask. Alias for - :py:func:`PIL.Image.composite`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.composite(image1, image2, mask) - - -def offset(image: Image.Image, xoffset: int, yoffset: int | None = None) -> Image.Image: - """Returns a copy of the image where data has been offset by the given - distances. Data wraps around the edges. If ``yoffset`` is omitted, it - is assumed to be equal to ``xoffset``. - - :param image: Input image. - :param xoffset: The horizontal distance. - :param yoffset: The vertical distance. If omitted, both - distances are set to the same value. - :rtype: :py:class:`~PIL.Image.Image` - """ - - if yoffset is None: - yoffset = xoffset - image.load() - return image._new(image.im.offset(xoffset, yoffset)) diff --git a/.flatpak-builder/cache/objects/96/4eae8e2e143a2aede48fef8f22728fdd9a9b48b51181935db3219abbbaee26.file b/.flatpak-builder/cache/objects/96/4eae8e2e143a2aede48fef8f22728fdd9a9b48b51181935db3219abbbaee26.file deleted file mode 100755 index 426c662..0000000 --- a/.flatpak-builder/cache/objects/96/4eae8e2e143a2aede48fef8f22728fdd9a9b48b51181935db3219abbbaee26.file +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -import re -import sys -from charset_normalizer.cli import cli_detect -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(cli_detect()) diff --git a/.flatpak-builder/cache/objects/96/fbb5df5b106e257c7e38ca977237b8cb5020c8a406a08e0b39787d388c91a7.commit b/.flatpak-builder/cache/objects/96/fbb5df5b106e257c7e38ca977237b8cb5020c8a406a08e0b39787d388c91a7.commit deleted file mode 100644 index 6f0b91e20198e75d8ee901a18319cf823f271dd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 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 QtLNUW+++SBzsLOl0LUmtlmGw# diff --git a/.flatpak-builder/cache/objects/99/7434ebf4caa567864ef676f626dc6b1f45ba98271e547d261d186d5f066888.file b/.flatpak-builder/cache/objects/99/7434ebf4caa567864ef676f626dc6b1f45ba98271e547d261d186d5f066888.file deleted file mode 100644 index 5f3ea3d..0000000 --- a/.flatpak-builder/cache/objects/99/7434ebf4caa567864ef676f626dc6b1f45ba98271e547d261d186d5f066888.file +++ /dev/null @@ -1,2 +0,0 @@ -# Instruct type checkers to look for inline type annotations in this package. -# See PEP 561. diff --git a/.flatpak-builder/cache/objects/9a/4756cb4d6d40384a0d126fa13f0543c72f676dfe11f8ee1c136ebf287d3cab.file b/.flatpak-builder/cache/objects/9a/4756cb4d6d40384a0d126fa13f0543c72f676dfe11f8ee1c136ebf287d3cab.file deleted file mode 100644 index 8471973025fd451991df08b3e6961205ae053ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6138 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 List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x0, '3'), - (0x1, '3'), - (0x2, '3'), - (0x3, '3'), - (0x4, '3'), - (0x5, '3'), - (0x6, '3'), - (0x7, '3'), - (0x8, '3'), - (0x9, '3'), - (0xA, '3'), - (0xB, '3'), - (0xC, '3'), - (0xD, '3'), - (0xE, '3'), - (0xF, '3'), - (0x10, '3'), - (0x11, '3'), - (0x12, '3'), - (0x13, '3'), - (0x14, '3'), - (0x15, '3'), - (0x16, '3'), - (0x17, '3'), - (0x18, '3'), - (0x19, '3'), - (0x1A, '3'), - (0x1B, '3'), - (0x1C, '3'), - (0x1D, '3'), - (0x1E, '3'), - (0x1F, '3'), - (0x20, '3'), - (0x21, '3'), - (0x22, '3'), - (0x23, '3'), - (0x24, '3'), - (0x25, '3'), - (0x26, '3'), - (0x27, '3'), - (0x28, '3'), - (0x29, '3'), - (0x2A, '3'), - (0x2B, '3'), - (0x2C, '3'), - (0x2D, 'V'), - (0x2E, 'V'), - (0x2F, '3'), - (0x30, 'V'), - (0x31, 'V'), - (0x32, 'V'), - (0x33, 'V'), - (0x34, 'V'), - (0x35, 'V'), - (0x36, 'V'), - (0x37, 'V'), - (0x38, 'V'), - (0x39, 'V'), - (0x3A, '3'), - (0x3B, '3'), - (0x3C, '3'), - (0x3D, '3'), - (0x3E, '3'), - (0x3F, '3'), - (0x40, '3'), - (0x41, 'M', 'a'), - (0x42, 'M', 'b'), - (0x43, 'M', 'c'), - (0x44, 'M', 'd'), - (0x45, 'M', 'e'), - (0x46, 'M', 'f'), - (0x47, 'M', 'g'), - (0x48, 'M', 'h'), - (0x49, 'M', 'i'), - (0x4A, 'M', 'j'), - (0x4B, 'M', 'k'), - (0x4C, 'M', 'l'), - (0x4D, 'M', 'm'), - (0x4E, 'M', 'n'), - (0x4F, 'M', 'o'), - (0x50, 'M', 'p'), - (0x51, 'M', 'q'), - (0x52, 'M', 'r'), - (0x53, 'M', 's'), - (0x54, 'M', 't'), - (0x55, 'M', 'u'), - (0x56, 'M', 'v'), - (0x57, 'M', 'w'), - (0x58, 'M', 'x'), - (0x59, 'M', 'y'), - (0x5A, 'M', 'z'), - (0x5B, '3'), - (0x5C, '3'), - (0x5D, '3'), - (0x5E, '3'), - (0x5F, '3'), - (0x60, '3'), - (0x61, 'V'), - (0x62, 'V'), - (0x63, 'V'), - ] - -def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x64, 'V'), - (0x65, 'V'), - (0x66, 'V'), - (0x67, 'V'), - (0x68, 'V'), - (0x69, 'V'), - (0x6A, 'V'), - (0x6B, 'V'), - (0x6C, 'V'), - (0x6D, 'V'), - (0x6E, 'V'), - (0x6F, 'V'), - (0x70, 'V'), - (0x71, 'V'), - (0x72, 'V'), - (0x73, 'V'), - (0x74, 'V'), - (0x75, 'V'), - (0x76, 'V'), - (0x77, 'V'), - (0x78, 'V'), - (0x79, 'V'), - (0x7A, 'V'), - (0x7B, '3'), - (0x7C, '3'), - (0x7D, '3'), - (0x7E, '3'), - (0x7F, '3'), - (0x80, 'X'), - (0x81, 'X'), - (0x82, 'X'), - (0x83, 'X'), - (0x84, 'X'), - (0x85, 'X'), - (0x86, 'X'), - (0x87, 'X'), - (0x88, 'X'), - (0x89, 'X'), - (0x8A, 'X'), - (0x8B, 'X'), - (0x8C, 'X'), - (0x8D, 'X'), - (0x8E, 'X'), - (0x8F, 'X'), - (0x90, 'X'), - (0x91, 'X'), - (0x92, 'X'), - (0x93, 'X'), - (0x94, 'X'), - (0x95, 'X'), - (0x96, 'X'), - (0x97, 'X'), - (0x98, 'X'), - (0x99, 'X'), - (0x9A, 'X'), - (0x9B, 'X'), - (0x9C, 'X'), - (0x9D, 'X'), - (0x9E, 'X'), - (0x9F, 'X'), - (0xA0, '3', ' '), - (0xA1, 'V'), - (0xA2, 'V'), - (0xA3, 'V'), - (0xA4, 'V'), - (0xA5, 'V'), - (0xA6, 'V'), - (0xA7, 'V'), - (0xA8, '3', ' ̈'), - (0xA9, 'V'), - (0xAA, 'M', 'a'), - (0xAB, 'V'), - (0xAC, 'V'), - (0xAD, 'I'), - (0xAE, 'V'), - (0xAF, '3', ' ̄'), - (0xB0, 'V'), - (0xB1, 'V'), - (0xB2, 'M', '2'), - (0xB3, 'M', '3'), - (0xB4, '3', ' ́'), - (0xB5, 'M', 'μ'), - (0xB6, 'V'), - (0xB7, 'V'), - (0xB8, '3', ' ̧'), - (0xB9, 'M', '1'), - (0xBA, 'M', 'o'), - (0xBB, 'V'), - (0xBC, 'M', '1⁄4'), - (0xBD, 'M', '1⁄2'), - (0xBE, 'M', '3⁄4'), - (0xBF, 'V'), - (0xC0, 'M', 'à'), - (0xC1, 'M', 'á'), - (0xC2, 'M', 'â'), - (0xC3, 'M', 'ã'), - (0xC4, 'M', 'ä'), - (0xC5, 'M', 'å'), - (0xC6, 'M', 'æ'), - (0xC7, 'M', 'ç'), - ] - -def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xC8, 'M', 'è'), - (0xC9, 'M', 'é'), - (0xCA, 'M', 'ê'), - (0xCB, 'M', 'ë'), - (0xCC, 'M', 'ì'), - (0xCD, 'M', 'í'), - (0xCE, 'M', 'î'), - (0xCF, 'M', 'ï'), - (0xD0, 'M', 'ð'), - (0xD1, 'M', 'ñ'), - (0xD2, 'M', 'ò'), - (0xD3, 'M', 'ó'), - (0xD4, 'M', 'ô'), - (0xD5, 'M', 'õ'), - (0xD6, 'M', 'ö'), - (0xD7, 'V'), - (0xD8, 'M', 'ø'), - (0xD9, 'M', 'ù'), - (0xDA, 'M', 'ú'), - (0xDB, 'M', 'û'), - (0xDC, 'M', 'ü'), - (0xDD, 'M', 'ý'), - (0xDE, 'M', 'þ'), - (0xDF, 'D', 'ss'), - (0xE0, 'V'), - (0xE1, 'V'), - (0xE2, 'V'), - (0xE3, 'V'), - (0xE4, 'V'), - (0xE5, 'V'), - (0xE6, 'V'), - (0xE7, 'V'), - (0xE8, 'V'), - (0xE9, 'V'), - (0xEA, 'V'), - (0xEB, 'V'), - (0xEC, 'V'), - (0xED, 'V'), - (0xEE, 'V'), - (0xEF, 'V'), - (0xF0, 'V'), - (0xF1, 'V'), - (0xF2, 'V'), - (0xF3, 'V'), - (0xF4, 'V'), - (0xF5, 'V'), - (0xF6, 'V'), - (0xF7, 'V'), - (0xF8, 'V'), - (0xF9, 'V'), - (0xFA, 'V'), - (0xFB, 'V'), - (0xFC, 'V'), - (0xFD, 'V'), - (0xFE, 'V'), - (0xFF, 'V'), - (0x100, 'M', 'ā'), - (0x101, 'V'), - (0x102, 'M', 'ă'), - (0x103, 'V'), - (0x104, 'M', 'ą'), - (0x105, 'V'), - (0x106, 'M', 'ć'), - (0x107, 'V'), - (0x108, 'M', 'ĉ'), - (0x109, 'V'), - (0x10A, 'M', 'ċ'), - (0x10B, 'V'), - (0x10C, 'M', 'č'), - (0x10D, 'V'), - (0x10E, 'M', 'ď'), - (0x10F, 'V'), - (0x110, 'M', 'đ'), - (0x111, 'V'), - (0x112, 'M', 'ē'), - (0x113, 'V'), - (0x114, 'M', 'ĕ'), - (0x115, 'V'), - (0x116, 'M', 'ė'), - (0x117, 'V'), - (0x118, 'M', 'ę'), - (0x119, 'V'), - (0x11A, 'M', 'ě'), - (0x11B, 'V'), - (0x11C, 'M', 'ĝ'), - (0x11D, 'V'), - (0x11E, 'M', 'ğ'), - (0x11F, 'V'), - (0x120, 'M', 'ġ'), - (0x121, 'V'), - (0x122, 'M', 'ģ'), - (0x123, 'V'), - (0x124, 'M', 'ĥ'), - (0x125, 'V'), - (0x126, 'M', 'ħ'), - (0x127, 'V'), - (0x128, 'M', 'ĩ'), - (0x129, 'V'), - (0x12A, 'M', 'ī'), - (0x12B, 'V'), - ] - -def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x12C, 'M', 'ĭ'), - (0x12D, 'V'), - (0x12E, 'M', 'į'), - (0x12F, 'V'), - (0x130, 'M', 'i̇'), - (0x131, 'V'), - (0x132, 'M', 'ij'), - (0x134, 'M', 'ĵ'), - (0x135, 'V'), - (0x136, 'M', 'ķ'), - (0x137, 'V'), - (0x139, 'M', 'ĺ'), - (0x13A, 'V'), - (0x13B, 'M', 'ļ'), - (0x13C, 'V'), - (0x13D, 'M', 'ľ'), - (0x13E, 'V'), - (0x13F, 'M', 'l·'), - (0x141, 'M', 'ł'), - (0x142, 'V'), - (0x143, 'M', 'ń'), - (0x144, 'V'), - (0x145, 'M', 'ņ'), - (0x146, 'V'), - (0x147, 'M', 'ň'), - (0x148, 'V'), - (0x149, 'M', 'ʼn'), - (0x14A, 'M', 'ŋ'), - (0x14B, 'V'), - (0x14C, 'M', 'ō'), - (0x14D, 'V'), - (0x14E, 'M', 'ŏ'), - (0x14F, 'V'), - (0x150, 'M', 'ő'), - (0x151, 'V'), - (0x152, 'M', 'œ'), - (0x153, 'V'), - (0x154, 'M', 'ŕ'), - (0x155, 'V'), - (0x156, 'M', 'ŗ'), - (0x157, 'V'), - (0x158, 'M', 'ř'), - (0x159, 'V'), - (0x15A, 'M', 'ś'), - (0x15B, 'V'), - (0x15C, 'M', 'ŝ'), - (0x15D, 'V'), - (0x15E, 'M', 'ş'), - (0x15F, 'V'), - (0x160, 'M', 'š'), - (0x161, 'V'), - (0x162, 'M', 'ţ'), - (0x163, 'V'), - (0x164, 'M', 'ť'), - (0x165, 'V'), - (0x166, 'M', 'ŧ'), - (0x167, 'V'), - (0x168, 'M', 'ũ'), - (0x169, 'V'), - (0x16A, 'M', 'ū'), - (0x16B, 'V'), - (0x16C, 'M', 'ŭ'), - (0x16D, 'V'), - (0x16E, 'M', 'ů'), - (0x16F, 'V'), - (0x170, 'M', 'ű'), - (0x171, 'V'), - (0x172, 'M', 'ų'), - (0x173, 'V'), - (0x174, 'M', 'ŵ'), - (0x175, 'V'), - (0x176, 'M', 'ŷ'), - (0x177, 'V'), - (0x178, 'M', 'ÿ'), - (0x179, 'M', 'ź'), - (0x17A, 'V'), - (0x17B, 'M', 'ż'), - (0x17C, 'V'), - (0x17D, 'M', 'ž'), - (0x17E, 'V'), - (0x17F, 'M', 's'), - (0x180, 'V'), - (0x181, 'M', 'ɓ'), - (0x182, 'M', 'ƃ'), - (0x183, 'V'), - (0x184, 'M', 'ƅ'), - (0x185, 'V'), - (0x186, 'M', 'ɔ'), - (0x187, 'M', 'ƈ'), - (0x188, 'V'), - (0x189, 'M', 'ɖ'), - (0x18A, 'M', 'ɗ'), - (0x18B, 'M', 'ƌ'), - (0x18C, 'V'), - (0x18E, 'M', 'ǝ'), - (0x18F, 'M', 'ə'), - (0x190, 'M', 'ɛ'), - (0x191, 'M', 'ƒ'), - (0x192, 'V'), - (0x193, 'M', 'ɠ'), - ] - -def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x194, 'M', 'ɣ'), - (0x195, 'V'), - (0x196, 'M', 'ɩ'), - (0x197, 'M', 'ɨ'), - (0x198, 'M', 'ƙ'), - (0x199, 'V'), - (0x19C, 'M', 'ɯ'), - (0x19D, 'M', 'ɲ'), - (0x19E, 'V'), - (0x19F, 'M', 'ɵ'), - (0x1A0, 'M', 'ơ'), - (0x1A1, 'V'), - (0x1A2, 'M', 'ƣ'), - (0x1A3, 'V'), - (0x1A4, 'M', 'ƥ'), - (0x1A5, 'V'), - (0x1A6, 'M', 'ʀ'), - (0x1A7, 'M', 'ƨ'), - (0x1A8, 'V'), - (0x1A9, 'M', 'ʃ'), - (0x1AA, 'V'), - (0x1AC, 'M', 'ƭ'), - (0x1AD, 'V'), - (0x1AE, 'M', 'ʈ'), - (0x1AF, 'M', 'ư'), - (0x1B0, 'V'), - (0x1B1, 'M', 'ʊ'), - (0x1B2, 'M', 'ʋ'), - (0x1B3, 'M', 'ƴ'), - (0x1B4, 'V'), - (0x1B5, 'M', 'ƶ'), - (0x1B6, 'V'), - (0x1B7, 'M', 'ʒ'), - (0x1B8, 'M', 'ƹ'), - (0x1B9, 'V'), - (0x1BC, 'M', 'ƽ'), - (0x1BD, 'V'), - (0x1C4, 'M', 'dž'), - (0x1C7, 'M', 'lj'), - (0x1CA, 'M', 'nj'), - (0x1CD, 'M', 'ǎ'), - (0x1CE, 'V'), - (0x1CF, 'M', 'ǐ'), - (0x1D0, 'V'), - (0x1D1, 'M', 'ǒ'), - (0x1D2, 'V'), - (0x1D3, 'M', 'ǔ'), - (0x1D4, 'V'), - (0x1D5, 'M', 'ǖ'), - (0x1D6, 'V'), - (0x1D7, 'M', 'ǘ'), - (0x1D8, 'V'), - (0x1D9, 'M', 'ǚ'), - (0x1DA, 'V'), - (0x1DB, 'M', 'ǜ'), - (0x1DC, 'V'), - (0x1DE, 'M', 'ǟ'), - (0x1DF, 'V'), - (0x1E0, 'M', 'ǡ'), - (0x1E1, 'V'), - (0x1E2, 'M', 'ǣ'), - (0x1E3, 'V'), - (0x1E4, 'M', 'ǥ'), - (0x1E5, 'V'), - (0x1E6, 'M', 'ǧ'), - (0x1E7, 'V'), - (0x1E8, 'M', 'ǩ'), - (0x1E9, 'V'), - (0x1EA, 'M', 'ǫ'), - (0x1EB, 'V'), - (0x1EC, 'M', 'ǭ'), - (0x1ED, 'V'), - (0x1EE, 'M', 'ǯ'), - (0x1EF, 'V'), - (0x1F1, 'M', 'dz'), - (0x1F4, 'M', 'ǵ'), - (0x1F5, 'V'), - (0x1F6, 'M', 'ƕ'), - (0x1F7, 'M', 'ƿ'), - (0x1F8, 'M', 'ǹ'), - (0x1F9, 'V'), - (0x1FA, 'M', 'ǻ'), - (0x1FB, 'V'), - (0x1FC, 'M', 'ǽ'), - (0x1FD, 'V'), - (0x1FE, 'M', 'ǿ'), - (0x1FF, 'V'), - (0x200, 'M', 'ȁ'), - (0x201, 'V'), - (0x202, 'M', 'ȃ'), - (0x203, 'V'), - (0x204, 'M', 'ȅ'), - (0x205, 'V'), - (0x206, 'M', 'ȇ'), - (0x207, 'V'), - (0x208, 'M', 'ȉ'), - (0x209, 'V'), - (0x20A, 'M', 'ȋ'), - (0x20B, 'V'), - (0x20C, 'M', 'ȍ'), - ] - -def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x20D, 'V'), - (0x20E, 'M', 'ȏ'), - (0x20F, 'V'), - (0x210, 'M', 'ȑ'), - (0x211, 'V'), - (0x212, 'M', 'ȓ'), - (0x213, 'V'), - (0x214, 'M', 'ȕ'), - (0x215, 'V'), - (0x216, 'M', 'ȗ'), - (0x217, 'V'), - (0x218, 'M', 'ș'), - (0x219, 'V'), - (0x21A, 'M', 'ț'), - (0x21B, 'V'), - (0x21C, 'M', 'ȝ'), - (0x21D, 'V'), - (0x21E, 'M', 'ȟ'), - (0x21F, 'V'), - (0x220, 'M', 'ƞ'), - (0x221, 'V'), - (0x222, 'M', 'ȣ'), - (0x223, 'V'), - (0x224, 'M', 'ȥ'), - (0x225, 'V'), - (0x226, 'M', 'ȧ'), - (0x227, 'V'), - (0x228, 'M', 'ȩ'), - (0x229, 'V'), - (0x22A, 'M', 'ȫ'), - (0x22B, 'V'), - (0x22C, 'M', 'ȭ'), - (0x22D, 'V'), - (0x22E, 'M', 'ȯ'), - (0x22F, 'V'), - (0x230, 'M', 'ȱ'), - (0x231, 'V'), - (0x232, 'M', 'ȳ'), - (0x233, 'V'), - (0x23A, 'M', 'ⱥ'), - (0x23B, 'M', 'ȼ'), - (0x23C, 'V'), - (0x23D, 'M', 'ƚ'), - (0x23E, 'M', 'ⱦ'), - (0x23F, 'V'), - (0x241, 'M', 'ɂ'), - (0x242, 'V'), - (0x243, 'M', 'ƀ'), - (0x244, 'M', 'ʉ'), - (0x245, 'M', 'ʌ'), - (0x246, 'M', 'ɇ'), - (0x247, 'V'), - (0x248, 'M', 'ɉ'), - (0x249, 'V'), - (0x24A, 'M', 'ɋ'), - (0x24B, 'V'), - (0x24C, 'M', 'ɍ'), - (0x24D, 'V'), - (0x24E, 'M', 'ɏ'), - (0x24F, 'V'), - (0x2B0, 'M', 'h'), - (0x2B1, 'M', 'ɦ'), - (0x2B2, 'M', 'j'), - (0x2B3, 'M', 'r'), - (0x2B4, 'M', 'ɹ'), - (0x2B5, 'M', 'ɻ'), - (0x2B6, 'M', 'ʁ'), - (0x2B7, 'M', 'w'), - (0x2B8, 'M', 'y'), - (0x2B9, 'V'), - (0x2D8, '3', ' ̆'), - (0x2D9, '3', ' ̇'), - (0x2DA, '3', ' ̊'), - (0x2DB, '3', ' ̨'), - (0x2DC, '3', ' ̃'), - (0x2DD, '3', ' ̋'), - (0x2DE, 'V'), - (0x2E0, 'M', 'ɣ'), - (0x2E1, 'M', 'l'), - (0x2E2, 'M', 's'), - (0x2E3, 'M', 'x'), - (0x2E4, 'M', 'ʕ'), - (0x2E5, 'V'), - (0x340, 'M', '̀'), - (0x341, 'M', '́'), - (0x342, 'V'), - (0x343, 'M', '̓'), - (0x344, 'M', '̈́'), - (0x345, 'M', 'ι'), - (0x346, 'V'), - (0x34F, 'I'), - (0x350, 'V'), - (0x370, 'M', 'ͱ'), - (0x371, 'V'), - (0x372, 'M', 'ͳ'), - (0x373, 'V'), - (0x374, 'M', 'ʹ'), - (0x375, 'V'), - (0x376, 'M', 'ͷ'), - (0x377, 'V'), - ] - -def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x378, 'X'), - (0x37A, '3', ' ι'), - (0x37B, 'V'), - (0x37E, '3', ';'), - (0x37F, 'M', 'ϳ'), - (0x380, 'X'), - (0x384, '3', ' ́'), - (0x385, '3', ' ̈́'), - (0x386, 'M', 'ά'), - (0x387, 'M', '·'), - (0x388, 'M', 'έ'), - (0x389, 'M', 'ή'), - (0x38A, 'M', 'ί'), - (0x38B, 'X'), - (0x38C, 'M', 'ό'), - (0x38D, 'X'), - (0x38E, 'M', 'ύ'), - (0x38F, 'M', 'ώ'), - (0x390, 'V'), - (0x391, 'M', 'α'), - (0x392, 'M', 'β'), - (0x393, 'M', 'γ'), - (0x394, 'M', 'δ'), - (0x395, 'M', 'ε'), - (0x396, 'M', 'ζ'), - (0x397, 'M', 'η'), - (0x398, 'M', 'θ'), - (0x399, 'M', 'ι'), - (0x39A, 'M', 'κ'), - (0x39B, 'M', 'λ'), - (0x39C, 'M', 'μ'), - (0x39D, 'M', 'ν'), - (0x39E, 'M', 'ξ'), - (0x39F, 'M', 'ο'), - (0x3A0, 'M', 'π'), - (0x3A1, 'M', 'ρ'), - (0x3A2, 'X'), - (0x3A3, 'M', 'σ'), - (0x3A4, 'M', 'τ'), - (0x3A5, 'M', 'υ'), - (0x3A6, 'M', 'φ'), - (0x3A7, 'M', 'χ'), - (0x3A8, 'M', 'ψ'), - (0x3A9, 'M', 'ω'), - (0x3AA, 'M', 'ϊ'), - (0x3AB, 'M', 'ϋ'), - (0x3AC, 'V'), - (0x3C2, 'D', 'σ'), - (0x3C3, 'V'), - (0x3CF, 'M', 'ϗ'), - (0x3D0, 'M', 'β'), - (0x3D1, 'M', 'θ'), - (0x3D2, 'M', 'υ'), - (0x3D3, 'M', 'ύ'), - (0x3D4, 'M', 'ϋ'), - (0x3D5, 'M', 'φ'), - (0x3D6, 'M', 'π'), - (0x3D7, 'V'), - (0x3D8, 'M', 'ϙ'), - (0x3D9, 'V'), - (0x3DA, 'M', 'ϛ'), - (0x3DB, 'V'), - (0x3DC, 'M', 'ϝ'), - (0x3DD, 'V'), - (0x3DE, 'M', 'ϟ'), - (0x3DF, 'V'), - (0x3E0, 'M', 'ϡ'), - (0x3E1, 'V'), - (0x3E2, 'M', 'ϣ'), - (0x3E3, 'V'), - (0x3E4, 'M', 'ϥ'), - (0x3E5, 'V'), - (0x3E6, 'M', 'ϧ'), - (0x3E7, 'V'), - (0x3E8, 'M', 'ϩ'), - (0x3E9, 'V'), - (0x3EA, 'M', 'ϫ'), - (0x3EB, 'V'), - (0x3EC, 'M', 'ϭ'), - (0x3ED, 'V'), - (0x3EE, 'M', 'ϯ'), - (0x3EF, 'V'), - (0x3F0, 'M', 'κ'), - (0x3F1, 'M', 'ρ'), - (0x3F2, 'M', 'σ'), - (0x3F3, 'V'), - (0x3F4, 'M', 'θ'), - (0x3F5, 'M', 'ε'), - (0x3F6, 'V'), - (0x3F7, 'M', 'ϸ'), - (0x3F8, 'V'), - (0x3F9, 'M', 'σ'), - (0x3FA, 'M', 'ϻ'), - (0x3FB, 'V'), - (0x3FD, 'M', 'ͻ'), - (0x3FE, 'M', 'ͼ'), - (0x3FF, 'M', 'ͽ'), - (0x400, 'M', 'ѐ'), - (0x401, 'M', 'ё'), - (0x402, 'M', 'ђ'), - ] - -def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x403, 'M', 'ѓ'), - (0x404, 'M', 'є'), - (0x405, 'M', 'ѕ'), - (0x406, 'M', 'і'), - (0x407, 'M', 'ї'), - (0x408, 'M', 'ј'), - (0x409, 'M', 'љ'), - (0x40A, 'M', 'њ'), - (0x40B, 'M', 'ћ'), - (0x40C, 'M', 'ќ'), - (0x40D, 'M', 'ѝ'), - (0x40E, 'M', 'ў'), - (0x40F, 'M', 'џ'), - (0x410, 'M', 'а'), - (0x411, 'M', 'б'), - (0x412, 'M', 'в'), - (0x413, 'M', 'г'), - (0x414, 'M', 'д'), - (0x415, 'M', 'е'), - (0x416, 'M', 'ж'), - (0x417, 'M', 'з'), - (0x418, 'M', 'и'), - (0x419, 'M', 'й'), - (0x41A, 'M', 'к'), - (0x41B, 'M', 'л'), - (0x41C, 'M', 'м'), - (0x41D, 'M', 'н'), - (0x41E, 'M', 'о'), - (0x41F, 'M', 'п'), - (0x420, 'M', 'р'), - (0x421, 'M', 'с'), - (0x422, 'M', 'т'), - (0x423, 'M', 'у'), - (0x424, 'M', 'ф'), - (0x425, 'M', 'х'), - (0x426, 'M', 'ц'), - (0x427, 'M', 'ч'), - (0x428, 'M', 'ш'), - (0x429, 'M', 'щ'), - (0x42A, 'M', 'ъ'), - (0x42B, 'M', 'ы'), - (0x42C, 'M', 'ь'), - (0x42D, 'M', 'э'), - (0x42E, 'M', 'ю'), - (0x42F, 'M', 'я'), - (0x430, 'V'), - (0x460, 'M', 'ѡ'), - (0x461, 'V'), - (0x462, 'M', 'ѣ'), - (0x463, 'V'), - (0x464, 'M', 'ѥ'), - (0x465, 'V'), - (0x466, 'M', 'ѧ'), - (0x467, 'V'), - (0x468, 'M', 'ѩ'), - (0x469, 'V'), - (0x46A, 'M', 'ѫ'), - (0x46B, 'V'), - (0x46C, 'M', 'ѭ'), - (0x46D, 'V'), - (0x46E, 'M', 'ѯ'), - (0x46F, 'V'), - (0x470, 'M', 'ѱ'), - (0x471, 'V'), - (0x472, 'M', 'ѳ'), - (0x473, 'V'), - (0x474, 'M', 'ѵ'), - (0x475, 'V'), - (0x476, 'M', 'ѷ'), - (0x477, 'V'), - (0x478, 'M', 'ѹ'), - (0x479, 'V'), - (0x47A, 'M', 'ѻ'), - (0x47B, 'V'), - (0x47C, 'M', 'ѽ'), - (0x47D, 'V'), - (0x47E, 'M', 'ѿ'), - (0x47F, 'V'), - (0x480, 'M', 'ҁ'), - (0x481, 'V'), - (0x48A, 'M', 'ҋ'), - (0x48B, 'V'), - (0x48C, 'M', 'ҍ'), - (0x48D, 'V'), - (0x48E, 'M', 'ҏ'), - (0x48F, 'V'), - (0x490, 'M', 'ґ'), - (0x491, 'V'), - (0x492, 'M', 'ғ'), - (0x493, 'V'), - (0x494, 'M', 'ҕ'), - (0x495, 'V'), - (0x496, 'M', 'җ'), - (0x497, 'V'), - (0x498, 'M', 'ҙ'), - (0x499, 'V'), - (0x49A, 'M', 'қ'), - (0x49B, 'V'), - (0x49C, 'M', 'ҝ'), - (0x49D, 'V'), - ] - -def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x49E, 'M', 'ҟ'), - (0x49F, 'V'), - (0x4A0, 'M', 'ҡ'), - (0x4A1, 'V'), - (0x4A2, 'M', 'ң'), - (0x4A3, 'V'), - (0x4A4, 'M', 'ҥ'), - (0x4A5, 'V'), - (0x4A6, 'M', 'ҧ'), - (0x4A7, 'V'), - (0x4A8, 'M', 'ҩ'), - (0x4A9, 'V'), - (0x4AA, 'M', 'ҫ'), - (0x4AB, 'V'), - (0x4AC, 'M', 'ҭ'), - (0x4AD, 'V'), - (0x4AE, 'M', 'ү'), - (0x4AF, 'V'), - (0x4B0, 'M', 'ұ'), - (0x4B1, 'V'), - (0x4B2, 'M', 'ҳ'), - (0x4B3, 'V'), - (0x4B4, 'M', 'ҵ'), - (0x4B5, 'V'), - (0x4B6, 'M', 'ҷ'), - (0x4B7, 'V'), - (0x4B8, 'M', 'ҹ'), - (0x4B9, 'V'), - (0x4BA, 'M', 'һ'), - (0x4BB, 'V'), - (0x4BC, 'M', 'ҽ'), - (0x4BD, 'V'), - (0x4BE, 'M', 'ҿ'), - (0x4BF, 'V'), - (0x4C0, 'X'), - (0x4C1, 'M', 'ӂ'), - (0x4C2, 'V'), - (0x4C3, 'M', 'ӄ'), - (0x4C4, 'V'), - (0x4C5, 'M', 'ӆ'), - (0x4C6, 'V'), - (0x4C7, 'M', 'ӈ'), - (0x4C8, 'V'), - (0x4C9, 'M', 'ӊ'), - (0x4CA, 'V'), - (0x4CB, 'M', 'ӌ'), - (0x4CC, 'V'), - (0x4CD, 'M', 'ӎ'), - (0x4CE, 'V'), - (0x4D0, 'M', 'ӑ'), - (0x4D1, 'V'), - (0x4D2, 'M', 'ӓ'), - (0x4D3, 'V'), - (0x4D4, 'M', 'ӕ'), - (0x4D5, 'V'), - (0x4D6, 'M', 'ӗ'), - (0x4D7, 'V'), - (0x4D8, 'M', 'ә'), - (0x4D9, 'V'), - (0x4DA, 'M', 'ӛ'), - (0x4DB, 'V'), - (0x4DC, 'M', 'ӝ'), - (0x4DD, 'V'), - (0x4DE, 'M', 'ӟ'), - (0x4DF, 'V'), - (0x4E0, 'M', 'ӡ'), - (0x4E1, 'V'), - (0x4E2, 'M', 'ӣ'), - (0x4E3, 'V'), - (0x4E4, 'M', 'ӥ'), - (0x4E5, 'V'), - (0x4E6, 'M', 'ӧ'), - (0x4E7, 'V'), - (0x4E8, 'M', 'ө'), - (0x4E9, 'V'), - (0x4EA, 'M', 'ӫ'), - (0x4EB, 'V'), - (0x4EC, 'M', 'ӭ'), - (0x4ED, 'V'), - (0x4EE, 'M', 'ӯ'), - (0x4EF, 'V'), - (0x4F0, 'M', 'ӱ'), - (0x4F1, 'V'), - (0x4F2, 'M', 'ӳ'), - (0x4F3, 'V'), - (0x4F4, 'M', 'ӵ'), - (0x4F5, 'V'), - (0x4F6, 'M', 'ӷ'), - (0x4F7, 'V'), - (0x4F8, 'M', 'ӹ'), - (0x4F9, 'V'), - (0x4FA, 'M', 'ӻ'), - (0x4FB, 'V'), - (0x4FC, 'M', 'ӽ'), - (0x4FD, 'V'), - (0x4FE, 'M', 'ӿ'), - (0x4FF, 'V'), - (0x500, 'M', 'ԁ'), - (0x501, 'V'), - (0x502, 'M', 'ԃ'), - ] - -def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x503, 'V'), - (0x504, 'M', 'ԅ'), - (0x505, 'V'), - (0x506, 'M', 'ԇ'), - (0x507, 'V'), - (0x508, 'M', 'ԉ'), - (0x509, 'V'), - (0x50A, 'M', 'ԋ'), - (0x50B, 'V'), - (0x50C, 'M', 'ԍ'), - (0x50D, 'V'), - (0x50E, 'M', 'ԏ'), - (0x50F, 'V'), - (0x510, 'M', 'ԑ'), - (0x511, 'V'), - (0x512, 'M', 'ԓ'), - (0x513, 'V'), - (0x514, 'M', 'ԕ'), - (0x515, 'V'), - (0x516, 'M', 'ԗ'), - (0x517, 'V'), - (0x518, 'M', 'ԙ'), - (0x519, 'V'), - (0x51A, 'M', 'ԛ'), - (0x51B, 'V'), - (0x51C, 'M', 'ԝ'), - (0x51D, 'V'), - (0x51E, 'M', 'ԟ'), - (0x51F, 'V'), - (0x520, 'M', 'ԡ'), - (0x521, 'V'), - (0x522, 'M', 'ԣ'), - (0x523, 'V'), - (0x524, 'M', 'ԥ'), - (0x525, 'V'), - (0x526, 'M', 'ԧ'), - (0x527, 'V'), - (0x528, 'M', 'ԩ'), - (0x529, 'V'), - (0x52A, 'M', 'ԫ'), - (0x52B, 'V'), - (0x52C, 'M', 'ԭ'), - (0x52D, 'V'), - (0x52E, 'M', 'ԯ'), - (0x52F, 'V'), - (0x530, 'X'), - (0x531, 'M', 'ա'), - (0x532, 'M', 'բ'), - (0x533, 'M', 'գ'), - (0x534, 'M', 'դ'), - (0x535, 'M', 'ե'), - (0x536, 'M', 'զ'), - (0x537, 'M', 'է'), - (0x538, 'M', 'ը'), - (0x539, 'M', 'թ'), - (0x53A, 'M', 'ժ'), - (0x53B, 'M', 'ի'), - (0x53C, 'M', 'լ'), - (0x53D, 'M', 'խ'), - (0x53E, 'M', 'ծ'), - (0x53F, 'M', 'կ'), - (0x540, 'M', 'հ'), - (0x541, 'M', 'ձ'), - (0x542, 'M', 'ղ'), - (0x543, 'M', 'ճ'), - (0x544, 'M', 'մ'), - (0x545, 'M', 'յ'), - (0x546, 'M', 'ն'), - (0x547, 'M', 'շ'), - (0x548, 'M', 'ո'), - (0x549, 'M', 'չ'), - (0x54A, 'M', 'պ'), - (0x54B, 'M', 'ջ'), - (0x54C, 'M', 'ռ'), - (0x54D, 'M', 'ս'), - (0x54E, 'M', 'վ'), - (0x54F, 'M', 'տ'), - (0x550, 'M', 'ր'), - (0x551, 'M', 'ց'), - (0x552, 'M', 'ւ'), - (0x553, 'M', 'փ'), - (0x554, 'M', 'ք'), - (0x555, 'M', 'օ'), - (0x556, 'M', 'ֆ'), - (0x557, 'X'), - (0x559, 'V'), - (0x587, 'M', 'եւ'), - (0x588, 'V'), - (0x58B, 'X'), - (0x58D, 'V'), - (0x590, 'X'), - (0x591, 'V'), - (0x5C8, 'X'), - (0x5D0, 'V'), - (0x5EB, 'X'), - (0x5EF, 'V'), - (0x5F5, 'X'), - (0x606, 'V'), - (0x61C, 'X'), - (0x61D, 'V'), - ] - -def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x675, 'M', 'اٴ'), - (0x676, 'M', 'وٴ'), - (0x677, 'M', 'ۇٴ'), - (0x678, 'M', 'يٴ'), - (0x679, 'V'), - (0x6DD, 'X'), - (0x6DE, 'V'), - (0x70E, 'X'), - (0x710, 'V'), - (0x74B, 'X'), - (0x74D, 'V'), - (0x7B2, 'X'), - (0x7C0, 'V'), - (0x7FB, 'X'), - (0x7FD, 'V'), - (0x82E, 'X'), - (0x830, 'V'), - (0x83F, 'X'), - (0x840, 'V'), - (0x85C, 'X'), - (0x85E, 'V'), - (0x85F, 'X'), - (0x860, 'V'), - (0x86B, 'X'), - (0x870, 'V'), - (0x88F, 'X'), - (0x898, 'V'), - (0x8E2, 'X'), - (0x8E3, 'V'), - (0x958, 'M', 'क़'), - (0x959, 'M', 'ख़'), - (0x95A, 'M', 'ग़'), - (0x95B, 'M', 'ज़'), - (0x95C, 'M', 'ड़'), - (0x95D, 'M', 'ढ़'), - (0x95E, 'M', 'फ़'), - (0x95F, 'M', 'य़'), - (0x960, 'V'), - (0x984, 'X'), - (0x985, 'V'), - (0x98D, 'X'), - (0x98F, 'V'), - (0x991, 'X'), - (0x993, 'V'), - (0x9A9, 'X'), - (0x9AA, 'V'), - (0x9B1, 'X'), - (0x9B2, 'V'), - (0x9B3, 'X'), - (0x9B6, 'V'), - (0x9BA, 'X'), - (0x9BC, 'V'), - (0x9C5, 'X'), - (0x9C7, 'V'), - (0x9C9, 'X'), - (0x9CB, 'V'), - (0x9CF, 'X'), - (0x9D7, 'V'), - (0x9D8, 'X'), - (0x9DC, 'M', 'ড়'), - (0x9DD, 'M', 'ঢ়'), - (0x9DE, 'X'), - (0x9DF, 'M', 'য়'), - (0x9E0, 'V'), - (0x9E4, 'X'), - (0x9E6, 'V'), - (0x9FF, 'X'), - (0xA01, 'V'), - (0xA04, 'X'), - (0xA05, 'V'), - (0xA0B, 'X'), - (0xA0F, 'V'), - (0xA11, 'X'), - (0xA13, 'V'), - (0xA29, 'X'), - (0xA2A, 'V'), - (0xA31, 'X'), - (0xA32, 'V'), - (0xA33, 'M', 'ਲ਼'), - (0xA34, 'X'), - (0xA35, 'V'), - (0xA36, 'M', 'ਸ਼'), - (0xA37, 'X'), - (0xA38, 'V'), - (0xA3A, 'X'), - (0xA3C, 'V'), - (0xA3D, 'X'), - (0xA3E, 'V'), - (0xA43, 'X'), - (0xA47, 'V'), - (0xA49, 'X'), - (0xA4B, 'V'), - (0xA4E, 'X'), - (0xA51, 'V'), - (0xA52, 'X'), - (0xA59, 'M', 'ਖ਼'), - (0xA5A, 'M', 'ਗ਼'), - (0xA5B, 'M', 'ਜ਼'), - (0xA5C, 'V'), - (0xA5D, 'X'), - ] - -def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA5E, 'M', 'ਫ਼'), - (0xA5F, 'X'), - (0xA66, 'V'), - (0xA77, 'X'), - (0xA81, 'V'), - (0xA84, 'X'), - (0xA85, 'V'), - (0xA8E, 'X'), - (0xA8F, 'V'), - (0xA92, 'X'), - (0xA93, 'V'), - (0xAA9, 'X'), - (0xAAA, 'V'), - (0xAB1, 'X'), - (0xAB2, 'V'), - (0xAB4, 'X'), - (0xAB5, 'V'), - (0xABA, 'X'), - (0xABC, 'V'), - (0xAC6, 'X'), - (0xAC7, 'V'), - (0xACA, 'X'), - (0xACB, 'V'), - (0xACE, 'X'), - (0xAD0, 'V'), - (0xAD1, 'X'), - (0xAE0, 'V'), - (0xAE4, 'X'), - (0xAE6, 'V'), - (0xAF2, 'X'), - (0xAF9, 'V'), - (0xB00, 'X'), - (0xB01, 'V'), - (0xB04, 'X'), - (0xB05, 'V'), - (0xB0D, 'X'), - (0xB0F, 'V'), - (0xB11, 'X'), - (0xB13, 'V'), - (0xB29, 'X'), - (0xB2A, 'V'), - (0xB31, 'X'), - (0xB32, 'V'), - (0xB34, 'X'), - (0xB35, 'V'), - (0xB3A, 'X'), - (0xB3C, 'V'), - (0xB45, 'X'), - (0xB47, 'V'), - (0xB49, 'X'), - (0xB4B, 'V'), - (0xB4E, 'X'), - (0xB55, 'V'), - (0xB58, 'X'), - (0xB5C, 'M', 'ଡ଼'), - (0xB5D, 'M', 'ଢ଼'), - (0xB5E, 'X'), - (0xB5F, 'V'), - (0xB64, 'X'), - (0xB66, 'V'), - (0xB78, 'X'), - (0xB82, 'V'), - (0xB84, 'X'), - (0xB85, 'V'), - (0xB8B, 'X'), - (0xB8E, 'V'), - (0xB91, 'X'), - (0xB92, 'V'), - (0xB96, 'X'), - (0xB99, 'V'), - (0xB9B, 'X'), - (0xB9C, 'V'), - (0xB9D, 'X'), - (0xB9E, 'V'), - (0xBA0, 'X'), - (0xBA3, 'V'), - (0xBA5, 'X'), - (0xBA8, 'V'), - (0xBAB, 'X'), - (0xBAE, 'V'), - (0xBBA, 'X'), - (0xBBE, 'V'), - (0xBC3, 'X'), - (0xBC6, 'V'), - (0xBC9, 'X'), - (0xBCA, 'V'), - (0xBCE, 'X'), - (0xBD0, 'V'), - (0xBD1, 'X'), - (0xBD7, 'V'), - (0xBD8, 'X'), - (0xBE6, 'V'), - (0xBFB, 'X'), - (0xC00, 'V'), - (0xC0D, 'X'), - (0xC0E, 'V'), - (0xC11, 'X'), - (0xC12, 'V'), - (0xC29, 'X'), - (0xC2A, 'V'), - ] - -def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xC3A, 'X'), - (0xC3C, 'V'), - (0xC45, 'X'), - (0xC46, 'V'), - (0xC49, 'X'), - (0xC4A, 'V'), - (0xC4E, 'X'), - (0xC55, 'V'), - (0xC57, 'X'), - (0xC58, 'V'), - (0xC5B, 'X'), - (0xC5D, 'V'), - (0xC5E, 'X'), - (0xC60, 'V'), - (0xC64, 'X'), - (0xC66, 'V'), - (0xC70, 'X'), - (0xC77, 'V'), - (0xC8D, 'X'), - (0xC8E, 'V'), - (0xC91, 'X'), - (0xC92, 'V'), - (0xCA9, 'X'), - (0xCAA, 'V'), - (0xCB4, 'X'), - (0xCB5, 'V'), - (0xCBA, 'X'), - (0xCBC, 'V'), - (0xCC5, 'X'), - (0xCC6, 'V'), - (0xCC9, 'X'), - (0xCCA, 'V'), - (0xCCE, 'X'), - (0xCD5, 'V'), - (0xCD7, 'X'), - (0xCDD, 'V'), - (0xCDF, 'X'), - (0xCE0, 'V'), - (0xCE4, 'X'), - (0xCE6, 'V'), - (0xCF0, 'X'), - (0xCF1, 'V'), - (0xCF4, 'X'), - (0xD00, 'V'), - (0xD0D, 'X'), - (0xD0E, 'V'), - (0xD11, 'X'), - (0xD12, 'V'), - (0xD45, 'X'), - (0xD46, 'V'), - (0xD49, 'X'), - (0xD4A, 'V'), - (0xD50, 'X'), - (0xD54, 'V'), - (0xD64, 'X'), - (0xD66, 'V'), - (0xD80, 'X'), - (0xD81, 'V'), - (0xD84, 'X'), - (0xD85, 'V'), - (0xD97, 'X'), - (0xD9A, 'V'), - (0xDB2, 'X'), - (0xDB3, 'V'), - (0xDBC, 'X'), - (0xDBD, 'V'), - (0xDBE, 'X'), - (0xDC0, 'V'), - (0xDC7, 'X'), - (0xDCA, 'V'), - (0xDCB, 'X'), - (0xDCF, 'V'), - (0xDD5, 'X'), - (0xDD6, 'V'), - (0xDD7, 'X'), - (0xDD8, 'V'), - (0xDE0, 'X'), - (0xDE6, 'V'), - (0xDF0, 'X'), - (0xDF2, 'V'), - (0xDF5, 'X'), - (0xE01, 'V'), - (0xE33, 'M', 'ํา'), - (0xE34, 'V'), - (0xE3B, 'X'), - (0xE3F, 'V'), - (0xE5C, 'X'), - (0xE81, 'V'), - (0xE83, 'X'), - (0xE84, 'V'), - (0xE85, 'X'), - (0xE86, 'V'), - (0xE8B, 'X'), - (0xE8C, 'V'), - (0xEA4, 'X'), - (0xEA5, 'V'), - (0xEA6, 'X'), - (0xEA7, 'V'), - (0xEB3, 'M', 'ໍາ'), - (0xEB4, 'V'), - ] - -def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xEBE, 'X'), - (0xEC0, 'V'), - (0xEC5, 'X'), - (0xEC6, 'V'), - (0xEC7, 'X'), - (0xEC8, 'V'), - (0xECF, 'X'), - (0xED0, 'V'), - (0xEDA, 'X'), - (0xEDC, 'M', 'ຫນ'), - (0xEDD, 'M', 'ຫມ'), - (0xEDE, 'V'), - (0xEE0, 'X'), - (0xF00, 'V'), - (0xF0C, 'M', '་'), - (0xF0D, 'V'), - (0xF43, 'M', 'གྷ'), - (0xF44, 'V'), - (0xF48, 'X'), - (0xF49, 'V'), - (0xF4D, 'M', 'ཌྷ'), - (0xF4E, 'V'), - (0xF52, 'M', 'དྷ'), - (0xF53, 'V'), - (0xF57, 'M', 'བྷ'), - (0xF58, 'V'), - (0xF5C, 'M', 'ཛྷ'), - (0xF5D, 'V'), - (0xF69, 'M', 'ཀྵ'), - (0xF6A, 'V'), - (0xF6D, 'X'), - (0xF71, 'V'), - (0xF73, 'M', 'ཱི'), - (0xF74, 'V'), - (0xF75, 'M', 'ཱུ'), - (0xF76, 'M', 'ྲྀ'), - (0xF77, 'M', 'ྲཱྀ'), - (0xF78, 'M', 'ླྀ'), - (0xF79, 'M', 'ླཱྀ'), - (0xF7A, 'V'), - (0xF81, 'M', 'ཱྀ'), - (0xF82, 'V'), - (0xF93, 'M', 'ྒྷ'), - (0xF94, 'V'), - (0xF98, 'X'), - (0xF99, 'V'), - (0xF9D, 'M', 'ྜྷ'), - (0xF9E, 'V'), - (0xFA2, 'M', 'ྡྷ'), - (0xFA3, 'V'), - (0xFA7, 'M', 'ྦྷ'), - (0xFA8, 'V'), - (0xFAC, 'M', 'ྫྷ'), - (0xFAD, 'V'), - (0xFB9, 'M', 'ྐྵ'), - (0xFBA, 'V'), - (0xFBD, 'X'), - (0xFBE, 'V'), - (0xFCD, 'X'), - (0xFCE, 'V'), - (0xFDB, 'X'), - (0x1000, 'V'), - (0x10A0, 'X'), - (0x10C7, 'M', 'ⴧ'), - (0x10C8, 'X'), - (0x10CD, 'M', 'ⴭ'), - (0x10CE, 'X'), - (0x10D0, 'V'), - (0x10FC, 'M', 'ნ'), - (0x10FD, 'V'), - (0x115F, 'X'), - (0x1161, 'V'), - (0x1249, 'X'), - (0x124A, 'V'), - (0x124E, 'X'), - (0x1250, 'V'), - (0x1257, 'X'), - (0x1258, 'V'), - (0x1259, 'X'), - (0x125A, 'V'), - (0x125E, 'X'), - (0x1260, 'V'), - (0x1289, 'X'), - (0x128A, 'V'), - (0x128E, 'X'), - (0x1290, 'V'), - (0x12B1, 'X'), - (0x12B2, 'V'), - (0x12B6, 'X'), - (0x12B8, 'V'), - (0x12BF, 'X'), - (0x12C0, 'V'), - (0x12C1, 'X'), - (0x12C2, 'V'), - (0x12C6, 'X'), - (0x12C8, 'V'), - (0x12D7, 'X'), - (0x12D8, 'V'), - (0x1311, 'X'), - (0x1312, 'V'), - ] - -def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1316, 'X'), - (0x1318, 'V'), - (0x135B, 'X'), - (0x135D, 'V'), - (0x137D, 'X'), - (0x1380, 'V'), - (0x139A, 'X'), - (0x13A0, 'V'), - (0x13F6, 'X'), - (0x13F8, 'M', 'Ᏸ'), - (0x13F9, 'M', 'Ᏹ'), - (0x13FA, 'M', 'Ᏺ'), - (0x13FB, 'M', 'Ᏻ'), - (0x13FC, 'M', 'Ᏼ'), - (0x13FD, 'M', 'Ᏽ'), - (0x13FE, 'X'), - (0x1400, 'V'), - (0x1680, 'X'), - (0x1681, 'V'), - (0x169D, 'X'), - (0x16A0, 'V'), - (0x16F9, 'X'), - (0x1700, 'V'), - (0x1716, 'X'), - (0x171F, 'V'), - (0x1737, 'X'), - (0x1740, 'V'), - (0x1754, 'X'), - (0x1760, 'V'), - (0x176D, 'X'), - (0x176E, 'V'), - (0x1771, 'X'), - (0x1772, 'V'), - (0x1774, 'X'), - (0x1780, 'V'), - (0x17B4, 'X'), - (0x17B6, 'V'), - (0x17DE, 'X'), - (0x17E0, 'V'), - (0x17EA, 'X'), - (0x17F0, 'V'), - (0x17FA, 'X'), - (0x1800, 'V'), - (0x1806, 'X'), - (0x1807, 'V'), - (0x180B, 'I'), - (0x180E, 'X'), - (0x180F, 'I'), - (0x1810, 'V'), - (0x181A, 'X'), - (0x1820, 'V'), - (0x1879, 'X'), - (0x1880, 'V'), - (0x18AB, 'X'), - (0x18B0, 'V'), - (0x18F6, 'X'), - (0x1900, 'V'), - (0x191F, 'X'), - (0x1920, 'V'), - (0x192C, 'X'), - (0x1930, 'V'), - (0x193C, 'X'), - (0x1940, 'V'), - (0x1941, 'X'), - (0x1944, 'V'), - (0x196E, 'X'), - (0x1970, 'V'), - (0x1975, 'X'), - (0x1980, 'V'), - (0x19AC, 'X'), - (0x19B0, 'V'), - (0x19CA, 'X'), - (0x19D0, 'V'), - (0x19DB, 'X'), - (0x19DE, 'V'), - (0x1A1C, 'X'), - (0x1A1E, 'V'), - (0x1A5F, 'X'), - (0x1A60, 'V'), - (0x1A7D, 'X'), - (0x1A7F, 'V'), - (0x1A8A, 'X'), - (0x1A90, 'V'), - (0x1A9A, 'X'), - (0x1AA0, 'V'), - (0x1AAE, 'X'), - (0x1AB0, 'V'), - (0x1ACF, 'X'), - (0x1B00, 'V'), - (0x1B4D, 'X'), - (0x1B50, 'V'), - (0x1B7F, 'X'), - (0x1B80, 'V'), - (0x1BF4, 'X'), - (0x1BFC, 'V'), - (0x1C38, 'X'), - (0x1C3B, 'V'), - (0x1C4A, 'X'), - (0x1C4D, 'V'), - (0x1C80, 'M', 'в'), - ] - -def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1C81, 'M', 'д'), - (0x1C82, 'M', 'о'), - (0x1C83, 'M', 'с'), - (0x1C84, 'M', 'т'), - (0x1C86, 'M', 'ъ'), - (0x1C87, 'M', 'ѣ'), - (0x1C88, 'M', 'ꙋ'), - (0x1C89, 'X'), - (0x1C90, 'M', 'ა'), - (0x1C91, 'M', 'ბ'), - (0x1C92, 'M', 'გ'), - (0x1C93, 'M', 'დ'), - (0x1C94, 'M', 'ე'), - (0x1C95, 'M', 'ვ'), - (0x1C96, 'M', 'ზ'), - (0x1C97, 'M', 'თ'), - (0x1C98, 'M', 'ი'), - (0x1C99, 'M', 'კ'), - (0x1C9A, 'M', 'ლ'), - (0x1C9B, 'M', 'მ'), - (0x1C9C, 'M', 'ნ'), - (0x1C9D, 'M', 'ო'), - (0x1C9E, 'M', 'პ'), - (0x1C9F, 'M', 'ჟ'), - (0x1CA0, 'M', 'რ'), - (0x1CA1, 'M', 'ს'), - (0x1CA2, 'M', 'ტ'), - (0x1CA3, 'M', 'უ'), - (0x1CA4, 'M', 'ფ'), - (0x1CA5, 'M', 'ქ'), - (0x1CA6, 'M', 'ღ'), - (0x1CA7, 'M', 'ყ'), - (0x1CA8, 'M', 'შ'), - (0x1CA9, 'M', 'ჩ'), - (0x1CAA, 'M', 'ც'), - (0x1CAB, 'M', 'ძ'), - (0x1CAC, 'M', 'წ'), - (0x1CAD, 'M', 'ჭ'), - (0x1CAE, 'M', 'ხ'), - (0x1CAF, 'M', 'ჯ'), - (0x1CB0, 'M', 'ჰ'), - (0x1CB1, 'M', 'ჱ'), - (0x1CB2, 'M', 'ჲ'), - (0x1CB3, 'M', 'ჳ'), - (0x1CB4, 'M', 'ჴ'), - (0x1CB5, 'M', 'ჵ'), - (0x1CB6, 'M', 'ჶ'), - (0x1CB7, 'M', 'ჷ'), - (0x1CB8, 'M', 'ჸ'), - (0x1CB9, 'M', 'ჹ'), - (0x1CBA, 'M', 'ჺ'), - (0x1CBB, 'X'), - (0x1CBD, 'M', 'ჽ'), - (0x1CBE, 'M', 'ჾ'), - (0x1CBF, 'M', 'ჿ'), - (0x1CC0, 'V'), - (0x1CC8, 'X'), - (0x1CD0, 'V'), - (0x1CFB, 'X'), - (0x1D00, 'V'), - (0x1D2C, 'M', 'a'), - (0x1D2D, 'M', 'æ'), - (0x1D2E, 'M', 'b'), - (0x1D2F, 'V'), - (0x1D30, 'M', 'd'), - (0x1D31, 'M', 'e'), - (0x1D32, 'M', 'ǝ'), - (0x1D33, 'M', 'g'), - (0x1D34, 'M', 'h'), - (0x1D35, 'M', 'i'), - (0x1D36, 'M', 'j'), - (0x1D37, 'M', 'k'), - (0x1D38, 'M', 'l'), - (0x1D39, 'M', 'm'), - (0x1D3A, 'M', 'n'), - (0x1D3B, 'V'), - (0x1D3C, 'M', 'o'), - (0x1D3D, 'M', 'ȣ'), - (0x1D3E, 'M', 'p'), - (0x1D3F, 'M', 'r'), - (0x1D40, 'M', 't'), - (0x1D41, 'M', 'u'), - (0x1D42, 'M', 'w'), - (0x1D43, 'M', 'a'), - (0x1D44, 'M', 'ɐ'), - (0x1D45, 'M', 'ɑ'), - (0x1D46, 'M', 'ᴂ'), - (0x1D47, 'M', 'b'), - (0x1D48, 'M', 'd'), - (0x1D49, 'M', 'e'), - (0x1D4A, 'M', 'ə'), - (0x1D4B, 'M', 'ɛ'), - (0x1D4C, 'M', 'ɜ'), - (0x1D4D, 'M', 'g'), - (0x1D4E, 'V'), - (0x1D4F, 'M', 'k'), - (0x1D50, 'M', 'm'), - (0x1D51, 'M', 'ŋ'), - (0x1D52, 'M', 'o'), - (0x1D53, 'M', 'ɔ'), - ] - -def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D54, 'M', 'ᴖ'), - (0x1D55, 'M', 'ᴗ'), - (0x1D56, 'M', 'p'), - (0x1D57, 'M', 't'), - (0x1D58, 'M', 'u'), - (0x1D59, 'M', 'ᴝ'), - (0x1D5A, 'M', 'ɯ'), - (0x1D5B, 'M', 'v'), - (0x1D5C, 'M', 'ᴥ'), - (0x1D5D, 'M', 'β'), - (0x1D5E, 'M', 'γ'), - (0x1D5F, 'M', 'δ'), - (0x1D60, 'M', 'φ'), - (0x1D61, 'M', 'χ'), - (0x1D62, 'M', 'i'), - (0x1D63, 'M', 'r'), - (0x1D64, 'M', 'u'), - (0x1D65, 'M', 'v'), - (0x1D66, 'M', 'β'), - (0x1D67, 'M', 'γ'), - (0x1D68, 'M', 'ρ'), - (0x1D69, 'M', 'φ'), - (0x1D6A, 'M', 'χ'), - (0x1D6B, 'V'), - (0x1D78, 'M', 'н'), - (0x1D79, 'V'), - (0x1D9B, 'M', 'ɒ'), - (0x1D9C, 'M', 'c'), - (0x1D9D, 'M', 'ɕ'), - (0x1D9E, 'M', 'ð'), - (0x1D9F, 'M', 'ɜ'), - (0x1DA0, 'M', 'f'), - (0x1DA1, 'M', 'ɟ'), - (0x1DA2, 'M', 'ɡ'), - (0x1DA3, 'M', 'ɥ'), - (0x1DA4, 'M', 'ɨ'), - (0x1DA5, 'M', 'ɩ'), - (0x1DA6, 'M', 'ɪ'), - (0x1DA7, 'M', 'ᵻ'), - (0x1DA8, 'M', 'ʝ'), - (0x1DA9, 'M', 'ɭ'), - (0x1DAA, 'M', 'ᶅ'), - (0x1DAB, 'M', 'ʟ'), - (0x1DAC, 'M', 'ɱ'), - (0x1DAD, 'M', 'ɰ'), - (0x1DAE, 'M', 'ɲ'), - (0x1DAF, 'M', 'ɳ'), - (0x1DB0, 'M', 'ɴ'), - (0x1DB1, 'M', 'ɵ'), - (0x1DB2, 'M', 'ɸ'), - (0x1DB3, 'M', 'ʂ'), - (0x1DB4, 'M', 'ʃ'), - (0x1DB5, 'M', 'ƫ'), - (0x1DB6, 'M', 'ʉ'), - (0x1DB7, 'M', 'ʊ'), - (0x1DB8, 'M', 'ᴜ'), - (0x1DB9, 'M', 'ʋ'), - (0x1DBA, 'M', 'ʌ'), - (0x1DBB, 'M', 'z'), - (0x1DBC, 'M', 'ʐ'), - (0x1DBD, 'M', 'ʑ'), - (0x1DBE, 'M', 'ʒ'), - (0x1DBF, 'M', 'θ'), - (0x1DC0, 'V'), - (0x1E00, 'M', 'ḁ'), - (0x1E01, 'V'), - (0x1E02, 'M', 'ḃ'), - (0x1E03, 'V'), - (0x1E04, 'M', 'ḅ'), - (0x1E05, 'V'), - (0x1E06, 'M', 'ḇ'), - (0x1E07, 'V'), - (0x1E08, 'M', 'ḉ'), - (0x1E09, 'V'), - (0x1E0A, 'M', 'ḋ'), - (0x1E0B, 'V'), - (0x1E0C, 'M', 'ḍ'), - (0x1E0D, 'V'), - (0x1E0E, 'M', 'ḏ'), - (0x1E0F, 'V'), - (0x1E10, 'M', 'ḑ'), - (0x1E11, 'V'), - (0x1E12, 'M', 'ḓ'), - (0x1E13, 'V'), - (0x1E14, 'M', 'ḕ'), - (0x1E15, 'V'), - (0x1E16, 'M', 'ḗ'), - (0x1E17, 'V'), - (0x1E18, 'M', 'ḙ'), - (0x1E19, 'V'), - (0x1E1A, 'M', 'ḛ'), - (0x1E1B, 'V'), - (0x1E1C, 'M', 'ḝ'), - (0x1E1D, 'V'), - (0x1E1E, 'M', 'ḟ'), - (0x1E1F, 'V'), - (0x1E20, 'M', 'ḡ'), - (0x1E21, 'V'), - (0x1E22, 'M', 'ḣ'), - (0x1E23, 'V'), - ] - -def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E24, 'M', 'ḥ'), - (0x1E25, 'V'), - (0x1E26, 'M', 'ḧ'), - (0x1E27, 'V'), - (0x1E28, 'M', 'ḩ'), - (0x1E29, 'V'), - (0x1E2A, 'M', 'ḫ'), - (0x1E2B, 'V'), - (0x1E2C, 'M', 'ḭ'), - (0x1E2D, 'V'), - (0x1E2E, 'M', 'ḯ'), - (0x1E2F, 'V'), - (0x1E30, 'M', 'ḱ'), - (0x1E31, 'V'), - (0x1E32, 'M', 'ḳ'), - (0x1E33, 'V'), - (0x1E34, 'M', 'ḵ'), - (0x1E35, 'V'), - (0x1E36, 'M', 'ḷ'), - (0x1E37, 'V'), - (0x1E38, 'M', 'ḹ'), - (0x1E39, 'V'), - (0x1E3A, 'M', 'ḻ'), - (0x1E3B, 'V'), - (0x1E3C, 'M', 'ḽ'), - (0x1E3D, 'V'), - (0x1E3E, 'M', 'ḿ'), - (0x1E3F, 'V'), - (0x1E40, 'M', 'ṁ'), - (0x1E41, 'V'), - (0x1E42, 'M', 'ṃ'), - (0x1E43, 'V'), - (0x1E44, 'M', 'ṅ'), - (0x1E45, 'V'), - (0x1E46, 'M', 'ṇ'), - (0x1E47, 'V'), - (0x1E48, 'M', 'ṉ'), - (0x1E49, 'V'), - (0x1E4A, 'M', 'ṋ'), - (0x1E4B, 'V'), - (0x1E4C, 'M', 'ṍ'), - (0x1E4D, 'V'), - (0x1E4E, 'M', 'ṏ'), - (0x1E4F, 'V'), - (0x1E50, 'M', 'ṑ'), - (0x1E51, 'V'), - (0x1E52, 'M', 'ṓ'), - (0x1E53, 'V'), - (0x1E54, 'M', 'ṕ'), - (0x1E55, 'V'), - (0x1E56, 'M', 'ṗ'), - (0x1E57, 'V'), - (0x1E58, 'M', 'ṙ'), - (0x1E59, 'V'), - (0x1E5A, 'M', 'ṛ'), - (0x1E5B, 'V'), - (0x1E5C, 'M', 'ṝ'), - (0x1E5D, 'V'), - (0x1E5E, 'M', 'ṟ'), - (0x1E5F, 'V'), - (0x1E60, 'M', 'ṡ'), - (0x1E61, 'V'), - (0x1E62, 'M', 'ṣ'), - (0x1E63, 'V'), - (0x1E64, 'M', 'ṥ'), - (0x1E65, 'V'), - (0x1E66, 'M', 'ṧ'), - (0x1E67, 'V'), - (0x1E68, 'M', 'ṩ'), - (0x1E69, 'V'), - (0x1E6A, 'M', 'ṫ'), - (0x1E6B, 'V'), - (0x1E6C, 'M', 'ṭ'), - (0x1E6D, 'V'), - (0x1E6E, 'M', 'ṯ'), - (0x1E6F, 'V'), - (0x1E70, 'M', 'ṱ'), - (0x1E71, 'V'), - (0x1E72, 'M', 'ṳ'), - (0x1E73, 'V'), - (0x1E74, 'M', 'ṵ'), - (0x1E75, 'V'), - (0x1E76, 'M', 'ṷ'), - (0x1E77, 'V'), - (0x1E78, 'M', 'ṹ'), - (0x1E79, 'V'), - (0x1E7A, 'M', 'ṻ'), - (0x1E7B, 'V'), - (0x1E7C, 'M', 'ṽ'), - (0x1E7D, 'V'), - (0x1E7E, 'M', 'ṿ'), - (0x1E7F, 'V'), - (0x1E80, 'M', 'ẁ'), - (0x1E81, 'V'), - (0x1E82, 'M', 'ẃ'), - (0x1E83, 'V'), - (0x1E84, 'M', 'ẅ'), - (0x1E85, 'V'), - (0x1E86, 'M', 'ẇ'), - (0x1E87, 'V'), - ] - -def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E88, 'M', 'ẉ'), - (0x1E89, 'V'), - (0x1E8A, 'M', 'ẋ'), - (0x1E8B, 'V'), - (0x1E8C, 'M', 'ẍ'), - (0x1E8D, 'V'), - (0x1E8E, 'M', 'ẏ'), - (0x1E8F, 'V'), - (0x1E90, 'M', 'ẑ'), - (0x1E91, 'V'), - (0x1E92, 'M', 'ẓ'), - (0x1E93, 'V'), - (0x1E94, 'M', 'ẕ'), - (0x1E95, 'V'), - (0x1E9A, 'M', 'aʾ'), - (0x1E9B, 'M', 'ṡ'), - (0x1E9C, 'V'), - (0x1E9E, 'M', 'ß'), - (0x1E9F, 'V'), - (0x1EA0, 'M', 'ạ'), - (0x1EA1, 'V'), - (0x1EA2, 'M', 'ả'), - (0x1EA3, 'V'), - (0x1EA4, 'M', 'ấ'), - (0x1EA5, 'V'), - (0x1EA6, 'M', 'ầ'), - (0x1EA7, 'V'), - (0x1EA8, 'M', 'ẩ'), - (0x1EA9, 'V'), - (0x1EAA, 'M', 'ẫ'), - (0x1EAB, 'V'), - (0x1EAC, 'M', 'ậ'), - (0x1EAD, 'V'), - (0x1EAE, 'M', 'ắ'), - (0x1EAF, 'V'), - (0x1EB0, 'M', 'ằ'), - (0x1EB1, 'V'), - (0x1EB2, 'M', 'ẳ'), - (0x1EB3, 'V'), - (0x1EB4, 'M', 'ẵ'), - (0x1EB5, 'V'), - (0x1EB6, 'M', 'ặ'), - (0x1EB7, 'V'), - (0x1EB8, 'M', 'ẹ'), - (0x1EB9, 'V'), - (0x1EBA, 'M', 'ẻ'), - (0x1EBB, 'V'), - (0x1EBC, 'M', 'ẽ'), - (0x1EBD, 'V'), - (0x1EBE, 'M', 'ế'), - (0x1EBF, 'V'), - (0x1EC0, 'M', 'ề'), - (0x1EC1, 'V'), - (0x1EC2, 'M', 'ể'), - (0x1EC3, 'V'), - (0x1EC4, 'M', 'ễ'), - (0x1EC5, 'V'), - (0x1EC6, 'M', 'ệ'), - (0x1EC7, 'V'), - (0x1EC8, 'M', 'ỉ'), - (0x1EC9, 'V'), - (0x1ECA, 'M', 'ị'), - (0x1ECB, 'V'), - (0x1ECC, 'M', 'ọ'), - (0x1ECD, 'V'), - (0x1ECE, 'M', 'ỏ'), - (0x1ECF, 'V'), - (0x1ED0, 'M', 'ố'), - (0x1ED1, 'V'), - (0x1ED2, 'M', 'ồ'), - (0x1ED3, 'V'), - (0x1ED4, 'M', 'ổ'), - (0x1ED5, 'V'), - (0x1ED6, 'M', 'ỗ'), - (0x1ED7, 'V'), - (0x1ED8, 'M', 'ộ'), - (0x1ED9, 'V'), - (0x1EDA, 'M', 'ớ'), - (0x1EDB, 'V'), - (0x1EDC, 'M', 'ờ'), - (0x1EDD, 'V'), - (0x1EDE, 'M', 'ở'), - (0x1EDF, 'V'), - (0x1EE0, 'M', 'ỡ'), - (0x1EE1, 'V'), - (0x1EE2, 'M', 'ợ'), - (0x1EE3, 'V'), - (0x1EE4, 'M', 'ụ'), - (0x1EE5, 'V'), - (0x1EE6, 'M', 'ủ'), - (0x1EE7, 'V'), - (0x1EE8, 'M', 'ứ'), - (0x1EE9, 'V'), - (0x1EEA, 'M', 'ừ'), - (0x1EEB, 'V'), - (0x1EEC, 'M', 'ử'), - (0x1EED, 'V'), - (0x1EEE, 'M', 'ữ'), - (0x1EEF, 'V'), - (0x1EF0, 'M', 'ự'), - ] - -def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1EF1, 'V'), - (0x1EF2, 'M', 'ỳ'), - (0x1EF3, 'V'), - (0x1EF4, 'M', 'ỵ'), - (0x1EF5, 'V'), - (0x1EF6, 'M', 'ỷ'), - (0x1EF7, 'V'), - (0x1EF8, 'M', 'ỹ'), - (0x1EF9, 'V'), - (0x1EFA, 'M', 'ỻ'), - (0x1EFB, 'V'), - (0x1EFC, 'M', 'ỽ'), - (0x1EFD, 'V'), - (0x1EFE, 'M', 'ỿ'), - (0x1EFF, 'V'), - (0x1F08, 'M', 'ἀ'), - (0x1F09, 'M', 'ἁ'), - (0x1F0A, 'M', 'ἂ'), - (0x1F0B, 'M', 'ἃ'), - (0x1F0C, 'M', 'ἄ'), - (0x1F0D, 'M', 'ἅ'), - (0x1F0E, 'M', 'ἆ'), - (0x1F0F, 'M', 'ἇ'), - (0x1F10, 'V'), - (0x1F16, 'X'), - (0x1F18, 'M', 'ἐ'), - (0x1F19, 'M', 'ἑ'), - (0x1F1A, 'M', 'ἒ'), - (0x1F1B, 'M', 'ἓ'), - (0x1F1C, 'M', 'ἔ'), - (0x1F1D, 'M', 'ἕ'), - (0x1F1E, 'X'), - (0x1F20, 'V'), - (0x1F28, 'M', 'ἠ'), - (0x1F29, 'M', 'ἡ'), - (0x1F2A, 'M', 'ἢ'), - (0x1F2B, 'M', 'ἣ'), - (0x1F2C, 'M', 'ἤ'), - (0x1F2D, 'M', 'ἥ'), - (0x1F2E, 'M', 'ἦ'), - (0x1F2F, 'M', 'ἧ'), - (0x1F30, 'V'), - (0x1F38, 'M', 'ἰ'), - (0x1F39, 'M', 'ἱ'), - (0x1F3A, 'M', 'ἲ'), - (0x1F3B, 'M', 'ἳ'), - (0x1F3C, 'M', 'ἴ'), - (0x1F3D, 'M', 'ἵ'), - (0x1F3E, 'M', 'ἶ'), - (0x1F3F, 'M', 'ἷ'), - (0x1F40, 'V'), - (0x1F46, 'X'), - (0x1F48, 'M', 'ὀ'), - (0x1F49, 'M', 'ὁ'), - (0x1F4A, 'M', 'ὂ'), - (0x1F4B, 'M', 'ὃ'), - (0x1F4C, 'M', 'ὄ'), - (0x1F4D, 'M', 'ὅ'), - (0x1F4E, 'X'), - (0x1F50, 'V'), - (0x1F58, 'X'), - (0x1F59, 'M', 'ὑ'), - (0x1F5A, 'X'), - (0x1F5B, 'M', 'ὓ'), - (0x1F5C, 'X'), - (0x1F5D, 'M', 'ὕ'), - (0x1F5E, 'X'), - (0x1F5F, 'M', 'ὗ'), - (0x1F60, 'V'), - (0x1F68, 'M', 'ὠ'), - (0x1F69, 'M', 'ὡ'), - (0x1F6A, 'M', 'ὢ'), - (0x1F6B, 'M', 'ὣ'), - (0x1F6C, 'M', 'ὤ'), - (0x1F6D, 'M', 'ὥ'), - (0x1F6E, 'M', 'ὦ'), - (0x1F6F, 'M', 'ὧ'), - (0x1F70, 'V'), - (0x1F71, 'M', 'ά'), - (0x1F72, 'V'), - (0x1F73, 'M', 'έ'), - (0x1F74, 'V'), - (0x1F75, 'M', 'ή'), - (0x1F76, 'V'), - (0x1F77, 'M', 'ί'), - (0x1F78, 'V'), - (0x1F79, 'M', 'ό'), - (0x1F7A, 'V'), - (0x1F7B, 'M', 'ύ'), - (0x1F7C, 'V'), - (0x1F7D, 'M', 'ώ'), - (0x1F7E, 'X'), - (0x1F80, 'M', 'ἀι'), - (0x1F81, 'M', 'ἁι'), - (0x1F82, 'M', 'ἂι'), - (0x1F83, 'M', 'ἃι'), - (0x1F84, 'M', 'ἄι'), - (0x1F85, 'M', 'ἅι'), - (0x1F86, 'M', 'ἆι'), - (0x1F87, 'M', 'ἇι'), - ] - -def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1F88, 'M', 'ἀι'), - (0x1F89, 'M', 'ἁι'), - (0x1F8A, 'M', 'ἂι'), - (0x1F8B, 'M', 'ἃι'), - (0x1F8C, 'M', 'ἄι'), - (0x1F8D, 'M', 'ἅι'), - (0x1F8E, 'M', 'ἆι'), - (0x1F8F, 'M', 'ἇι'), - (0x1F90, 'M', 'ἠι'), - (0x1F91, 'M', 'ἡι'), - (0x1F92, 'M', 'ἢι'), - (0x1F93, 'M', 'ἣι'), - (0x1F94, 'M', 'ἤι'), - (0x1F95, 'M', 'ἥι'), - (0x1F96, 'M', 'ἦι'), - (0x1F97, 'M', 'ἧι'), - (0x1F98, 'M', 'ἠι'), - (0x1F99, 'M', 'ἡι'), - (0x1F9A, 'M', 'ἢι'), - (0x1F9B, 'M', 'ἣι'), - (0x1F9C, 'M', 'ἤι'), - (0x1F9D, 'M', 'ἥι'), - (0x1F9E, 'M', 'ἦι'), - (0x1F9F, 'M', 'ἧι'), - (0x1FA0, 'M', 'ὠι'), - (0x1FA1, 'M', 'ὡι'), - (0x1FA2, 'M', 'ὢι'), - (0x1FA3, 'M', 'ὣι'), - (0x1FA4, 'M', 'ὤι'), - (0x1FA5, 'M', 'ὥι'), - (0x1FA6, 'M', 'ὦι'), - (0x1FA7, 'M', 'ὧι'), - (0x1FA8, 'M', 'ὠι'), - (0x1FA9, 'M', 'ὡι'), - (0x1FAA, 'M', 'ὢι'), - (0x1FAB, 'M', 'ὣι'), - (0x1FAC, 'M', 'ὤι'), - (0x1FAD, 'M', 'ὥι'), - (0x1FAE, 'M', 'ὦι'), - (0x1FAF, 'M', 'ὧι'), - (0x1FB0, 'V'), - (0x1FB2, 'M', 'ὰι'), - (0x1FB3, 'M', 'αι'), - (0x1FB4, 'M', 'άι'), - (0x1FB5, 'X'), - (0x1FB6, 'V'), - (0x1FB7, 'M', 'ᾶι'), - (0x1FB8, 'M', 'ᾰ'), - (0x1FB9, 'M', 'ᾱ'), - (0x1FBA, 'M', 'ὰ'), - (0x1FBB, 'M', 'ά'), - (0x1FBC, 'M', 'αι'), - (0x1FBD, '3', ' ̓'), - (0x1FBE, 'M', 'ι'), - (0x1FBF, '3', ' ̓'), - (0x1FC0, '3', ' ͂'), - (0x1FC1, '3', ' ̈͂'), - (0x1FC2, 'M', 'ὴι'), - (0x1FC3, 'M', 'ηι'), - (0x1FC4, 'M', 'ήι'), - (0x1FC5, 'X'), - (0x1FC6, 'V'), - (0x1FC7, 'M', 'ῆι'), - (0x1FC8, 'M', 'ὲ'), - (0x1FC9, 'M', 'έ'), - (0x1FCA, 'M', 'ὴ'), - (0x1FCB, 'M', 'ή'), - (0x1FCC, 'M', 'ηι'), - (0x1FCD, '3', ' ̓̀'), - (0x1FCE, '3', ' ̓́'), - (0x1FCF, '3', ' ̓͂'), - (0x1FD0, 'V'), - (0x1FD3, 'M', 'ΐ'), - (0x1FD4, 'X'), - (0x1FD6, 'V'), - (0x1FD8, 'M', 'ῐ'), - (0x1FD9, 'M', 'ῑ'), - (0x1FDA, 'M', 'ὶ'), - (0x1FDB, 'M', 'ί'), - (0x1FDC, 'X'), - (0x1FDD, '3', ' ̔̀'), - (0x1FDE, '3', ' ̔́'), - (0x1FDF, '3', ' ̔͂'), - (0x1FE0, 'V'), - (0x1FE3, 'M', 'ΰ'), - (0x1FE4, 'V'), - (0x1FE8, 'M', 'ῠ'), - (0x1FE9, 'M', 'ῡ'), - (0x1FEA, 'M', 'ὺ'), - (0x1FEB, 'M', 'ύ'), - (0x1FEC, 'M', 'ῥ'), - (0x1FED, '3', ' ̈̀'), - (0x1FEE, '3', ' ̈́'), - (0x1FEF, '3', '`'), - (0x1FF0, 'X'), - (0x1FF2, 'M', 'ὼι'), - (0x1FF3, 'M', 'ωι'), - (0x1FF4, 'M', 'ώι'), - (0x1FF5, 'X'), - (0x1FF6, 'V'), - ] - -def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1FF7, 'M', 'ῶι'), - (0x1FF8, 'M', 'ὸ'), - (0x1FF9, 'M', 'ό'), - (0x1FFA, 'M', 'ὼ'), - (0x1FFB, 'M', 'ώ'), - (0x1FFC, 'M', 'ωι'), - (0x1FFD, '3', ' ́'), - (0x1FFE, '3', ' ̔'), - (0x1FFF, 'X'), - (0x2000, '3', ' '), - (0x200B, 'I'), - (0x200C, 'D', ''), - (0x200E, 'X'), - (0x2010, 'V'), - (0x2011, 'M', '‐'), - (0x2012, 'V'), - (0x2017, '3', ' ̳'), - (0x2018, 'V'), - (0x2024, 'X'), - (0x2027, 'V'), - (0x2028, 'X'), - (0x202F, '3', ' '), - (0x2030, 'V'), - (0x2033, 'M', '′′'), - (0x2034, 'M', '′′′'), - (0x2035, 'V'), - (0x2036, 'M', '‵‵'), - (0x2037, 'M', '‵‵‵'), - (0x2038, 'V'), - (0x203C, '3', '!!'), - (0x203D, 'V'), - (0x203E, '3', ' ̅'), - (0x203F, 'V'), - (0x2047, '3', '??'), - (0x2048, '3', '?!'), - (0x2049, '3', '!?'), - (0x204A, 'V'), - (0x2057, 'M', '′′′′'), - (0x2058, 'V'), - (0x205F, '3', ' '), - (0x2060, 'I'), - (0x2061, 'X'), - (0x2064, 'I'), - (0x2065, 'X'), - (0x2070, 'M', '0'), - (0x2071, 'M', 'i'), - (0x2072, 'X'), - (0x2074, 'M', '4'), - (0x2075, 'M', '5'), - (0x2076, 'M', '6'), - (0x2077, 'M', '7'), - (0x2078, 'M', '8'), - (0x2079, 'M', '9'), - (0x207A, '3', '+'), - (0x207B, 'M', '−'), - (0x207C, '3', '='), - (0x207D, '3', '('), - (0x207E, '3', ')'), - (0x207F, 'M', 'n'), - (0x2080, 'M', '0'), - (0x2081, 'M', '1'), - (0x2082, 'M', '2'), - (0x2083, 'M', '3'), - (0x2084, 'M', '4'), - (0x2085, 'M', '5'), - (0x2086, 'M', '6'), - (0x2087, 'M', '7'), - (0x2088, 'M', '8'), - (0x2089, 'M', '9'), - (0x208A, '3', '+'), - (0x208B, 'M', '−'), - (0x208C, '3', '='), - (0x208D, '3', '('), - (0x208E, '3', ')'), - (0x208F, 'X'), - (0x2090, 'M', 'a'), - (0x2091, 'M', 'e'), - (0x2092, 'M', 'o'), - (0x2093, 'M', 'x'), - (0x2094, 'M', 'ə'), - (0x2095, 'M', 'h'), - (0x2096, 'M', 'k'), - (0x2097, 'M', 'l'), - (0x2098, 'M', 'm'), - (0x2099, 'M', 'n'), - (0x209A, 'M', 'p'), - (0x209B, 'M', 's'), - (0x209C, 'M', 't'), - (0x209D, 'X'), - (0x20A0, 'V'), - (0x20A8, 'M', 'rs'), - (0x20A9, 'V'), - (0x20C1, 'X'), - (0x20D0, 'V'), - (0x20F1, 'X'), - (0x2100, '3', 'a/c'), - (0x2101, '3', 'a/s'), - (0x2102, 'M', 'c'), - (0x2103, 'M', '°c'), - (0x2104, 'V'), - ] - -def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2105, '3', 'c/o'), - (0x2106, '3', 'c/u'), - (0x2107, 'M', 'ɛ'), - (0x2108, 'V'), - (0x2109, 'M', '°f'), - (0x210A, 'M', 'g'), - (0x210B, 'M', 'h'), - (0x210F, 'M', 'ħ'), - (0x2110, 'M', 'i'), - (0x2112, 'M', 'l'), - (0x2114, 'V'), - (0x2115, 'M', 'n'), - (0x2116, 'M', 'no'), - (0x2117, 'V'), - (0x2119, 'M', 'p'), - (0x211A, 'M', 'q'), - (0x211B, 'M', 'r'), - (0x211E, 'V'), - (0x2120, 'M', 'sm'), - (0x2121, 'M', 'tel'), - (0x2122, 'M', 'tm'), - (0x2123, 'V'), - (0x2124, 'M', 'z'), - (0x2125, 'V'), - (0x2126, 'M', 'ω'), - (0x2127, 'V'), - (0x2128, 'M', 'z'), - (0x2129, 'V'), - (0x212A, 'M', 'k'), - (0x212B, 'M', 'å'), - (0x212C, 'M', 'b'), - (0x212D, 'M', 'c'), - (0x212E, 'V'), - (0x212F, 'M', 'e'), - (0x2131, 'M', 'f'), - (0x2132, 'X'), - (0x2133, 'M', 'm'), - (0x2134, 'M', 'o'), - (0x2135, 'M', 'א'), - (0x2136, 'M', 'ב'), - (0x2137, 'M', 'ג'), - (0x2138, 'M', 'ד'), - (0x2139, 'M', 'i'), - (0x213A, 'V'), - (0x213B, 'M', 'fax'), - (0x213C, 'M', 'π'), - (0x213D, 'M', 'γ'), - (0x213F, 'M', 'π'), - (0x2140, 'M', '∑'), - (0x2141, 'V'), - (0x2145, 'M', 'd'), - (0x2147, 'M', 'e'), - (0x2148, 'M', 'i'), - (0x2149, 'M', 'j'), - (0x214A, 'V'), - (0x2150, 'M', '1⁄7'), - (0x2151, 'M', '1⁄9'), - (0x2152, 'M', '1⁄10'), - (0x2153, 'M', '1⁄3'), - (0x2154, 'M', '2⁄3'), - (0x2155, 'M', '1⁄5'), - (0x2156, 'M', '2⁄5'), - (0x2157, 'M', '3⁄5'), - (0x2158, 'M', '4⁄5'), - (0x2159, 'M', '1⁄6'), - (0x215A, 'M', '5⁄6'), - (0x215B, 'M', '1⁄8'), - (0x215C, 'M', '3⁄8'), - (0x215D, 'M', '5⁄8'), - (0x215E, 'M', '7⁄8'), - (0x215F, 'M', '1⁄'), - (0x2160, 'M', 'i'), - (0x2161, 'M', 'ii'), - (0x2162, 'M', 'iii'), - (0x2163, 'M', 'iv'), - (0x2164, 'M', 'v'), - (0x2165, 'M', 'vi'), - (0x2166, 'M', 'vii'), - (0x2167, 'M', 'viii'), - (0x2168, 'M', 'ix'), - (0x2169, 'M', 'x'), - (0x216A, 'M', 'xi'), - (0x216B, 'M', 'xii'), - (0x216C, 'M', 'l'), - (0x216D, 'M', 'c'), - (0x216E, 'M', 'd'), - (0x216F, 'M', 'm'), - (0x2170, 'M', 'i'), - (0x2171, 'M', 'ii'), - (0x2172, 'M', 'iii'), - (0x2173, 'M', 'iv'), - (0x2174, 'M', 'v'), - (0x2175, 'M', 'vi'), - (0x2176, 'M', 'vii'), - (0x2177, 'M', 'viii'), - (0x2178, 'M', 'ix'), - (0x2179, 'M', 'x'), - (0x217A, 'M', 'xi'), - (0x217B, 'M', 'xii'), - (0x217C, 'M', 'l'), - ] - -def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x217D, 'M', 'c'), - (0x217E, 'M', 'd'), - (0x217F, 'M', 'm'), - (0x2180, 'V'), - (0x2183, 'X'), - (0x2184, 'V'), - (0x2189, 'M', '0⁄3'), - (0x218A, 'V'), - (0x218C, 'X'), - (0x2190, 'V'), - (0x222C, 'M', '∫∫'), - (0x222D, 'M', '∫∫∫'), - (0x222E, 'V'), - (0x222F, 'M', '∮∮'), - (0x2230, 'M', '∮∮∮'), - (0x2231, 'V'), - (0x2329, 'M', '〈'), - (0x232A, 'M', '〉'), - (0x232B, 'V'), - (0x2427, 'X'), - (0x2440, 'V'), - (0x244B, 'X'), - (0x2460, 'M', '1'), - (0x2461, 'M', '2'), - (0x2462, 'M', '3'), - (0x2463, 'M', '4'), - (0x2464, 'M', '5'), - (0x2465, 'M', '6'), - (0x2466, 'M', '7'), - (0x2467, 'M', '8'), - (0x2468, 'M', '9'), - (0x2469, 'M', '10'), - (0x246A, 'M', '11'), - (0x246B, 'M', '12'), - (0x246C, 'M', '13'), - (0x246D, 'M', '14'), - (0x246E, 'M', '15'), - (0x246F, 'M', '16'), - (0x2470, 'M', '17'), - (0x2471, 'M', '18'), - (0x2472, 'M', '19'), - (0x2473, 'M', '20'), - (0x2474, '3', '(1)'), - (0x2475, '3', '(2)'), - (0x2476, '3', '(3)'), - (0x2477, '3', '(4)'), - (0x2478, '3', '(5)'), - (0x2479, '3', '(6)'), - (0x247A, '3', '(7)'), - (0x247B, '3', '(8)'), - (0x247C, '3', '(9)'), - (0x247D, '3', '(10)'), - (0x247E, '3', '(11)'), - (0x247F, '3', '(12)'), - (0x2480, '3', '(13)'), - (0x2481, '3', '(14)'), - (0x2482, '3', '(15)'), - (0x2483, '3', '(16)'), - (0x2484, '3', '(17)'), - (0x2485, '3', '(18)'), - (0x2486, '3', '(19)'), - (0x2487, '3', '(20)'), - (0x2488, 'X'), - (0x249C, '3', '(a)'), - (0x249D, '3', '(b)'), - (0x249E, '3', '(c)'), - (0x249F, '3', '(d)'), - (0x24A0, '3', '(e)'), - (0x24A1, '3', '(f)'), - (0x24A2, '3', '(g)'), - (0x24A3, '3', '(h)'), - (0x24A4, '3', '(i)'), - (0x24A5, '3', '(j)'), - (0x24A6, '3', '(k)'), - (0x24A7, '3', '(l)'), - (0x24A8, '3', '(m)'), - (0x24A9, '3', '(n)'), - (0x24AA, '3', '(o)'), - (0x24AB, '3', '(p)'), - (0x24AC, '3', '(q)'), - (0x24AD, '3', '(r)'), - (0x24AE, '3', '(s)'), - (0x24AF, '3', '(t)'), - (0x24B0, '3', '(u)'), - (0x24B1, '3', '(v)'), - (0x24B2, '3', '(w)'), - (0x24B3, '3', '(x)'), - (0x24B4, '3', '(y)'), - (0x24B5, '3', '(z)'), - (0x24B6, 'M', 'a'), - (0x24B7, 'M', 'b'), - (0x24B8, 'M', 'c'), - (0x24B9, 'M', 'd'), - (0x24BA, 'M', 'e'), - (0x24BB, 'M', 'f'), - (0x24BC, 'M', 'g'), - (0x24BD, 'M', 'h'), - (0x24BE, 'M', 'i'), - (0x24BF, 'M', 'j'), - (0x24C0, 'M', 'k'), - ] - -def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x24C1, 'M', 'l'), - (0x24C2, 'M', 'm'), - (0x24C3, 'M', 'n'), - (0x24C4, 'M', 'o'), - (0x24C5, 'M', 'p'), - (0x24C6, 'M', 'q'), - (0x24C7, 'M', 'r'), - (0x24C8, 'M', 's'), - (0x24C9, 'M', 't'), - (0x24CA, 'M', 'u'), - (0x24CB, 'M', 'v'), - (0x24CC, 'M', 'w'), - (0x24CD, 'M', 'x'), - (0x24CE, 'M', 'y'), - (0x24CF, 'M', 'z'), - (0x24D0, 'M', 'a'), - (0x24D1, 'M', 'b'), - (0x24D2, 'M', 'c'), - (0x24D3, 'M', 'd'), - (0x24D4, 'M', 'e'), - (0x24D5, 'M', 'f'), - (0x24D6, 'M', 'g'), - (0x24D7, 'M', 'h'), - (0x24D8, 'M', 'i'), - (0x24D9, 'M', 'j'), - (0x24DA, 'M', 'k'), - (0x24DB, 'M', 'l'), - (0x24DC, 'M', 'm'), - (0x24DD, 'M', 'n'), - (0x24DE, 'M', 'o'), - (0x24DF, 'M', 'p'), - (0x24E0, 'M', 'q'), - (0x24E1, 'M', 'r'), - (0x24E2, 'M', 's'), - (0x24E3, 'M', 't'), - (0x24E4, 'M', 'u'), - (0x24E5, 'M', 'v'), - (0x24E6, 'M', 'w'), - (0x24E7, 'M', 'x'), - (0x24E8, 'M', 'y'), - (0x24E9, 'M', 'z'), - (0x24EA, 'M', '0'), - (0x24EB, 'V'), - (0x2A0C, 'M', '∫∫∫∫'), - (0x2A0D, 'V'), - (0x2A74, '3', '::='), - (0x2A75, '3', '=='), - (0x2A76, '3', '==='), - (0x2A77, 'V'), - (0x2ADC, 'M', '⫝̸'), - (0x2ADD, 'V'), - (0x2B74, 'X'), - (0x2B76, 'V'), - (0x2B96, 'X'), - (0x2B97, 'V'), - (0x2C00, 'M', 'ⰰ'), - (0x2C01, 'M', 'ⰱ'), - (0x2C02, 'M', 'ⰲ'), - (0x2C03, 'M', 'ⰳ'), - (0x2C04, 'M', 'ⰴ'), - (0x2C05, 'M', 'ⰵ'), - (0x2C06, 'M', 'ⰶ'), - (0x2C07, 'M', 'ⰷ'), - (0x2C08, 'M', 'ⰸ'), - (0x2C09, 'M', 'ⰹ'), - (0x2C0A, 'M', 'ⰺ'), - (0x2C0B, 'M', 'ⰻ'), - (0x2C0C, 'M', 'ⰼ'), - (0x2C0D, 'M', 'ⰽ'), - (0x2C0E, 'M', 'ⰾ'), - (0x2C0F, 'M', 'ⰿ'), - (0x2C10, 'M', 'ⱀ'), - (0x2C11, 'M', 'ⱁ'), - (0x2C12, 'M', 'ⱂ'), - (0x2C13, 'M', 'ⱃ'), - (0x2C14, 'M', 'ⱄ'), - (0x2C15, 'M', 'ⱅ'), - (0x2C16, 'M', 'ⱆ'), - (0x2C17, 'M', 'ⱇ'), - (0x2C18, 'M', 'ⱈ'), - (0x2C19, 'M', 'ⱉ'), - (0x2C1A, 'M', 'ⱊ'), - (0x2C1B, 'M', 'ⱋ'), - (0x2C1C, 'M', 'ⱌ'), - (0x2C1D, 'M', 'ⱍ'), - (0x2C1E, 'M', 'ⱎ'), - (0x2C1F, 'M', 'ⱏ'), - (0x2C20, 'M', 'ⱐ'), - (0x2C21, 'M', 'ⱑ'), - (0x2C22, 'M', 'ⱒ'), - (0x2C23, 'M', 'ⱓ'), - (0x2C24, 'M', 'ⱔ'), - (0x2C25, 'M', 'ⱕ'), - (0x2C26, 'M', 'ⱖ'), - (0x2C27, 'M', 'ⱗ'), - (0x2C28, 'M', 'ⱘ'), - (0x2C29, 'M', 'ⱙ'), - (0x2C2A, 'M', 'ⱚ'), - (0x2C2B, 'M', 'ⱛ'), - (0x2C2C, 'M', 'ⱜ'), - ] - -def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2C2D, 'M', 'ⱝ'), - (0x2C2E, 'M', 'ⱞ'), - (0x2C2F, 'M', 'ⱟ'), - (0x2C30, 'V'), - (0x2C60, 'M', 'ⱡ'), - (0x2C61, 'V'), - (0x2C62, 'M', 'ɫ'), - (0x2C63, 'M', 'ᵽ'), - (0x2C64, 'M', 'ɽ'), - (0x2C65, 'V'), - (0x2C67, 'M', 'ⱨ'), - (0x2C68, 'V'), - (0x2C69, 'M', 'ⱪ'), - (0x2C6A, 'V'), - (0x2C6B, 'M', 'ⱬ'), - (0x2C6C, 'V'), - (0x2C6D, 'M', 'ɑ'), - (0x2C6E, 'M', 'ɱ'), - (0x2C6F, 'M', 'ɐ'), - (0x2C70, 'M', 'ɒ'), - (0x2C71, 'V'), - (0x2C72, 'M', 'ⱳ'), - (0x2C73, 'V'), - (0x2C75, 'M', 'ⱶ'), - (0x2C76, 'V'), - (0x2C7C, 'M', 'j'), - (0x2C7D, 'M', 'v'), - (0x2C7E, 'M', 'ȿ'), - (0x2C7F, 'M', 'ɀ'), - (0x2C80, 'M', 'ⲁ'), - (0x2C81, 'V'), - (0x2C82, 'M', 'ⲃ'), - (0x2C83, 'V'), - (0x2C84, 'M', 'ⲅ'), - (0x2C85, 'V'), - (0x2C86, 'M', 'ⲇ'), - (0x2C87, 'V'), - (0x2C88, 'M', 'ⲉ'), - (0x2C89, 'V'), - (0x2C8A, 'M', 'ⲋ'), - (0x2C8B, 'V'), - (0x2C8C, 'M', 'ⲍ'), - (0x2C8D, 'V'), - (0x2C8E, 'M', 'ⲏ'), - (0x2C8F, 'V'), - (0x2C90, 'M', 'ⲑ'), - (0x2C91, 'V'), - (0x2C92, 'M', 'ⲓ'), - (0x2C93, 'V'), - (0x2C94, 'M', 'ⲕ'), - (0x2C95, 'V'), - (0x2C96, 'M', 'ⲗ'), - (0x2C97, 'V'), - (0x2C98, 'M', 'ⲙ'), - (0x2C99, 'V'), - (0x2C9A, 'M', 'ⲛ'), - (0x2C9B, 'V'), - (0x2C9C, 'M', 'ⲝ'), - (0x2C9D, 'V'), - (0x2C9E, 'M', 'ⲟ'), - (0x2C9F, 'V'), - (0x2CA0, 'M', 'ⲡ'), - (0x2CA1, 'V'), - (0x2CA2, 'M', 'ⲣ'), - (0x2CA3, 'V'), - (0x2CA4, 'M', 'ⲥ'), - (0x2CA5, 'V'), - (0x2CA6, 'M', 'ⲧ'), - (0x2CA7, 'V'), - (0x2CA8, 'M', 'ⲩ'), - (0x2CA9, 'V'), - (0x2CAA, 'M', 'ⲫ'), - (0x2CAB, 'V'), - (0x2CAC, 'M', 'ⲭ'), - (0x2CAD, 'V'), - (0x2CAE, 'M', 'ⲯ'), - (0x2CAF, 'V'), - (0x2CB0, 'M', 'ⲱ'), - (0x2CB1, 'V'), - (0x2CB2, 'M', 'ⲳ'), - (0x2CB3, 'V'), - (0x2CB4, 'M', 'ⲵ'), - (0x2CB5, 'V'), - (0x2CB6, 'M', 'ⲷ'), - (0x2CB7, 'V'), - (0x2CB8, 'M', 'ⲹ'), - (0x2CB9, 'V'), - (0x2CBA, 'M', 'ⲻ'), - (0x2CBB, 'V'), - (0x2CBC, 'M', 'ⲽ'), - (0x2CBD, 'V'), - (0x2CBE, 'M', 'ⲿ'), - (0x2CBF, 'V'), - (0x2CC0, 'M', 'ⳁ'), - (0x2CC1, 'V'), - (0x2CC2, 'M', 'ⳃ'), - (0x2CC3, 'V'), - (0x2CC4, 'M', 'ⳅ'), - (0x2CC5, 'V'), - (0x2CC6, 'M', 'ⳇ'), - ] - -def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2CC7, 'V'), - (0x2CC8, 'M', 'ⳉ'), - (0x2CC9, 'V'), - (0x2CCA, 'M', 'ⳋ'), - (0x2CCB, 'V'), - (0x2CCC, 'M', 'ⳍ'), - (0x2CCD, 'V'), - (0x2CCE, 'M', 'ⳏ'), - (0x2CCF, 'V'), - (0x2CD0, 'M', 'ⳑ'), - (0x2CD1, 'V'), - (0x2CD2, 'M', 'ⳓ'), - (0x2CD3, 'V'), - (0x2CD4, 'M', 'ⳕ'), - (0x2CD5, 'V'), - (0x2CD6, 'M', 'ⳗ'), - (0x2CD7, 'V'), - (0x2CD8, 'M', 'ⳙ'), - (0x2CD9, 'V'), - (0x2CDA, 'M', 'ⳛ'), - (0x2CDB, 'V'), - (0x2CDC, 'M', 'ⳝ'), - (0x2CDD, 'V'), - (0x2CDE, 'M', 'ⳟ'), - (0x2CDF, 'V'), - (0x2CE0, 'M', 'ⳡ'), - (0x2CE1, 'V'), - (0x2CE2, 'M', 'ⳣ'), - (0x2CE3, 'V'), - (0x2CEB, 'M', 'ⳬ'), - (0x2CEC, 'V'), - (0x2CED, 'M', 'ⳮ'), - (0x2CEE, 'V'), - (0x2CF2, 'M', 'ⳳ'), - (0x2CF3, 'V'), - (0x2CF4, 'X'), - (0x2CF9, 'V'), - (0x2D26, 'X'), - (0x2D27, 'V'), - (0x2D28, 'X'), - (0x2D2D, 'V'), - (0x2D2E, 'X'), - (0x2D30, 'V'), - (0x2D68, 'X'), - (0x2D6F, 'M', 'ⵡ'), - (0x2D70, 'V'), - (0x2D71, 'X'), - (0x2D7F, 'V'), - (0x2D97, 'X'), - (0x2DA0, 'V'), - (0x2DA7, 'X'), - (0x2DA8, 'V'), - (0x2DAF, 'X'), - (0x2DB0, 'V'), - (0x2DB7, 'X'), - (0x2DB8, 'V'), - (0x2DBF, 'X'), - (0x2DC0, 'V'), - (0x2DC7, 'X'), - (0x2DC8, 'V'), - (0x2DCF, 'X'), - (0x2DD0, 'V'), - (0x2DD7, 'X'), - (0x2DD8, 'V'), - (0x2DDF, 'X'), - (0x2DE0, 'V'), - (0x2E5E, 'X'), - (0x2E80, 'V'), - (0x2E9A, 'X'), - (0x2E9B, 'V'), - (0x2E9F, 'M', '母'), - (0x2EA0, 'V'), - (0x2EF3, 'M', '龟'), - (0x2EF4, 'X'), - (0x2F00, 'M', '一'), - (0x2F01, 'M', '丨'), - (0x2F02, 'M', '丶'), - (0x2F03, 'M', '丿'), - (0x2F04, 'M', '乙'), - (0x2F05, 'M', '亅'), - (0x2F06, 'M', '二'), - (0x2F07, 'M', '亠'), - (0x2F08, 'M', '人'), - (0x2F09, 'M', '儿'), - (0x2F0A, 'M', '入'), - (0x2F0B, 'M', '八'), - (0x2F0C, 'M', '冂'), - (0x2F0D, 'M', '冖'), - (0x2F0E, 'M', '冫'), - (0x2F0F, 'M', '几'), - (0x2F10, 'M', '凵'), - (0x2F11, 'M', '刀'), - (0x2F12, 'M', '力'), - (0x2F13, 'M', '勹'), - (0x2F14, 'M', '匕'), - (0x2F15, 'M', '匚'), - (0x2F16, 'M', '匸'), - (0x2F17, 'M', '十'), - (0x2F18, 'M', '卜'), - (0x2F19, 'M', '卩'), - ] - -def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F1A, 'M', '厂'), - (0x2F1B, 'M', '厶'), - (0x2F1C, 'M', '又'), - (0x2F1D, 'M', '口'), - (0x2F1E, 'M', '囗'), - (0x2F1F, 'M', '土'), - (0x2F20, 'M', '士'), - (0x2F21, 'M', '夂'), - (0x2F22, 'M', '夊'), - (0x2F23, 'M', '夕'), - (0x2F24, 'M', '大'), - (0x2F25, 'M', '女'), - (0x2F26, 'M', '子'), - (0x2F27, 'M', '宀'), - (0x2F28, 'M', '寸'), - (0x2F29, 'M', '小'), - (0x2F2A, 'M', '尢'), - (0x2F2B, 'M', '尸'), - (0x2F2C, 'M', '屮'), - (0x2F2D, 'M', '山'), - (0x2F2E, 'M', '巛'), - (0x2F2F, 'M', '工'), - (0x2F30, 'M', '己'), - (0x2F31, 'M', '巾'), - (0x2F32, 'M', '干'), - (0x2F33, 'M', '幺'), - (0x2F34, 'M', '广'), - (0x2F35, 'M', '廴'), - (0x2F36, 'M', '廾'), - (0x2F37, 'M', '弋'), - (0x2F38, 'M', '弓'), - (0x2F39, 'M', '彐'), - (0x2F3A, 'M', '彡'), - (0x2F3B, 'M', '彳'), - (0x2F3C, 'M', '心'), - (0x2F3D, 'M', '戈'), - (0x2F3E, 'M', '戶'), - (0x2F3F, 'M', '手'), - (0x2F40, 'M', '支'), - (0x2F41, 'M', '攴'), - (0x2F42, 'M', '文'), - (0x2F43, 'M', '斗'), - (0x2F44, 'M', '斤'), - (0x2F45, 'M', '方'), - (0x2F46, 'M', '无'), - (0x2F47, 'M', '日'), - (0x2F48, 'M', '曰'), - (0x2F49, 'M', '月'), - (0x2F4A, 'M', '木'), - (0x2F4B, 'M', '欠'), - (0x2F4C, 'M', '止'), - (0x2F4D, 'M', '歹'), - (0x2F4E, 'M', '殳'), - (0x2F4F, 'M', '毋'), - (0x2F50, 'M', '比'), - (0x2F51, 'M', '毛'), - (0x2F52, 'M', '氏'), - (0x2F53, 'M', '气'), - (0x2F54, 'M', '水'), - (0x2F55, 'M', '火'), - (0x2F56, 'M', '爪'), - (0x2F57, 'M', '父'), - (0x2F58, 'M', '爻'), - (0x2F59, 'M', '爿'), - (0x2F5A, 'M', '片'), - (0x2F5B, 'M', '牙'), - (0x2F5C, 'M', '牛'), - (0x2F5D, 'M', '犬'), - (0x2F5E, 'M', '玄'), - (0x2F5F, 'M', '玉'), - (0x2F60, 'M', '瓜'), - (0x2F61, 'M', '瓦'), - (0x2F62, 'M', '甘'), - (0x2F63, 'M', '生'), - (0x2F64, 'M', '用'), - (0x2F65, 'M', '田'), - (0x2F66, 'M', '疋'), - (0x2F67, 'M', '疒'), - (0x2F68, 'M', '癶'), - (0x2F69, 'M', '白'), - (0x2F6A, 'M', '皮'), - (0x2F6B, 'M', '皿'), - (0x2F6C, 'M', '目'), - (0x2F6D, 'M', '矛'), - (0x2F6E, 'M', '矢'), - (0x2F6F, 'M', '石'), - (0x2F70, 'M', '示'), - (0x2F71, 'M', '禸'), - (0x2F72, 'M', '禾'), - (0x2F73, 'M', '穴'), - (0x2F74, 'M', '立'), - (0x2F75, 'M', '竹'), - (0x2F76, 'M', '米'), - (0x2F77, 'M', '糸'), - (0x2F78, 'M', '缶'), - (0x2F79, 'M', '网'), - (0x2F7A, 'M', '羊'), - (0x2F7B, 'M', '羽'), - (0x2F7C, 'M', '老'), - (0x2F7D, 'M', '而'), - ] - -def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F7E, 'M', '耒'), - (0x2F7F, 'M', '耳'), - (0x2F80, 'M', '聿'), - (0x2F81, 'M', '肉'), - (0x2F82, 'M', '臣'), - (0x2F83, 'M', '自'), - (0x2F84, 'M', '至'), - (0x2F85, 'M', '臼'), - (0x2F86, 'M', '舌'), - (0x2F87, 'M', '舛'), - (0x2F88, 'M', '舟'), - (0x2F89, 'M', '艮'), - (0x2F8A, 'M', '色'), - (0x2F8B, 'M', '艸'), - (0x2F8C, 'M', '虍'), - (0x2F8D, 'M', '虫'), - (0x2F8E, 'M', '血'), - (0x2F8F, 'M', '行'), - (0x2F90, 'M', '衣'), - (0x2F91, 'M', '襾'), - (0x2F92, 'M', '見'), - (0x2F93, 'M', '角'), - (0x2F94, 'M', '言'), - (0x2F95, 'M', '谷'), - (0x2F96, 'M', '豆'), - (0x2F97, 'M', '豕'), - (0x2F98, 'M', '豸'), - (0x2F99, 'M', '貝'), - (0x2F9A, 'M', '赤'), - (0x2F9B, 'M', '走'), - (0x2F9C, 'M', '足'), - (0x2F9D, 'M', '身'), - (0x2F9E, 'M', '車'), - (0x2F9F, 'M', '辛'), - (0x2FA0, 'M', '辰'), - (0x2FA1, 'M', '辵'), - (0x2FA2, 'M', '邑'), - (0x2FA3, 'M', '酉'), - (0x2FA4, 'M', '釆'), - (0x2FA5, 'M', '里'), - (0x2FA6, 'M', '金'), - (0x2FA7, 'M', '長'), - (0x2FA8, 'M', '門'), - (0x2FA9, 'M', '阜'), - (0x2FAA, 'M', '隶'), - (0x2FAB, 'M', '隹'), - (0x2FAC, 'M', '雨'), - (0x2FAD, 'M', '靑'), - (0x2FAE, 'M', '非'), - (0x2FAF, 'M', '面'), - (0x2FB0, 'M', '革'), - (0x2FB1, 'M', '韋'), - (0x2FB2, 'M', '韭'), - (0x2FB3, 'M', '音'), - (0x2FB4, 'M', '頁'), - (0x2FB5, 'M', '風'), - (0x2FB6, 'M', '飛'), - (0x2FB7, 'M', '食'), - (0x2FB8, 'M', '首'), - (0x2FB9, 'M', '香'), - (0x2FBA, 'M', '馬'), - (0x2FBB, 'M', '骨'), - (0x2FBC, 'M', '高'), - (0x2FBD, 'M', '髟'), - (0x2FBE, 'M', '鬥'), - (0x2FBF, 'M', '鬯'), - (0x2FC0, 'M', '鬲'), - (0x2FC1, 'M', '鬼'), - (0x2FC2, 'M', '魚'), - (0x2FC3, 'M', '鳥'), - (0x2FC4, 'M', '鹵'), - (0x2FC5, 'M', '鹿'), - (0x2FC6, 'M', '麥'), - (0x2FC7, 'M', '麻'), - (0x2FC8, 'M', '黃'), - (0x2FC9, 'M', '黍'), - (0x2FCA, 'M', '黑'), - (0x2FCB, 'M', '黹'), - (0x2FCC, 'M', '黽'), - (0x2FCD, 'M', '鼎'), - (0x2FCE, 'M', '鼓'), - (0x2FCF, 'M', '鼠'), - (0x2FD0, 'M', '鼻'), - (0x2FD1, 'M', '齊'), - (0x2FD2, 'M', '齒'), - (0x2FD3, 'M', '龍'), - (0x2FD4, 'M', '龜'), - (0x2FD5, 'M', '龠'), - (0x2FD6, 'X'), - (0x3000, '3', ' '), - (0x3001, 'V'), - (0x3002, 'M', '.'), - (0x3003, 'V'), - (0x3036, 'M', '〒'), - (0x3037, 'V'), - (0x3038, 'M', '十'), - (0x3039, 'M', '卄'), - (0x303A, 'M', '卅'), - (0x303B, 'V'), - (0x3040, 'X'), - ] - -def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3041, 'V'), - (0x3097, 'X'), - (0x3099, 'V'), - (0x309B, '3', ' ゙'), - (0x309C, '3', ' ゚'), - (0x309D, 'V'), - (0x309F, 'M', 'より'), - (0x30A0, 'V'), - (0x30FF, 'M', 'コト'), - (0x3100, 'X'), - (0x3105, 'V'), - (0x3130, 'X'), - (0x3131, 'M', 'ᄀ'), - (0x3132, 'M', 'ᄁ'), - (0x3133, 'M', 'ᆪ'), - (0x3134, 'M', 'ᄂ'), - (0x3135, 'M', 'ᆬ'), - (0x3136, 'M', 'ᆭ'), - (0x3137, 'M', 'ᄃ'), - (0x3138, 'M', 'ᄄ'), - (0x3139, 'M', 'ᄅ'), - (0x313A, 'M', 'ᆰ'), - (0x313B, 'M', 'ᆱ'), - (0x313C, 'M', 'ᆲ'), - (0x313D, 'M', 'ᆳ'), - (0x313E, 'M', 'ᆴ'), - (0x313F, 'M', 'ᆵ'), - (0x3140, 'M', 'ᄚ'), - (0x3141, 'M', 'ᄆ'), - (0x3142, 'M', 'ᄇ'), - (0x3143, 'M', 'ᄈ'), - (0x3144, 'M', 'ᄡ'), - (0x3145, 'M', 'ᄉ'), - (0x3146, 'M', 'ᄊ'), - (0x3147, 'M', 'ᄋ'), - (0x3148, 'M', 'ᄌ'), - (0x3149, 'M', 'ᄍ'), - (0x314A, 'M', 'ᄎ'), - (0x314B, 'M', 'ᄏ'), - (0x314C, 'M', 'ᄐ'), - (0x314D, 'M', 'ᄑ'), - (0x314E, 'M', 'ᄒ'), - (0x314F, 'M', 'ᅡ'), - (0x3150, 'M', 'ᅢ'), - (0x3151, 'M', 'ᅣ'), - (0x3152, 'M', 'ᅤ'), - (0x3153, 'M', 'ᅥ'), - (0x3154, 'M', 'ᅦ'), - (0x3155, 'M', 'ᅧ'), - (0x3156, 'M', 'ᅨ'), - (0x3157, 'M', 'ᅩ'), - (0x3158, 'M', 'ᅪ'), - (0x3159, 'M', 'ᅫ'), - (0x315A, 'M', 'ᅬ'), - (0x315B, 'M', 'ᅭ'), - (0x315C, 'M', 'ᅮ'), - (0x315D, 'M', 'ᅯ'), - (0x315E, 'M', 'ᅰ'), - (0x315F, 'M', 'ᅱ'), - (0x3160, 'M', 'ᅲ'), - (0x3161, 'M', 'ᅳ'), - (0x3162, 'M', 'ᅴ'), - (0x3163, 'M', 'ᅵ'), - (0x3164, 'X'), - (0x3165, 'M', 'ᄔ'), - (0x3166, 'M', 'ᄕ'), - (0x3167, 'M', 'ᇇ'), - (0x3168, 'M', 'ᇈ'), - (0x3169, 'M', 'ᇌ'), - (0x316A, 'M', 'ᇎ'), - (0x316B, 'M', 'ᇓ'), - (0x316C, 'M', 'ᇗ'), - (0x316D, 'M', 'ᇙ'), - (0x316E, 'M', 'ᄜ'), - (0x316F, 'M', 'ᇝ'), - (0x3170, 'M', 'ᇟ'), - (0x3171, 'M', 'ᄝ'), - (0x3172, 'M', 'ᄞ'), - (0x3173, 'M', 'ᄠ'), - (0x3174, 'M', 'ᄢ'), - (0x3175, 'M', 'ᄣ'), - (0x3176, 'M', 'ᄧ'), - (0x3177, 'M', 'ᄩ'), - (0x3178, 'M', 'ᄫ'), - (0x3179, 'M', 'ᄬ'), - (0x317A, 'M', 'ᄭ'), - (0x317B, 'M', 'ᄮ'), - (0x317C, 'M', 'ᄯ'), - (0x317D, 'M', 'ᄲ'), - (0x317E, 'M', 'ᄶ'), - (0x317F, 'M', 'ᅀ'), - (0x3180, 'M', 'ᅇ'), - (0x3181, 'M', 'ᅌ'), - (0x3182, 'M', 'ᇱ'), - (0x3183, 'M', 'ᇲ'), - (0x3184, 'M', 'ᅗ'), - (0x3185, 'M', 'ᅘ'), - (0x3186, 'M', 'ᅙ'), - (0x3187, 'M', 'ᆄ'), - (0x3188, 'M', 'ᆅ'), - ] - -def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3189, 'M', 'ᆈ'), - (0x318A, 'M', 'ᆑ'), - (0x318B, 'M', 'ᆒ'), - (0x318C, 'M', 'ᆔ'), - (0x318D, 'M', 'ᆞ'), - (0x318E, 'M', 'ᆡ'), - (0x318F, 'X'), - (0x3190, 'V'), - (0x3192, 'M', '一'), - (0x3193, 'M', '二'), - (0x3194, 'M', '三'), - (0x3195, 'M', '四'), - (0x3196, 'M', '上'), - (0x3197, 'M', '中'), - (0x3198, 'M', '下'), - (0x3199, 'M', '甲'), - (0x319A, 'M', '乙'), - (0x319B, 'M', '丙'), - (0x319C, 'M', '丁'), - (0x319D, 'M', '天'), - (0x319E, 'M', '地'), - (0x319F, 'M', '人'), - (0x31A0, 'V'), - (0x31E4, 'X'), - (0x31F0, 'V'), - (0x3200, '3', '(ᄀ)'), - (0x3201, '3', '(ᄂ)'), - (0x3202, '3', '(ᄃ)'), - (0x3203, '3', '(ᄅ)'), - (0x3204, '3', '(ᄆ)'), - (0x3205, '3', '(ᄇ)'), - (0x3206, '3', '(ᄉ)'), - (0x3207, '3', '(ᄋ)'), - (0x3208, '3', '(ᄌ)'), - (0x3209, '3', '(ᄎ)'), - (0x320A, '3', '(ᄏ)'), - (0x320B, '3', '(ᄐ)'), - (0x320C, '3', '(ᄑ)'), - (0x320D, '3', '(ᄒ)'), - (0x320E, '3', '(가)'), - (0x320F, '3', '(나)'), - (0x3210, '3', '(다)'), - (0x3211, '3', '(라)'), - (0x3212, '3', '(마)'), - (0x3213, '3', '(바)'), - (0x3214, '3', '(사)'), - (0x3215, '3', '(아)'), - (0x3216, '3', '(자)'), - (0x3217, '3', '(차)'), - (0x3218, '3', '(카)'), - (0x3219, '3', '(타)'), - (0x321A, '3', '(파)'), - (0x321B, '3', '(하)'), - (0x321C, '3', '(주)'), - (0x321D, '3', '(오전)'), - (0x321E, '3', '(오후)'), - (0x321F, 'X'), - (0x3220, '3', '(一)'), - (0x3221, '3', '(二)'), - (0x3222, '3', '(三)'), - (0x3223, '3', '(四)'), - (0x3224, '3', '(五)'), - (0x3225, '3', '(六)'), - (0x3226, '3', '(七)'), - (0x3227, '3', '(八)'), - (0x3228, '3', '(九)'), - (0x3229, '3', '(十)'), - (0x322A, '3', '(月)'), - (0x322B, '3', '(火)'), - (0x322C, '3', '(水)'), - (0x322D, '3', '(木)'), - (0x322E, '3', '(金)'), - (0x322F, '3', '(土)'), - (0x3230, '3', '(日)'), - (0x3231, '3', '(株)'), - (0x3232, '3', '(有)'), - (0x3233, '3', '(社)'), - (0x3234, '3', '(名)'), - (0x3235, '3', '(特)'), - (0x3236, '3', '(財)'), - (0x3237, '3', '(祝)'), - (0x3238, '3', '(労)'), - (0x3239, '3', '(代)'), - (0x323A, '3', '(呼)'), - (0x323B, '3', '(学)'), - (0x323C, '3', '(監)'), - (0x323D, '3', '(企)'), - (0x323E, '3', '(資)'), - (0x323F, '3', '(協)'), - (0x3240, '3', '(祭)'), - (0x3241, '3', '(休)'), - (0x3242, '3', '(自)'), - (0x3243, '3', '(至)'), - (0x3244, 'M', '問'), - (0x3245, 'M', '幼'), - (0x3246, 'M', '文'), - (0x3247, 'M', '箏'), - (0x3248, 'V'), - (0x3250, 'M', 'pte'), - (0x3251, 'M', '21'), - ] - -def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3252, 'M', '22'), - (0x3253, 'M', '23'), - (0x3254, 'M', '24'), - (0x3255, 'M', '25'), - (0x3256, 'M', '26'), - (0x3257, 'M', '27'), - (0x3258, 'M', '28'), - (0x3259, 'M', '29'), - (0x325A, 'M', '30'), - (0x325B, 'M', '31'), - (0x325C, 'M', '32'), - (0x325D, 'M', '33'), - (0x325E, 'M', '34'), - (0x325F, 'M', '35'), - (0x3260, 'M', 'ᄀ'), - (0x3261, 'M', 'ᄂ'), - (0x3262, 'M', 'ᄃ'), - (0x3263, 'M', 'ᄅ'), - (0x3264, 'M', 'ᄆ'), - (0x3265, 'M', 'ᄇ'), - (0x3266, 'M', 'ᄉ'), - (0x3267, 'M', 'ᄋ'), - (0x3268, 'M', 'ᄌ'), - (0x3269, 'M', 'ᄎ'), - (0x326A, 'M', 'ᄏ'), - (0x326B, 'M', 'ᄐ'), - (0x326C, 'M', 'ᄑ'), - (0x326D, 'M', 'ᄒ'), - (0x326E, 'M', '가'), - (0x326F, 'M', '나'), - (0x3270, 'M', '다'), - (0x3271, 'M', '라'), - (0x3272, 'M', '마'), - (0x3273, 'M', '바'), - (0x3274, 'M', '사'), - (0x3275, 'M', '아'), - (0x3276, 'M', '자'), - (0x3277, 'M', '차'), - (0x3278, 'M', '카'), - (0x3279, 'M', '타'), - (0x327A, 'M', '파'), - (0x327B, 'M', '하'), - (0x327C, 'M', '참고'), - (0x327D, 'M', '주의'), - (0x327E, 'M', '우'), - (0x327F, 'V'), - (0x3280, 'M', '一'), - (0x3281, 'M', '二'), - (0x3282, 'M', '三'), - (0x3283, 'M', '四'), - (0x3284, 'M', '五'), - (0x3285, 'M', '六'), - (0x3286, 'M', '七'), - (0x3287, 'M', '八'), - (0x3288, 'M', '九'), - (0x3289, 'M', '十'), - (0x328A, 'M', '月'), - (0x328B, 'M', '火'), - (0x328C, 'M', '水'), - (0x328D, 'M', '木'), - (0x328E, 'M', '金'), - (0x328F, 'M', '土'), - (0x3290, 'M', '日'), - (0x3291, 'M', '株'), - (0x3292, 'M', '有'), - (0x3293, 'M', '社'), - (0x3294, 'M', '名'), - (0x3295, 'M', '特'), - (0x3296, 'M', '財'), - (0x3297, 'M', '祝'), - (0x3298, 'M', '労'), - (0x3299, 'M', '秘'), - (0x329A, 'M', '男'), - (0x329B, 'M', '女'), - (0x329C, 'M', '適'), - (0x329D, 'M', '優'), - (0x329E, 'M', '印'), - (0x329F, 'M', '注'), - (0x32A0, 'M', '項'), - (0x32A1, 'M', '休'), - (0x32A2, 'M', '写'), - (0x32A3, 'M', '正'), - (0x32A4, 'M', '上'), - (0x32A5, 'M', '中'), - (0x32A6, 'M', '下'), - (0x32A7, 'M', '左'), - (0x32A8, 'M', '右'), - (0x32A9, 'M', '医'), - (0x32AA, 'M', '宗'), - (0x32AB, 'M', '学'), - (0x32AC, 'M', '監'), - (0x32AD, 'M', '企'), - (0x32AE, 'M', '資'), - (0x32AF, 'M', '協'), - (0x32B0, 'M', '夜'), - (0x32B1, 'M', '36'), - (0x32B2, 'M', '37'), - (0x32B3, 'M', '38'), - (0x32B4, 'M', '39'), - (0x32B5, 'M', '40'), - ] - -def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x32B6, 'M', '41'), - (0x32B7, 'M', '42'), - (0x32B8, 'M', '43'), - (0x32B9, 'M', '44'), - (0x32BA, 'M', '45'), - (0x32BB, 'M', '46'), - (0x32BC, 'M', '47'), - (0x32BD, 'M', '48'), - (0x32BE, 'M', '49'), - (0x32BF, 'M', '50'), - (0x32C0, 'M', '1月'), - (0x32C1, 'M', '2月'), - (0x32C2, 'M', '3月'), - (0x32C3, 'M', '4月'), - (0x32C4, 'M', '5月'), - (0x32C5, 'M', '6月'), - (0x32C6, 'M', '7月'), - (0x32C7, 'M', '8月'), - (0x32C8, 'M', '9月'), - (0x32C9, 'M', '10月'), - (0x32CA, 'M', '11月'), - (0x32CB, 'M', '12月'), - (0x32CC, 'M', 'hg'), - (0x32CD, 'M', 'erg'), - (0x32CE, 'M', 'ev'), - (0x32CF, 'M', 'ltd'), - (0x32D0, 'M', 'ア'), - (0x32D1, 'M', 'イ'), - (0x32D2, 'M', 'ウ'), - (0x32D3, 'M', 'エ'), - (0x32D4, 'M', 'オ'), - (0x32D5, 'M', 'カ'), - (0x32D6, 'M', 'キ'), - (0x32D7, 'M', 'ク'), - (0x32D8, 'M', 'ケ'), - (0x32D9, 'M', 'コ'), - (0x32DA, 'M', 'サ'), - (0x32DB, 'M', 'シ'), - (0x32DC, 'M', 'ス'), - (0x32DD, 'M', 'セ'), - (0x32DE, 'M', 'ソ'), - (0x32DF, 'M', 'タ'), - (0x32E0, 'M', 'チ'), - (0x32E1, 'M', 'ツ'), - (0x32E2, 'M', 'テ'), - (0x32E3, 'M', 'ト'), - (0x32E4, 'M', 'ナ'), - (0x32E5, 'M', 'ニ'), - (0x32E6, 'M', 'ヌ'), - (0x32E7, 'M', 'ネ'), - (0x32E8, 'M', 'ノ'), - (0x32E9, 'M', 'ハ'), - (0x32EA, 'M', 'ヒ'), - (0x32EB, 'M', 'フ'), - (0x32EC, 'M', 'ヘ'), - (0x32ED, 'M', 'ホ'), - (0x32EE, 'M', 'マ'), - (0x32EF, 'M', 'ミ'), - (0x32F0, 'M', 'ム'), - (0x32F1, 'M', 'メ'), - (0x32F2, 'M', 'モ'), - (0x32F3, 'M', 'ヤ'), - (0x32F4, 'M', 'ユ'), - (0x32F5, 'M', 'ヨ'), - (0x32F6, 'M', 'ラ'), - (0x32F7, 'M', 'リ'), - (0x32F8, 'M', 'ル'), - (0x32F9, 'M', 'レ'), - (0x32FA, 'M', 'ロ'), - (0x32FB, 'M', 'ワ'), - (0x32FC, 'M', 'ヰ'), - (0x32FD, 'M', 'ヱ'), - (0x32FE, 'M', 'ヲ'), - (0x32FF, 'M', '令和'), - (0x3300, 'M', 'アパート'), - (0x3301, 'M', 'アルファ'), - (0x3302, 'M', 'アンペア'), - (0x3303, 'M', 'アール'), - (0x3304, 'M', 'イニング'), - (0x3305, 'M', 'インチ'), - (0x3306, 'M', 'ウォン'), - (0x3307, 'M', 'エスクード'), - (0x3308, 'M', 'エーカー'), - (0x3309, 'M', 'オンス'), - (0x330A, 'M', 'オーム'), - (0x330B, 'M', 'カイリ'), - (0x330C, 'M', 'カラット'), - (0x330D, 'M', 'カロリー'), - (0x330E, 'M', 'ガロン'), - (0x330F, 'M', 'ガンマ'), - (0x3310, 'M', 'ギガ'), - (0x3311, 'M', 'ギニー'), - (0x3312, 'M', 'キュリー'), - (0x3313, 'M', 'ギルダー'), - (0x3314, 'M', 'キロ'), - (0x3315, 'M', 'キログラム'), - (0x3316, 'M', 'キロメートル'), - (0x3317, 'M', 'キロワット'), - (0x3318, 'M', 'グラム'), - (0x3319, 'M', 'グラムトン'), - ] - -def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x331A, 'M', 'クルゼイロ'), - (0x331B, 'M', 'クローネ'), - (0x331C, 'M', 'ケース'), - (0x331D, 'M', 'コルナ'), - (0x331E, 'M', 'コーポ'), - (0x331F, 'M', 'サイクル'), - (0x3320, 'M', 'サンチーム'), - (0x3321, 'M', 'シリング'), - (0x3322, 'M', 'センチ'), - (0x3323, 'M', 'セント'), - (0x3324, 'M', 'ダース'), - (0x3325, 'M', 'デシ'), - (0x3326, 'M', 'ドル'), - (0x3327, 'M', 'トン'), - (0x3328, 'M', 'ナノ'), - (0x3329, 'M', 'ノット'), - (0x332A, 'M', 'ハイツ'), - (0x332B, 'M', 'パーセント'), - (0x332C, 'M', 'パーツ'), - (0x332D, 'M', 'バーレル'), - (0x332E, 'M', 'ピアストル'), - (0x332F, 'M', 'ピクル'), - (0x3330, 'M', 'ピコ'), - (0x3331, 'M', 'ビル'), - (0x3332, 'M', 'ファラッド'), - (0x3333, 'M', 'フィート'), - (0x3334, 'M', 'ブッシェル'), - (0x3335, 'M', 'フラン'), - (0x3336, 'M', 'ヘクタール'), - (0x3337, 'M', 'ペソ'), - (0x3338, 'M', 'ペニヒ'), - (0x3339, 'M', 'ヘルツ'), - (0x333A, 'M', 'ペンス'), - (0x333B, 'M', 'ページ'), - (0x333C, 'M', 'ベータ'), - (0x333D, 'M', 'ポイント'), - (0x333E, 'M', 'ボルト'), - (0x333F, 'M', 'ホン'), - (0x3340, 'M', 'ポンド'), - (0x3341, 'M', 'ホール'), - (0x3342, 'M', 'ホーン'), - (0x3343, 'M', 'マイクロ'), - (0x3344, 'M', 'マイル'), - (0x3345, 'M', 'マッハ'), - (0x3346, 'M', 'マルク'), - (0x3347, 'M', 'マンション'), - (0x3348, 'M', 'ミクロン'), - (0x3349, 'M', 'ミリ'), - (0x334A, 'M', 'ミリバール'), - (0x334B, 'M', 'メガ'), - (0x334C, 'M', 'メガトン'), - (0x334D, 'M', 'メートル'), - (0x334E, 'M', 'ヤード'), - (0x334F, 'M', 'ヤール'), - (0x3350, 'M', 'ユアン'), - (0x3351, 'M', 'リットル'), - (0x3352, 'M', 'リラ'), - (0x3353, 'M', 'ルピー'), - (0x3354, 'M', 'ルーブル'), - (0x3355, 'M', 'レム'), - (0x3356, 'M', 'レントゲン'), - (0x3357, 'M', 'ワット'), - (0x3358, 'M', '0点'), - (0x3359, 'M', '1点'), - (0x335A, 'M', '2点'), - (0x335B, 'M', '3点'), - (0x335C, 'M', '4点'), - (0x335D, 'M', '5点'), - (0x335E, 'M', '6点'), - (0x335F, 'M', '7点'), - (0x3360, 'M', '8点'), - (0x3361, 'M', '9点'), - (0x3362, 'M', '10点'), - (0x3363, 'M', '11点'), - (0x3364, 'M', '12点'), - (0x3365, 'M', '13点'), - (0x3366, 'M', '14点'), - (0x3367, 'M', '15点'), - (0x3368, 'M', '16点'), - (0x3369, 'M', '17点'), - (0x336A, 'M', '18点'), - (0x336B, 'M', '19点'), - (0x336C, 'M', '20点'), - (0x336D, 'M', '21点'), - (0x336E, 'M', '22点'), - (0x336F, 'M', '23点'), - (0x3370, 'M', '24点'), - (0x3371, 'M', 'hpa'), - (0x3372, 'M', 'da'), - (0x3373, 'M', 'au'), - (0x3374, 'M', 'bar'), - (0x3375, 'M', 'ov'), - (0x3376, 'M', 'pc'), - (0x3377, 'M', 'dm'), - (0x3378, 'M', 'dm2'), - (0x3379, 'M', 'dm3'), - (0x337A, 'M', 'iu'), - (0x337B, 'M', '平成'), - (0x337C, 'M', '昭和'), - (0x337D, 'M', '大正'), - ] - -def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x337E, 'M', '明治'), - (0x337F, 'M', '株式会社'), - (0x3380, 'M', 'pa'), - (0x3381, 'M', 'na'), - (0x3382, 'M', 'μa'), - (0x3383, 'M', 'ma'), - (0x3384, 'M', 'ka'), - (0x3385, 'M', 'kb'), - (0x3386, 'M', 'mb'), - (0x3387, 'M', 'gb'), - (0x3388, 'M', 'cal'), - (0x3389, 'M', 'kcal'), - (0x338A, 'M', 'pf'), - (0x338B, 'M', 'nf'), - (0x338C, 'M', 'μf'), - (0x338D, 'M', 'μg'), - (0x338E, 'M', 'mg'), - (0x338F, 'M', 'kg'), - (0x3390, 'M', 'hz'), - (0x3391, 'M', 'khz'), - (0x3392, 'M', 'mhz'), - (0x3393, 'M', 'ghz'), - (0x3394, 'M', 'thz'), - (0x3395, 'M', 'μl'), - (0x3396, 'M', 'ml'), - (0x3397, 'M', 'dl'), - (0x3398, 'M', 'kl'), - (0x3399, 'M', 'fm'), - (0x339A, 'M', 'nm'), - (0x339B, 'M', 'μm'), - (0x339C, 'M', 'mm'), - (0x339D, 'M', 'cm'), - (0x339E, 'M', 'km'), - (0x339F, 'M', 'mm2'), - (0x33A0, 'M', 'cm2'), - (0x33A1, 'M', 'm2'), - (0x33A2, 'M', 'km2'), - (0x33A3, 'M', 'mm3'), - (0x33A4, 'M', 'cm3'), - (0x33A5, 'M', 'm3'), - (0x33A6, 'M', 'km3'), - (0x33A7, 'M', 'm∕s'), - (0x33A8, 'M', 'm∕s2'), - (0x33A9, 'M', 'pa'), - (0x33AA, 'M', 'kpa'), - (0x33AB, 'M', 'mpa'), - (0x33AC, 'M', 'gpa'), - (0x33AD, 'M', 'rad'), - (0x33AE, 'M', 'rad∕s'), - (0x33AF, 'M', 'rad∕s2'), - (0x33B0, 'M', 'ps'), - (0x33B1, 'M', 'ns'), - (0x33B2, 'M', 'μs'), - (0x33B3, 'M', 'ms'), - (0x33B4, 'M', 'pv'), - (0x33B5, 'M', 'nv'), - (0x33B6, 'M', 'μv'), - (0x33B7, 'M', 'mv'), - (0x33B8, 'M', 'kv'), - (0x33B9, 'M', 'mv'), - (0x33BA, 'M', 'pw'), - (0x33BB, 'M', 'nw'), - (0x33BC, 'M', 'μw'), - (0x33BD, 'M', 'mw'), - (0x33BE, 'M', 'kw'), - (0x33BF, 'M', 'mw'), - (0x33C0, 'M', 'kω'), - (0x33C1, 'M', 'mω'), - (0x33C2, 'X'), - (0x33C3, 'M', 'bq'), - (0x33C4, 'M', 'cc'), - (0x33C5, 'M', 'cd'), - (0x33C6, 'M', 'c∕kg'), - (0x33C7, 'X'), - (0x33C8, 'M', 'db'), - (0x33C9, 'M', 'gy'), - (0x33CA, 'M', 'ha'), - (0x33CB, 'M', 'hp'), - (0x33CC, 'M', 'in'), - (0x33CD, 'M', 'kk'), - (0x33CE, 'M', 'km'), - (0x33CF, 'M', 'kt'), - (0x33D0, 'M', 'lm'), - (0x33D1, 'M', 'ln'), - (0x33D2, 'M', 'log'), - (0x33D3, 'M', 'lx'), - (0x33D4, 'M', 'mb'), - (0x33D5, 'M', 'mil'), - (0x33D6, 'M', 'mol'), - (0x33D7, 'M', 'ph'), - (0x33D8, 'X'), - (0x33D9, 'M', 'ppm'), - (0x33DA, 'M', 'pr'), - (0x33DB, 'M', 'sr'), - (0x33DC, 'M', 'sv'), - (0x33DD, 'M', 'wb'), - (0x33DE, 'M', 'v∕m'), - (0x33DF, 'M', 'a∕m'), - (0x33E0, 'M', '1日'), - (0x33E1, 'M', '2日'), - ] - -def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x33E2, 'M', '3日'), - (0x33E3, 'M', '4日'), - (0x33E4, 'M', '5日'), - (0x33E5, 'M', '6日'), - (0x33E6, 'M', '7日'), - (0x33E7, 'M', '8日'), - (0x33E8, 'M', '9日'), - (0x33E9, 'M', '10日'), - (0x33EA, 'M', '11日'), - (0x33EB, 'M', '12日'), - (0x33EC, 'M', '13日'), - (0x33ED, 'M', '14日'), - (0x33EE, 'M', '15日'), - (0x33EF, 'M', '16日'), - (0x33F0, 'M', '17日'), - (0x33F1, 'M', '18日'), - (0x33F2, 'M', '19日'), - (0x33F3, 'M', '20日'), - (0x33F4, 'M', '21日'), - (0x33F5, 'M', '22日'), - (0x33F6, 'M', '23日'), - (0x33F7, 'M', '24日'), - (0x33F8, 'M', '25日'), - (0x33F9, 'M', '26日'), - (0x33FA, 'M', '27日'), - (0x33FB, 'M', '28日'), - (0x33FC, 'M', '29日'), - (0x33FD, 'M', '30日'), - (0x33FE, 'M', '31日'), - (0x33FF, 'M', 'gal'), - (0x3400, 'V'), - (0xA48D, 'X'), - (0xA490, 'V'), - (0xA4C7, 'X'), - (0xA4D0, 'V'), - (0xA62C, 'X'), - (0xA640, 'M', 'ꙁ'), - (0xA641, 'V'), - (0xA642, 'M', 'ꙃ'), - (0xA643, 'V'), - (0xA644, 'M', 'ꙅ'), - (0xA645, 'V'), - (0xA646, 'M', 'ꙇ'), - (0xA647, 'V'), - (0xA648, 'M', 'ꙉ'), - (0xA649, 'V'), - (0xA64A, 'M', 'ꙋ'), - (0xA64B, 'V'), - (0xA64C, 'M', 'ꙍ'), - (0xA64D, 'V'), - (0xA64E, 'M', 'ꙏ'), - (0xA64F, 'V'), - (0xA650, 'M', 'ꙑ'), - (0xA651, 'V'), - (0xA652, 'M', 'ꙓ'), - (0xA653, 'V'), - (0xA654, 'M', 'ꙕ'), - (0xA655, 'V'), - (0xA656, 'M', 'ꙗ'), - (0xA657, 'V'), - (0xA658, 'M', 'ꙙ'), - (0xA659, 'V'), - (0xA65A, 'M', 'ꙛ'), - (0xA65B, 'V'), - (0xA65C, 'M', 'ꙝ'), - (0xA65D, 'V'), - (0xA65E, 'M', 'ꙟ'), - (0xA65F, 'V'), - (0xA660, 'M', 'ꙡ'), - (0xA661, 'V'), - (0xA662, 'M', 'ꙣ'), - (0xA663, 'V'), - (0xA664, 'M', 'ꙥ'), - (0xA665, 'V'), - (0xA666, 'M', 'ꙧ'), - (0xA667, 'V'), - (0xA668, 'M', 'ꙩ'), - (0xA669, 'V'), - (0xA66A, 'M', 'ꙫ'), - (0xA66B, 'V'), - (0xA66C, 'M', 'ꙭ'), - (0xA66D, 'V'), - (0xA680, 'M', 'ꚁ'), - (0xA681, 'V'), - (0xA682, 'M', 'ꚃ'), - (0xA683, 'V'), - (0xA684, 'M', 'ꚅ'), - (0xA685, 'V'), - (0xA686, 'M', 'ꚇ'), - (0xA687, 'V'), - (0xA688, 'M', 'ꚉ'), - (0xA689, 'V'), - (0xA68A, 'M', 'ꚋ'), - (0xA68B, 'V'), - (0xA68C, 'M', 'ꚍ'), - (0xA68D, 'V'), - (0xA68E, 'M', 'ꚏ'), - (0xA68F, 'V'), - (0xA690, 'M', 'ꚑ'), - (0xA691, 'V'), - ] - -def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA692, 'M', 'ꚓ'), - (0xA693, 'V'), - (0xA694, 'M', 'ꚕ'), - (0xA695, 'V'), - (0xA696, 'M', 'ꚗ'), - (0xA697, 'V'), - (0xA698, 'M', 'ꚙ'), - (0xA699, 'V'), - (0xA69A, 'M', 'ꚛ'), - (0xA69B, 'V'), - (0xA69C, 'M', 'ъ'), - (0xA69D, 'M', 'ь'), - (0xA69E, 'V'), - (0xA6F8, 'X'), - (0xA700, 'V'), - (0xA722, 'M', 'ꜣ'), - (0xA723, 'V'), - (0xA724, 'M', 'ꜥ'), - (0xA725, 'V'), - (0xA726, 'M', 'ꜧ'), - (0xA727, 'V'), - (0xA728, 'M', 'ꜩ'), - (0xA729, 'V'), - (0xA72A, 'M', 'ꜫ'), - (0xA72B, 'V'), - (0xA72C, 'M', 'ꜭ'), - (0xA72D, 'V'), - (0xA72E, 'M', 'ꜯ'), - (0xA72F, 'V'), - (0xA732, 'M', 'ꜳ'), - (0xA733, 'V'), - (0xA734, 'M', 'ꜵ'), - (0xA735, 'V'), - (0xA736, 'M', 'ꜷ'), - (0xA737, 'V'), - (0xA738, 'M', 'ꜹ'), - (0xA739, 'V'), - (0xA73A, 'M', 'ꜻ'), - (0xA73B, 'V'), - (0xA73C, 'M', 'ꜽ'), - (0xA73D, 'V'), - (0xA73E, 'M', 'ꜿ'), - (0xA73F, 'V'), - (0xA740, 'M', 'ꝁ'), - (0xA741, 'V'), - (0xA742, 'M', 'ꝃ'), - (0xA743, 'V'), - (0xA744, 'M', 'ꝅ'), - (0xA745, 'V'), - (0xA746, 'M', 'ꝇ'), - (0xA747, 'V'), - (0xA748, 'M', 'ꝉ'), - (0xA749, 'V'), - (0xA74A, 'M', 'ꝋ'), - (0xA74B, 'V'), - (0xA74C, 'M', 'ꝍ'), - (0xA74D, 'V'), - (0xA74E, 'M', 'ꝏ'), - (0xA74F, 'V'), - (0xA750, 'M', 'ꝑ'), - (0xA751, 'V'), - (0xA752, 'M', 'ꝓ'), - (0xA753, 'V'), - (0xA754, 'M', 'ꝕ'), - (0xA755, 'V'), - (0xA756, 'M', 'ꝗ'), - (0xA757, 'V'), - (0xA758, 'M', 'ꝙ'), - (0xA759, 'V'), - (0xA75A, 'M', 'ꝛ'), - (0xA75B, 'V'), - (0xA75C, 'M', 'ꝝ'), - (0xA75D, 'V'), - (0xA75E, 'M', 'ꝟ'), - (0xA75F, 'V'), - (0xA760, 'M', 'ꝡ'), - (0xA761, 'V'), - (0xA762, 'M', 'ꝣ'), - (0xA763, 'V'), - (0xA764, 'M', 'ꝥ'), - (0xA765, 'V'), - (0xA766, 'M', 'ꝧ'), - (0xA767, 'V'), - (0xA768, 'M', 'ꝩ'), - (0xA769, 'V'), - (0xA76A, 'M', 'ꝫ'), - (0xA76B, 'V'), - (0xA76C, 'M', 'ꝭ'), - (0xA76D, 'V'), - (0xA76E, 'M', 'ꝯ'), - (0xA76F, 'V'), - (0xA770, 'M', 'ꝯ'), - (0xA771, 'V'), - (0xA779, 'M', 'ꝺ'), - (0xA77A, 'V'), - (0xA77B, 'M', 'ꝼ'), - (0xA77C, 'V'), - (0xA77D, 'M', 'ᵹ'), - (0xA77E, 'M', 'ꝿ'), - (0xA77F, 'V'), - ] - -def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA780, 'M', 'ꞁ'), - (0xA781, 'V'), - (0xA782, 'M', 'ꞃ'), - (0xA783, 'V'), - (0xA784, 'M', 'ꞅ'), - (0xA785, 'V'), - (0xA786, 'M', 'ꞇ'), - (0xA787, 'V'), - (0xA78B, 'M', 'ꞌ'), - (0xA78C, 'V'), - (0xA78D, 'M', 'ɥ'), - (0xA78E, 'V'), - (0xA790, 'M', 'ꞑ'), - (0xA791, 'V'), - (0xA792, 'M', 'ꞓ'), - (0xA793, 'V'), - (0xA796, 'M', 'ꞗ'), - (0xA797, 'V'), - (0xA798, 'M', 'ꞙ'), - (0xA799, 'V'), - (0xA79A, 'M', 'ꞛ'), - (0xA79B, 'V'), - (0xA79C, 'M', 'ꞝ'), - (0xA79D, 'V'), - (0xA79E, 'M', 'ꞟ'), - (0xA79F, 'V'), - (0xA7A0, 'M', 'ꞡ'), - (0xA7A1, 'V'), - (0xA7A2, 'M', 'ꞣ'), - (0xA7A3, 'V'), - (0xA7A4, 'M', 'ꞥ'), - (0xA7A5, 'V'), - (0xA7A6, 'M', 'ꞧ'), - (0xA7A7, 'V'), - (0xA7A8, 'M', 'ꞩ'), - (0xA7A9, 'V'), - (0xA7AA, 'M', 'ɦ'), - (0xA7AB, 'M', 'ɜ'), - (0xA7AC, 'M', 'ɡ'), - (0xA7AD, 'M', 'ɬ'), - (0xA7AE, 'M', 'ɪ'), - (0xA7AF, 'V'), - (0xA7B0, 'M', 'ʞ'), - (0xA7B1, 'M', 'ʇ'), - (0xA7B2, 'M', 'ʝ'), - (0xA7B3, 'M', 'ꭓ'), - (0xA7B4, 'M', 'ꞵ'), - (0xA7B5, 'V'), - (0xA7B6, 'M', 'ꞷ'), - (0xA7B7, 'V'), - (0xA7B8, 'M', 'ꞹ'), - (0xA7B9, 'V'), - (0xA7BA, 'M', 'ꞻ'), - (0xA7BB, 'V'), - (0xA7BC, 'M', 'ꞽ'), - (0xA7BD, 'V'), - (0xA7BE, 'M', 'ꞿ'), - (0xA7BF, 'V'), - (0xA7C0, 'M', 'ꟁ'), - (0xA7C1, 'V'), - (0xA7C2, 'M', 'ꟃ'), - (0xA7C3, 'V'), - (0xA7C4, 'M', 'ꞔ'), - (0xA7C5, 'M', 'ʂ'), - (0xA7C6, 'M', 'ᶎ'), - (0xA7C7, 'M', 'ꟈ'), - (0xA7C8, 'V'), - (0xA7C9, 'M', 'ꟊ'), - (0xA7CA, 'V'), - (0xA7CB, 'X'), - (0xA7D0, 'M', 'ꟑ'), - (0xA7D1, 'V'), - (0xA7D2, 'X'), - (0xA7D3, 'V'), - (0xA7D4, 'X'), - (0xA7D5, 'V'), - (0xA7D6, 'M', 'ꟗ'), - (0xA7D7, 'V'), - (0xA7D8, 'M', 'ꟙ'), - (0xA7D9, 'V'), - (0xA7DA, 'X'), - (0xA7F2, 'M', 'c'), - (0xA7F3, 'M', 'f'), - (0xA7F4, 'M', 'q'), - (0xA7F5, 'M', 'ꟶ'), - (0xA7F6, 'V'), - (0xA7F8, 'M', 'ħ'), - (0xA7F9, 'M', 'œ'), - (0xA7FA, 'V'), - (0xA82D, 'X'), - (0xA830, 'V'), - (0xA83A, 'X'), - (0xA840, 'V'), - (0xA878, 'X'), - (0xA880, 'V'), - (0xA8C6, 'X'), - (0xA8CE, 'V'), - (0xA8DA, 'X'), - (0xA8E0, 'V'), - (0xA954, 'X'), - ] - -def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA95F, 'V'), - (0xA97D, 'X'), - (0xA980, 'V'), - (0xA9CE, 'X'), - (0xA9CF, 'V'), - (0xA9DA, 'X'), - (0xA9DE, 'V'), - (0xA9FF, 'X'), - (0xAA00, 'V'), - (0xAA37, 'X'), - (0xAA40, 'V'), - (0xAA4E, 'X'), - (0xAA50, 'V'), - (0xAA5A, 'X'), - (0xAA5C, 'V'), - (0xAAC3, 'X'), - (0xAADB, 'V'), - (0xAAF7, 'X'), - (0xAB01, 'V'), - (0xAB07, 'X'), - (0xAB09, 'V'), - (0xAB0F, 'X'), - (0xAB11, 'V'), - (0xAB17, 'X'), - (0xAB20, 'V'), - (0xAB27, 'X'), - (0xAB28, 'V'), - (0xAB2F, 'X'), - (0xAB30, 'V'), - (0xAB5C, 'M', 'ꜧ'), - (0xAB5D, 'M', 'ꬷ'), - (0xAB5E, 'M', 'ɫ'), - (0xAB5F, 'M', 'ꭒ'), - (0xAB60, 'V'), - (0xAB69, 'M', 'ʍ'), - (0xAB6A, 'V'), - (0xAB6C, 'X'), - (0xAB70, 'M', 'Ꭰ'), - (0xAB71, 'M', 'Ꭱ'), - (0xAB72, 'M', 'Ꭲ'), - (0xAB73, 'M', 'Ꭳ'), - (0xAB74, 'M', 'Ꭴ'), - (0xAB75, 'M', 'Ꭵ'), - (0xAB76, 'M', 'Ꭶ'), - (0xAB77, 'M', 'Ꭷ'), - (0xAB78, 'M', 'Ꭸ'), - (0xAB79, 'M', 'Ꭹ'), - (0xAB7A, 'M', 'Ꭺ'), - (0xAB7B, 'M', 'Ꭻ'), - (0xAB7C, 'M', 'Ꭼ'), - (0xAB7D, 'M', 'Ꭽ'), - (0xAB7E, 'M', 'Ꭾ'), - (0xAB7F, 'M', 'Ꭿ'), - (0xAB80, 'M', 'Ꮀ'), - (0xAB81, 'M', 'Ꮁ'), - (0xAB82, 'M', 'Ꮂ'), - (0xAB83, 'M', 'Ꮃ'), - (0xAB84, 'M', 'Ꮄ'), - (0xAB85, 'M', 'Ꮅ'), - (0xAB86, 'M', 'Ꮆ'), - (0xAB87, 'M', 'Ꮇ'), - (0xAB88, 'M', 'Ꮈ'), - (0xAB89, 'M', 'Ꮉ'), - (0xAB8A, 'M', 'Ꮊ'), - (0xAB8B, 'M', 'Ꮋ'), - (0xAB8C, 'M', 'Ꮌ'), - (0xAB8D, 'M', 'Ꮍ'), - (0xAB8E, 'M', 'Ꮎ'), - (0xAB8F, 'M', 'Ꮏ'), - (0xAB90, 'M', 'Ꮐ'), - (0xAB91, 'M', 'Ꮑ'), - (0xAB92, 'M', 'Ꮒ'), - (0xAB93, 'M', 'Ꮓ'), - (0xAB94, 'M', 'Ꮔ'), - (0xAB95, 'M', 'Ꮕ'), - (0xAB96, 'M', 'Ꮖ'), - (0xAB97, 'M', 'Ꮗ'), - (0xAB98, 'M', 'Ꮘ'), - (0xAB99, 'M', 'Ꮙ'), - (0xAB9A, 'M', 'Ꮚ'), - (0xAB9B, 'M', 'Ꮛ'), - (0xAB9C, 'M', 'Ꮜ'), - (0xAB9D, 'M', 'Ꮝ'), - (0xAB9E, 'M', 'Ꮞ'), - (0xAB9F, 'M', 'Ꮟ'), - (0xABA0, 'M', 'Ꮠ'), - (0xABA1, 'M', 'Ꮡ'), - (0xABA2, 'M', 'Ꮢ'), - (0xABA3, 'M', 'Ꮣ'), - (0xABA4, 'M', 'Ꮤ'), - (0xABA5, 'M', 'Ꮥ'), - (0xABA6, 'M', 'Ꮦ'), - (0xABA7, 'M', 'Ꮧ'), - (0xABA8, 'M', 'Ꮨ'), - (0xABA9, 'M', 'Ꮩ'), - (0xABAA, 'M', 'Ꮪ'), - (0xABAB, 'M', 'Ꮫ'), - (0xABAC, 'M', 'Ꮬ'), - (0xABAD, 'M', 'Ꮭ'), - (0xABAE, 'M', 'Ꮮ'), - ] - -def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xABAF, 'M', 'Ꮯ'), - (0xABB0, 'M', 'Ꮰ'), - (0xABB1, 'M', 'Ꮱ'), - (0xABB2, 'M', 'Ꮲ'), - (0xABB3, 'M', 'Ꮳ'), - (0xABB4, 'M', 'Ꮴ'), - (0xABB5, 'M', 'Ꮵ'), - (0xABB6, 'M', 'Ꮶ'), - (0xABB7, 'M', 'Ꮷ'), - (0xABB8, 'M', 'Ꮸ'), - (0xABB9, 'M', 'Ꮹ'), - (0xABBA, 'M', 'Ꮺ'), - (0xABBB, 'M', 'Ꮻ'), - (0xABBC, 'M', 'Ꮼ'), - (0xABBD, 'M', 'Ꮽ'), - (0xABBE, 'M', 'Ꮾ'), - (0xABBF, 'M', 'Ꮿ'), - (0xABC0, 'V'), - (0xABEE, 'X'), - (0xABF0, 'V'), - (0xABFA, 'X'), - (0xAC00, 'V'), - (0xD7A4, 'X'), - (0xD7B0, 'V'), - (0xD7C7, 'X'), - (0xD7CB, 'V'), - (0xD7FC, 'X'), - (0xF900, 'M', '豈'), - (0xF901, 'M', '更'), - (0xF902, 'M', '車'), - (0xF903, 'M', '賈'), - (0xF904, 'M', '滑'), - (0xF905, 'M', '串'), - (0xF906, 'M', '句'), - (0xF907, 'M', '龜'), - (0xF909, 'M', '契'), - (0xF90A, 'M', '金'), - (0xF90B, 'M', '喇'), - (0xF90C, 'M', '奈'), - (0xF90D, 'M', '懶'), - (0xF90E, 'M', '癩'), - (0xF90F, 'M', '羅'), - (0xF910, 'M', '蘿'), - (0xF911, 'M', '螺'), - (0xF912, 'M', '裸'), - (0xF913, 'M', '邏'), - (0xF914, 'M', '樂'), - (0xF915, 'M', '洛'), - (0xF916, 'M', '烙'), - (0xF917, 'M', '珞'), - (0xF918, 'M', '落'), - (0xF919, 'M', '酪'), - (0xF91A, 'M', '駱'), - (0xF91B, 'M', '亂'), - (0xF91C, 'M', '卵'), - (0xF91D, 'M', '欄'), - (0xF91E, 'M', '爛'), - (0xF91F, 'M', '蘭'), - (0xF920, 'M', '鸞'), - (0xF921, 'M', '嵐'), - (0xF922, 'M', '濫'), - (0xF923, 'M', '藍'), - (0xF924, 'M', '襤'), - (0xF925, 'M', '拉'), - (0xF926, 'M', '臘'), - (0xF927, 'M', '蠟'), - (0xF928, 'M', '廊'), - (0xF929, 'M', '朗'), - (0xF92A, 'M', '浪'), - (0xF92B, 'M', '狼'), - (0xF92C, 'M', '郎'), - (0xF92D, 'M', '來'), - (0xF92E, 'M', '冷'), - (0xF92F, 'M', '勞'), - (0xF930, 'M', '擄'), - (0xF931, 'M', '櫓'), - (0xF932, 'M', '爐'), - (0xF933, 'M', '盧'), - (0xF934, 'M', '老'), - (0xF935, 'M', '蘆'), - (0xF936, 'M', '虜'), - (0xF937, 'M', '路'), - (0xF938, 'M', '露'), - (0xF939, 'M', '魯'), - (0xF93A, 'M', '鷺'), - (0xF93B, 'M', '碌'), - (0xF93C, 'M', '祿'), - (0xF93D, 'M', '綠'), - (0xF93E, 'M', '菉'), - (0xF93F, 'M', '錄'), - (0xF940, 'M', '鹿'), - (0xF941, 'M', '論'), - (0xF942, 'M', '壟'), - (0xF943, 'M', '弄'), - (0xF944, 'M', '籠'), - (0xF945, 'M', '聾'), - (0xF946, 'M', '牢'), - (0xF947, 'M', '磊'), - (0xF948, 'M', '賂'), - (0xF949, 'M', '雷'), - ] - -def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xF94A, 'M', '壘'), - (0xF94B, 'M', '屢'), - (0xF94C, 'M', '樓'), - (0xF94D, 'M', '淚'), - (0xF94E, 'M', '漏'), - (0xF94F, 'M', '累'), - (0xF950, 'M', '縷'), - (0xF951, 'M', '陋'), - (0xF952, 'M', '勒'), - (0xF953, 'M', '肋'), - (0xF954, 'M', '凜'), - (0xF955, 'M', '凌'), - (0xF956, 'M', '稜'), - (0xF957, 'M', '綾'), - (0xF958, 'M', '菱'), - (0xF959, 'M', '陵'), - (0xF95A, 'M', '讀'), - (0xF95B, 'M', '拏'), - (0xF95C, 'M', '樂'), - (0xF95D, 'M', '諾'), - (0xF95E, 'M', '丹'), - (0xF95F, 'M', '寧'), - (0xF960, 'M', '怒'), - (0xF961, 'M', '率'), - (0xF962, 'M', '異'), - (0xF963, 'M', '北'), - (0xF964, 'M', '磻'), - (0xF965, 'M', '便'), - (0xF966, 'M', '復'), - (0xF967, 'M', '不'), - (0xF968, 'M', '泌'), - (0xF969, 'M', '數'), - (0xF96A, 'M', '索'), - (0xF96B, 'M', '參'), - (0xF96C, 'M', '塞'), - (0xF96D, 'M', '省'), - (0xF96E, 'M', '葉'), - (0xF96F, 'M', '說'), - (0xF970, 'M', '殺'), - (0xF971, 'M', '辰'), - (0xF972, 'M', '沈'), - (0xF973, 'M', '拾'), - (0xF974, 'M', '若'), - (0xF975, 'M', '掠'), - (0xF976, 'M', '略'), - (0xF977, 'M', '亮'), - (0xF978, 'M', '兩'), - (0xF979, 'M', '凉'), - (0xF97A, 'M', '梁'), - (0xF97B, 'M', '糧'), - (0xF97C, 'M', '良'), - (0xF97D, 'M', '諒'), - (0xF97E, 'M', '量'), - (0xF97F, 'M', '勵'), - (0xF980, 'M', '呂'), - (0xF981, 'M', '女'), - (0xF982, 'M', '廬'), - (0xF983, 'M', '旅'), - (0xF984, 'M', '濾'), - (0xF985, 'M', '礪'), - (0xF986, 'M', '閭'), - (0xF987, 'M', '驪'), - (0xF988, 'M', '麗'), - (0xF989, 'M', '黎'), - (0xF98A, 'M', '力'), - (0xF98B, 'M', '曆'), - (0xF98C, 'M', '歷'), - (0xF98D, 'M', '轢'), - (0xF98E, 'M', '年'), - (0xF98F, 'M', '憐'), - (0xF990, 'M', '戀'), - (0xF991, 'M', '撚'), - (0xF992, 'M', '漣'), - (0xF993, 'M', '煉'), - (0xF994, 'M', '璉'), - (0xF995, 'M', '秊'), - (0xF996, 'M', '練'), - (0xF997, 'M', '聯'), - (0xF998, 'M', '輦'), - (0xF999, 'M', '蓮'), - (0xF99A, 'M', '連'), - (0xF99B, 'M', '鍊'), - (0xF99C, 'M', '列'), - (0xF99D, 'M', '劣'), - (0xF99E, 'M', '咽'), - (0xF99F, 'M', '烈'), - (0xF9A0, 'M', '裂'), - (0xF9A1, 'M', '說'), - (0xF9A2, 'M', '廉'), - (0xF9A3, 'M', '念'), - (0xF9A4, 'M', '捻'), - (0xF9A5, 'M', '殮'), - (0xF9A6, 'M', '簾'), - (0xF9A7, 'M', '獵'), - (0xF9A8, 'M', '令'), - (0xF9A9, 'M', '囹'), - (0xF9AA, 'M', '寧'), - (0xF9AB, 'M', '嶺'), - (0xF9AC, 'M', '怜'), - (0xF9AD, 'M', '玲'), - ] - -def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xF9AE, 'M', '瑩'), - (0xF9AF, 'M', '羚'), - (0xF9B0, 'M', '聆'), - (0xF9B1, 'M', '鈴'), - (0xF9B2, 'M', '零'), - (0xF9B3, 'M', '靈'), - (0xF9B4, 'M', '領'), - (0xF9B5, 'M', '例'), - (0xF9B6, 'M', '禮'), - (0xF9B7, 'M', '醴'), - (0xF9B8, 'M', '隸'), - (0xF9B9, 'M', '惡'), - (0xF9BA, 'M', '了'), - (0xF9BB, 'M', '僚'), - (0xF9BC, 'M', '寮'), - (0xF9BD, 'M', '尿'), - (0xF9BE, 'M', '料'), - (0xF9BF, 'M', '樂'), - (0xF9C0, 'M', '燎'), - (0xF9C1, 'M', '療'), - (0xF9C2, 'M', '蓼'), - (0xF9C3, 'M', '遼'), - (0xF9C4, 'M', '龍'), - (0xF9C5, 'M', '暈'), - (0xF9C6, 'M', '阮'), - (0xF9C7, 'M', '劉'), - (0xF9C8, 'M', '杻'), - (0xF9C9, 'M', '柳'), - (0xF9CA, 'M', '流'), - (0xF9CB, 'M', '溜'), - (0xF9CC, 'M', '琉'), - (0xF9CD, 'M', '留'), - (0xF9CE, 'M', '硫'), - (0xF9CF, 'M', '紐'), - (0xF9D0, 'M', '類'), - (0xF9D1, 'M', '六'), - (0xF9D2, 'M', '戮'), - (0xF9D3, 'M', '陸'), - (0xF9D4, 'M', '倫'), - (0xF9D5, 'M', '崙'), - (0xF9D6, 'M', '淪'), - (0xF9D7, 'M', '輪'), - (0xF9D8, 'M', '律'), - (0xF9D9, 'M', '慄'), - (0xF9DA, 'M', '栗'), - (0xF9DB, 'M', '率'), - (0xF9DC, 'M', '隆'), - (0xF9DD, 'M', '利'), - (0xF9DE, 'M', '吏'), - (0xF9DF, 'M', '履'), - (0xF9E0, 'M', '易'), - (0xF9E1, 'M', '李'), - (0xF9E2, 'M', '梨'), - (0xF9E3, 'M', '泥'), - (0xF9E4, 'M', '理'), - (0xF9E5, 'M', '痢'), - (0xF9E6, 'M', '罹'), - (0xF9E7, 'M', '裏'), - (0xF9E8, 'M', '裡'), - (0xF9E9, 'M', '里'), - (0xF9EA, 'M', '離'), - (0xF9EB, 'M', '匿'), - (0xF9EC, 'M', '溺'), - (0xF9ED, 'M', '吝'), - (0xF9EE, 'M', '燐'), - (0xF9EF, 'M', '璘'), - (0xF9F0, 'M', '藺'), - (0xF9F1, 'M', '隣'), - (0xF9F2, 'M', '鱗'), - (0xF9F3, 'M', '麟'), - (0xF9F4, 'M', '林'), - (0xF9F5, 'M', '淋'), - (0xF9F6, 'M', '臨'), - (0xF9F7, 'M', '立'), - (0xF9F8, 'M', '笠'), - (0xF9F9, 'M', '粒'), - (0xF9FA, 'M', '狀'), - (0xF9FB, 'M', '炙'), - (0xF9FC, 'M', '識'), - (0xF9FD, 'M', '什'), - (0xF9FE, 'M', '茶'), - (0xF9FF, 'M', '刺'), - (0xFA00, 'M', '切'), - (0xFA01, 'M', '度'), - (0xFA02, 'M', '拓'), - (0xFA03, 'M', '糖'), - (0xFA04, 'M', '宅'), - (0xFA05, 'M', '洞'), - (0xFA06, 'M', '暴'), - (0xFA07, 'M', '輻'), - (0xFA08, 'M', '行'), - (0xFA09, 'M', '降'), - (0xFA0A, 'M', '見'), - (0xFA0B, 'M', '廓'), - (0xFA0C, 'M', '兀'), - (0xFA0D, 'M', '嗀'), - (0xFA0E, 'V'), - (0xFA10, 'M', '塚'), - (0xFA11, 'V'), - (0xFA12, 'M', '晴'), - ] - -def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFA13, 'V'), - (0xFA15, 'M', '凞'), - (0xFA16, 'M', '猪'), - (0xFA17, 'M', '益'), - (0xFA18, 'M', '礼'), - (0xFA19, 'M', '神'), - (0xFA1A, 'M', '祥'), - (0xFA1B, 'M', '福'), - (0xFA1C, 'M', '靖'), - (0xFA1D, 'M', '精'), - (0xFA1E, 'M', '羽'), - (0xFA1F, 'V'), - (0xFA20, 'M', '蘒'), - (0xFA21, 'V'), - (0xFA22, 'M', '諸'), - (0xFA23, 'V'), - (0xFA25, 'M', '逸'), - (0xFA26, 'M', '都'), - (0xFA27, 'V'), - (0xFA2A, 'M', '飯'), - (0xFA2B, 'M', '飼'), - (0xFA2C, 'M', '館'), - (0xFA2D, 'M', '鶴'), - (0xFA2E, 'M', '郞'), - (0xFA2F, 'M', '隷'), - (0xFA30, 'M', '侮'), - (0xFA31, 'M', '僧'), - (0xFA32, 'M', '免'), - (0xFA33, 'M', '勉'), - (0xFA34, 'M', '勤'), - (0xFA35, 'M', '卑'), - (0xFA36, 'M', '喝'), - (0xFA37, 'M', '嘆'), - (0xFA38, 'M', '器'), - (0xFA39, 'M', '塀'), - (0xFA3A, 'M', '墨'), - (0xFA3B, 'M', '層'), - (0xFA3C, 'M', '屮'), - (0xFA3D, 'M', '悔'), - (0xFA3E, 'M', '慨'), - (0xFA3F, 'M', '憎'), - (0xFA40, 'M', '懲'), - (0xFA41, 'M', '敏'), - (0xFA42, 'M', '既'), - (0xFA43, 'M', '暑'), - (0xFA44, 'M', '梅'), - (0xFA45, 'M', '海'), - (0xFA46, 'M', '渚'), - (0xFA47, 'M', '漢'), - (0xFA48, 'M', '煮'), - (0xFA49, 'M', '爫'), - (0xFA4A, 'M', '琢'), - (0xFA4B, 'M', '碑'), - (0xFA4C, 'M', '社'), - (0xFA4D, 'M', '祉'), - (0xFA4E, 'M', '祈'), - (0xFA4F, 'M', '祐'), - (0xFA50, 'M', '祖'), - (0xFA51, 'M', '祝'), - (0xFA52, 'M', '禍'), - (0xFA53, 'M', '禎'), - (0xFA54, 'M', '穀'), - (0xFA55, 'M', '突'), - (0xFA56, 'M', '節'), - (0xFA57, 'M', '練'), - (0xFA58, 'M', '縉'), - (0xFA59, 'M', '繁'), - (0xFA5A, 'M', '署'), - (0xFA5B, 'M', '者'), - (0xFA5C, 'M', '臭'), - (0xFA5D, 'M', '艹'), - (0xFA5F, 'M', '著'), - (0xFA60, 'M', '褐'), - (0xFA61, 'M', '視'), - (0xFA62, 'M', '謁'), - (0xFA63, 'M', '謹'), - (0xFA64, 'M', '賓'), - (0xFA65, 'M', '贈'), - (0xFA66, 'M', '辶'), - (0xFA67, 'M', '逸'), - (0xFA68, 'M', '難'), - (0xFA69, 'M', '響'), - (0xFA6A, 'M', '頻'), - (0xFA6B, 'M', '恵'), - (0xFA6C, 'M', '𤋮'), - (0xFA6D, 'M', '舘'), - (0xFA6E, 'X'), - (0xFA70, 'M', '並'), - (0xFA71, 'M', '况'), - (0xFA72, 'M', '全'), - (0xFA73, 'M', '侀'), - (0xFA74, 'M', '充'), - (0xFA75, 'M', '冀'), - (0xFA76, 'M', '勇'), - (0xFA77, 'M', '勺'), - (0xFA78, 'M', '喝'), - (0xFA79, 'M', '啕'), - (0xFA7A, 'M', '喙'), - (0xFA7B, 'M', '嗢'), - (0xFA7C, 'M', '塚'), - ] - -def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFA7D, 'M', '墳'), - (0xFA7E, 'M', '奄'), - (0xFA7F, 'M', '奔'), - (0xFA80, 'M', '婢'), - (0xFA81, 'M', '嬨'), - (0xFA82, 'M', '廒'), - (0xFA83, 'M', '廙'), - (0xFA84, 'M', '彩'), - (0xFA85, 'M', '徭'), - (0xFA86, 'M', '惘'), - (0xFA87, 'M', '慎'), - (0xFA88, 'M', '愈'), - (0xFA89, 'M', '憎'), - (0xFA8A, 'M', '慠'), - (0xFA8B, 'M', '懲'), - (0xFA8C, 'M', '戴'), - (0xFA8D, 'M', '揄'), - (0xFA8E, 'M', '搜'), - (0xFA8F, 'M', '摒'), - (0xFA90, 'M', '敖'), - (0xFA91, 'M', '晴'), - (0xFA92, 'M', '朗'), - (0xFA93, 'M', '望'), - (0xFA94, 'M', '杖'), - (0xFA95, 'M', '歹'), - (0xFA96, 'M', '殺'), - (0xFA97, 'M', '流'), - (0xFA98, 'M', '滛'), - (0xFA99, 'M', '滋'), - (0xFA9A, 'M', '漢'), - (0xFA9B, 'M', '瀞'), - (0xFA9C, 'M', '煮'), - (0xFA9D, 'M', '瞧'), - (0xFA9E, 'M', '爵'), - (0xFA9F, 'M', '犯'), - (0xFAA0, 'M', '猪'), - (0xFAA1, 'M', '瑱'), - (0xFAA2, 'M', '甆'), - (0xFAA3, 'M', '画'), - (0xFAA4, 'M', '瘝'), - (0xFAA5, 'M', '瘟'), - (0xFAA6, 'M', '益'), - (0xFAA7, 'M', '盛'), - (0xFAA8, 'M', '直'), - (0xFAA9, 'M', '睊'), - (0xFAAA, 'M', '着'), - (0xFAAB, 'M', '磌'), - (0xFAAC, 'M', '窱'), - (0xFAAD, 'M', '節'), - (0xFAAE, 'M', '类'), - (0xFAAF, 'M', '絛'), - (0xFAB0, 'M', '練'), - (0xFAB1, 'M', '缾'), - (0xFAB2, 'M', '者'), - (0xFAB3, 'M', '荒'), - (0xFAB4, 'M', '華'), - (0xFAB5, 'M', '蝹'), - (0xFAB6, 'M', '襁'), - (0xFAB7, 'M', '覆'), - (0xFAB8, 'M', '視'), - (0xFAB9, 'M', '調'), - (0xFABA, 'M', '諸'), - (0xFABB, 'M', '請'), - (0xFABC, 'M', '謁'), - (0xFABD, 'M', '諾'), - (0xFABE, 'M', '諭'), - (0xFABF, 'M', '謹'), - (0xFAC0, 'M', '變'), - (0xFAC1, 'M', '贈'), - (0xFAC2, 'M', '輸'), - (0xFAC3, 'M', '遲'), - (0xFAC4, 'M', '醙'), - (0xFAC5, 'M', '鉶'), - (0xFAC6, 'M', '陼'), - (0xFAC7, 'M', '難'), - (0xFAC8, 'M', '靖'), - (0xFAC9, 'M', '韛'), - (0xFACA, 'M', '響'), - (0xFACB, 'M', '頋'), - (0xFACC, 'M', '頻'), - (0xFACD, 'M', '鬒'), - (0xFACE, 'M', '龜'), - (0xFACF, 'M', '𢡊'), - (0xFAD0, 'M', '𢡄'), - (0xFAD1, 'M', '𣏕'), - (0xFAD2, 'M', '㮝'), - (0xFAD3, 'M', '䀘'), - (0xFAD4, 'M', '䀹'), - (0xFAD5, 'M', '𥉉'), - (0xFAD6, 'M', '𥳐'), - (0xFAD7, 'M', '𧻓'), - (0xFAD8, 'M', '齃'), - (0xFAD9, 'M', '龎'), - (0xFADA, 'X'), - (0xFB00, 'M', 'ff'), - (0xFB01, 'M', 'fi'), - (0xFB02, 'M', 'fl'), - (0xFB03, 'M', 'ffi'), - (0xFB04, 'M', 'ffl'), - (0xFB05, 'M', 'st'), - ] - -def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFB07, 'X'), - (0xFB13, 'M', 'մն'), - (0xFB14, 'M', 'մե'), - (0xFB15, 'M', 'մի'), - (0xFB16, 'M', 'վն'), - (0xFB17, 'M', 'մխ'), - (0xFB18, 'X'), - (0xFB1D, 'M', 'יִ'), - (0xFB1E, 'V'), - (0xFB1F, 'M', 'ײַ'), - (0xFB20, 'M', 'ע'), - (0xFB21, 'M', 'א'), - (0xFB22, 'M', 'ד'), - (0xFB23, 'M', 'ה'), - (0xFB24, 'M', 'כ'), - (0xFB25, 'M', 'ל'), - (0xFB26, 'M', 'ם'), - (0xFB27, 'M', 'ר'), - (0xFB28, 'M', 'ת'), - (0xFB29, '3', '+'), - (0xFB2A, 'M', 'שׁ'), - (0xFB2B, 'M', 'שׂ'), - (0xFB2C, 'M', 'שּׁ'), - (0xFB2D, 'M', 'שּׂ'), - (0xFB2E, 'M', 'אַ'), - (0xFB2F, 'M', 'אָ'), - (0xFB30, 'M', 'אּ'), - (0xFB31, 'M', 'בּ'), - (0xFB32, 'M', 'גּ'), - (0xFB33, 'M', 'דּ'), - (0xFB34, 'M', 'הּ'), - (0xFB35, 'M', 'וּ'), - (0xFB36, 'M', 'זּ'), - (0xFB37, 'X'), - (0xFB38, 'M', 'טּ'), - (0xFB39, 'M', 'יּ'), - (0xFB3A, 'M', 'ךּ'), - (0xFB3B, 'M', 'כּ'), - (0xFB3C, 'M', 'לּ'), - (0xFB3D, 'X'), - (0xFB3E, 'M', 'מּ'), - (0xFB3F, 'X'), - (0xFB40, 'M', 'נּ'), - (0xFB41, 'M', 'סּ'), - (0xFB42, 'X'), - (0xFB43, 'M', 'ףּ'), - (0xFB44, 'M', 'פּ'), - (0xFB45, 'X'), - (0xFB46, 'M', 'צּ'), - (0xFB47, 'M', 'קּ'), - (0xFB48, 'M', 'רּ'), - (0xFB49, 'M', 'שּ'), - (0xFB4A, 'M', 'תּ'), - (0xFB4B, 'M', 'וֹ'), - (0xFB4C, 'M', 'בֿ'), - (0xFB4D, 'M', 'כֿ'), - (0xFB4E, 'M', 'פֿ'), - (0xFB4F, 'M', 'אל'), - (0xFB50, 'M', 'ٱ'), - (0xFB52, 'M', 'ٻ'), - (0xFB56, 'M', 'پ'), - (0xFB5A, 'M', 'ڀ'), - (0xFB5E, 'M', 'ٺ'), - (0xFB62, 'M', 'ٿ'), - (0xFB66, 'M', 'ٹ'), - (0xFB6A, 'M', 'ڤ'), - (0xFB6E, 'M', 'ڦ'), - (0xFB72, 'M', 'ڄ'), - (0xFB76, 'M', 'ڃ'), - (0xFB7A, 'M', 'چ'), - (0xFB7E, 'M', 'ڇ'), - (0xFB82, 'M', 'ڍ'), - (0xFB84, 'M', 'ڌ'), - (0xFB86, 'M', 'ڎ'), - (0xFB88, 'M', 'ڈ'), - (0xFB8A, 'M', 'ژ'), - (0xFB8C, 'M', 'ڑ'), - (0xFB8E, 'M', 'ک'), - (0xFB92, 'M', 'گ'), - (0xFB96, 'M', 'ڳ'), - (0xFB9A, 'M', 'ڱ'), - (0xFB9E, 'M', 'ں'), - (0xFBA0, 'M', 'ڻ'), - (0xFBA4, 'M', 'ۀ'), - (0xFBA6, 'M', 'ہ'), - (0xFBAA, 'M', 'ھ'), - (0xFBAE, 'M', 'ے'), - (0xFBB0, 'M', 'ۓ'), - (0xFBB2, 'V'), - (0xFBC3, 'X'), - (0xFBD3, 'M', 'ڭ'), - (0xFBD7, 'M', 'ۇ'), - (0xFBD9, 'M', 'ۆ'), - (0xFBDB, 'M', 'ۈ'), - (0xFBDD, 'M', 'ۇٴ'), - (0xFBDE, 'M', 'ۋ'), - (0xFBE0, 'M', 'ۅ'), - (0xFBE2, 'M', 'ۉ'), - (0xFBE4, 'M', 'ې'), - (0xFBE8, 'M', 'ى'), - ] - -def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFBEA, 'M', 'ئا'), - (0xFBEC, 'M', 'ئە'), - (0xFBEE, 'M', 'ئو'), - (0xFBF0, 'M', 'ئۇ'), - (0xFBF2, 'M', 'ئۆ'), - (0xFBF4, 'M', 'ئۈ'), - (0xFBF6, 'M', 'ئې'), - (0xFBF9, 'M', 'ئى'), - (0xFBFC, 'M', 'ی'), - (0xFC00, 'M', 'ئج'), - (0xFC01, 'M', 'ئح'), - (0xFC02, 'M', 'ئم'), - (0xFC03, 'M', 'ئى'), - (0xFC04, 'M', 'ئي'), - (0xFC05, 'M', 'بج'), - (0xFC06, 'M', 'بح'), - (0xFC07, 'M', 'بخ'), - (0xFC08, 'M', 'بم'), - (0xFC09, 'M', 'بى'), - (0xFC0A, 'M', 'بي'), - (0xFC0B, 'M', 'تج'), - (0xFC0C, 'M', 'تح'), - (0xFC0D, 'M', 'تخ'), - (0xFC0E, 'M', 'تم'), - (0xFC0F, 'M', 'تى'), - (0xFC10, 'M', 'تي'), - (0xFC11, 'M', 'ثج'), - (0xFC12, 'M', 'ثم'), - (0xFC13, 'M', 'ثى'), - (0xFC14, 'M', 'ثي'), - (0xFC15, 'M', 'جح'), - (0xFC16, 'M', 'جم'), - (0xFC17, 'M', 'حج'), - (0xFC18, 'M', 'حم'), - (0xFC19, 'M', 'خج'), - (0xFC1A, 'M', 'خح'), - (0xFC1B, 'M', 'خم'), - (0xFC1C, 'M', 'سج'), - (0xFC1D, 'M', 'سح'), - (0xFC1E, 'M', 'سخ'), - (0xFC1F, 'M', 'سم'), - (0xFC20, 'M', 'صح'), - (0xFC21, 'M', 'صم'), - (0xFC22, 'M', 'ضج'), - (0xFC23, 'M', 'ضح'), - (0xFC24, 'M', 'ضخ'), - (0xFC25, 'M', 'ضم'), - (0xFC26, 'M', 'طح'), - (0xFC27, 'M', 'طم'), - (0xFC28, 'M', 'ظم'), - (0xFC29, 'M', 'عج'), - (0xFC2A, 'M', 'عم'), - (0xFC2B, 'M', 'غج'), - (0xFC2C, 'M', 'غم'), - (0xFC2D, 'M', 'فج'), - (0xFC2E, 'M', 'فح'), - (0xFC2F, 'M', 'فخ'), - (0xFC30, 'M', 'فم'), - (0xFC31, 'M', 'فى'), - (0xFC32, 'M', 'في'), - (0xFC33, 'M', 'قح'), - (0xFC34, 'M', 'قم'), - (0xFC35, 'M', 'قى'), - (0xFC36, 'M', 'قي'), - (0xFC37, 'M', 'كا'), - (0xFC38, 'M', 'كج'), - (0xFC39, 'M', 'كح'), - (0xFC3A, 'M', 'كخ'), - (0xFC3B, 'M', 'كل'), - (0xFC3C, 'M', 'كم'), - (0xFC3D, 'M', 'كى'), - (0xFC3E, 'M', 'كي'), - (0xFC3F, 'M', 'لج'), - (0xFC40, 'M', 'لح'), - (0xFC41, 'M', 'لخ'), - (0xFC42, 'M', 'لم'), - (0xFC43, 'M', 'لى'), - (0xFC44, 'M', 'لي'), - (0xFC45, 'M', 'مج'), - (0xFC46, 'M', 'مح'), - (0xFC47, 'M', 'مخ'), - (0xFC48, 'M', 'مم'), - (0xFC49, 'M', 'مى'), - (0xFC4A, 'M', 'مي'), - (0xFC4B, 'M', 'نج'), - (0xFC4C, 'M', 'نح'), - (0xFC4D, 'M', 'نخ'), - (0xFC4E, 'M', 'نم'), - (0xFC4F, 'M', 'نى'), - (0xFC50, 'M', 'ني'), - (0xFC51, 'M', 'هج'), - (0xFC52, 'M', 'هم'), - (0xFC53, 'M', 'هى'), - (0xFC54, 'M', 'هي'), - (0xFC55, 'M', 'يج'), - (0xFC56, 'M', 'يح'), - (0xFC57, 'M', 'يخ'), - (0xFC58, 'M', 'يم'), - (0xFC59, 'M', 'يى'), - (0xFC5A, 'M', 'يي'), - ] - -def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFC5B, 'M', 'ذٰ'), - (0xFC5C, 'M', 'رٰ'), - (0xFC5D, 'M', 'ىٰ'), - (0xFC5E, '3', ' ٌّ'), - (0xFC5F, '3', ' ٍّ'), - (0xFC60, '3', ' َّ'), - (0xFC61, '3', ' ُّ'), - (0xFC62, '3', ' ِّ'), - (0xFC63, '3', ' ّٰ'), - (0xFC64, 'M', 'ئر'), - (0xFC65, 'M', 'ئز'), - (0xFC66, 'M', 'ئم'), - (0xFC67, 'M', 'ئن'), - (0xFC68, 'M', 'ئى'), - (0xFC69, 'M', 'ئي'), - (0xFC6A, 'M', 'بر'), - (0xFC6B, 'M', 'بز'), - (0xFC6C, 'M', 'بم'), - (0xFC6D, 'M', 'بن'), - (0xFC6E, 'M', 'بى'), - (0xFC6F, 'M', 'بي'), - (0xFC70, 'M', 'تر'), - (0xFC71, 'M', 'تز'), - (0xFC72, 'M', 'تم'), - (0xFC73, 'M', 'تن'), - (0xFC74, 'M', 'تى'), - (0xFC75, 'M', 'تي'), - (0xFC76, 'M', 'ثر'), - (0xFC77, 'M', 'ثز'), - (0xFC78, 'M', 'ثم'), - (0xFC79, 'M', 'ثن'), - (0xFC7A, 'M', 'ثى'), - (0xFC7B, 'M', 'ثي'), - (0xFC7C, 'M', 'فى'), - (0xFC7D, 'M', 'في'), - (0xFC7E, 'M', 'قى'), - (0xFC7F, 'M', 'قي'), - (0xFC80, 'M', 'كا'), - (0xFC81, 'M', 'كل'), - (0xFC82, 'M', 'كم'), - (0xFC83, 'M', 'كى'), - (0xFC84, 'M', 'كي'), - (0xFC85, 'M', 'لم'), - (0xFC86, 'M', 'لى'), - (0xFC87, 'M', 'لي'), - (0xFC88, 'M', 'ما'), - (0xFC89, 'M', 'مم'), - (0xFC8A, 'M', 'نر'), - (0xFC8B, 'M', 'نز'), - (0xFC8C, 'M', 'نم'), - (0xFC8D, 'M', 'نن'), - (0xFC8E, 'M', 'نى'), - (0xFC8F, 'M', 'ني'), - (0xFC90, 'M', 'ىٰ'), - (0xFC91, 'M', 'ير'), - (0xFC92, 'M', 'يز'), - (0xFC93, 'M', 'يم'), - (0xFC94, 'M', 'ين'), - (0xFC95, 'M', 'يى'), - (0xFC96, 'M', 'يي'), - (0xFC97, 'M', 'ئج'), - (0xFC98, 'M', 'ئح'), - (0xFC99, 'M', 'ئخ'), - (0xFC9A, 'M', 'ئم'), - (0xFC9B, 'M', 'ئه'), - (0xFC9C, 'M', 'بج'), - (0xFC9D, 'M', 'بح'), - (0xFC9E, 'M', 'بخ'), - (0xFC9F, 'M', 'بم'), - (0xFCA0, 'M', 'به'), - (0xFCA1, 'M', 'تج'), - (0xFCA2, 'M', 'تح'), - (0xFCA3, 'M', 'تخ'), - (0xFCA4, 'M', 'تم'), - (0xFCA5, 'M', 'ته'), - (0xFCA6, 'M', 'ثم'), - (0xFCA7, 'M', 'جح'), - (0xFCA8, 'M', 'جم'), - (0xFCA9, 'M', 'حج'), - (0xFCAA, 'M', 'حم'), - (0xFCAB, 'M', 'خج'), - (0xFCAC, 'M', 'خم'), - (0xFCAD, 'M', 'سج'), - (0xFCAE, 'M', 'سح'), - (0xFCAF, 'M', 'سخ'), - (0xFCB0, 'M', 'سم'), - (0xFCB1, 'M', 'صح'), - (0xFCB2, 'M', 'صخ'), - (0xFCB3, 'M', 'صم'), - (0xFCB4, 'M', 'ضج'), - (0xFCB5, 'M', 'ضح'), - (0xFCB6, 'M', 'ضخ'), - (0xFCB7, 'M', 'ضم'), - (0xFCB8, 'M', 'طح'), - (0xFCB9, 'M', 'ظم'), - (0xFCBA, 'M', 'عج'), - (0xFCBB, 'M', 'عم'), - (0xFCBC, 'M', 'غج'), - (0xFCBD, 'M', 'غم'), - (0xFCBE, 'M', 'فج'), - ] - -def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFCBF, 'M', 'فح'), - (0xFCC0, 'M', 'فخ'), - (0xFCC1, 'M', 'فم'), - (0xFCC2, 'M', 'قح'), - (0xFCC3, 'M', 'قم'), - (0xFCC4, 'M', 'كج'), - (0xFCC5, 'M', 'كح'), - (0xFCC6, 'M', 'كخ'), - (0xFCC7, 'M', 'كل'), - (0xFCC8, 'M', 'كم'), - (0xFCC9, 'M', 'لج'), - (0xFCCA, 'M', 'لح'), - (0xFCCB, 'M', 'لخ'), - (0xFCCC, 'M', 'لم'), - (0xFCCD, 'M', 'له'), - (0xFCCE, 'M', 'مج'), - (0xFCCF, 'M', 'مح'), - (0xFCD0, 'M', 'مخ'), - (0xFCD1, 'M', 'مم'), - (0xFCD2, 'M', 'نج'), - (0xFCD3, 'M', 'نح'), - (0xFCD4, 'M', 'نخ'), - (0xFCD5, 'M', 'نم'), - (0xFCD6, 'M', 'نه'), - (0xFCD7, 'M', 'هج'), - (0xFCD8, 'M', 'هم'), - (0xFCD9, 'M', 'هٰ'), - (0xFCDA, 'M', 'يج'), - (0xFCDB, 'M', 'يح'), - (0xFCDC, 'M', 'يخ'), - (0xFCDD, 'M', 'يم'), - (0xFCDE, 'M', 'يه'), - (0xFCDF, 'M', 'ئم'), - (0xFCE0, 'M', 'ئه'), - (0xFCE1, 'M', 'بم'), - (0xFCE2, 'M', 'به'), - (0xFCE3, 'M', 'تم'), - (0xFCE4, 'M', 'ته'), - (0xFCE5, 'M', 'ثم'), - (0xFCE6, 'M', 'ثه'), - (0xFCE7, 'M', 'سم'), - (0xFCE8, 'M', 'سه'), - (0xFCE9, 'M', 'شم'), - (0xFCEA, 'M', 'شه'), - (0xFCEB, 'M', 'كل'), - (0xFCEC, 'M', 'كم'), - (0xFCED, 'M', 'لم'), - (0xFCEE, 'M', 'نم'), - (0xFCEF, 'M', 'نه'), - (0xFCF0, 'M', 'يم'), - (0xFCF1, 'M', 'يه'), - (0xFCF2, 'M', 'ـَّ'), - (0xFCF3, 'M', 'ـُّ'), - (0xFCF4, 'M', 'ـِّ'), - (0xFCF5, 'M', 'طى'), - (0xFCF6, 'M', 'طي'), - (0xFCF7, 'M', 'عى'), - (0xFCF8, 'M', 'عي'), - (0xFCF9, 'M', 'غى'), - (0xFCFA, 'M', 'غي'), - (0xFCFB, 'M', 'سى'), - (0xFCFC, 'M', 'سي'), - (0xFCFD, 'M', 'شى'), - (0xFCFE, 'M', 'شي'), - (0xFCFF, 'M', 'حى'), - (0xFD00, 'M', 'حي'), - (0xFD01, 'M', 'جى'), - (0xFD02, 'M', 'جي'), - (0xFD03, 'M', 'خى'), - (0xFD04, 'M', 'خي'), - (0xFD05, 'M', 'صى'), - (0xFD06, 'M', 'صي'), - (0xFD07, 'M', 'ضى'), - (0xFD08, 'M', 'ضي'), - (0xFD09, 'M', 'شج'), - (0xFD0A, 'M', 'شح'), - (0xFD0B, 'M', 'شخ'), - (0xFD0C, 'M', 'شم'), - (0xFD0D, 'M', 'شر'), - (0xFD0E, 'M', 'سر'), - (0xFD0F, 'M', 'صر'), - (0xFD10, 'M', 'ضر'), - (0xFD11, 'M', 'طى'), - (0xFD12, 'M', 'طي'), - (0xFD13, 'M', 'عى'), - (0xFD14, 'M', 'عي'), - (0xFD15, 'M', 'غى'), - (0xFD16, 'M', 'غي'), - (0xFD17, 'M', 'سى'), - (0xFD18, 'M', 'سي'), - (0xFD19, 'M', 'شى'), - (0xFD1A, 'M', 'شي'), - (0xFD1B, 'M', 'حى'), - (0xFD1C, 'M', 'حي'), - (0xFD1D, 'M', 'جى'), - (0xFD1E, 'M', 'جي'), - (0xFD1F, 'M', 'خى'), - (0xFD20, 'M', 'خي'), - (0xFD21, 'M', 'صى'), - (0xFD22, 'M', 'صي'), - ] - -def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFD23, 'M', 'ضى'), - (0xFD24, 'M', 'ضي'), - (0xFD25, 'M', 'شج'), - (0xFD26, 'M', 'شح'), - (0xFD27, 'M', 'شخ'), - (0xFD28, 'M', 'شم'), - (0xFD29, 'M', 'شر'), - (0xFD2A, 'M', 'سر'), - (0xFD2B, 'M', 'صر'), - (0xFD2C, 'M', 'ضر'), - (0xFD2D, 'M', 'شج'), - (0xFD2E, 'M', 'شح'), - (0xFD2F, 'M', 'شخ'), - (0xFD30, 'M', 'شم'), - (0xFD31, 'M', 'سه'), - (0xFD32, 'M', 'شه'), - (0xFD33, 'M', 'طم'), - (0xFD34, 'M', 'سج'), - (0xFD35, 'M', 'سح'), - (0xFD36, 'M', 'سخ'), - (0xFD37, 'M', 'شج'), - (0xFD38, 'M', 'شح'), - (0xFD39, 'M', 'شخ'), - (0xFD3A, 'M', 'طم'), - (0xFD3B, 'M', 'ظم'), - (0xFD3C, 'M', 'اً'), - (0xFD3E, 'V'), - (0xFD50, 'M', 'تجم'), - (0xFD51, 'M', 'تحج'), - (0xFD53, 'M', 'تحم'), - (0xFD54, 'M', 'تخم'), - (0xFD55, 'M', 'تمج'), - (0xFD56, 'M', 'تمح'), - (0xFD57, 'M', 'تمخ'), - (0xFD58, 'M', 'جمح'), - (0xFD5A, 'M', 'حمي'), - (0xFD5B, 'M', 'حمى'), - (0xFD5C, 'M', 'سحج'), - (0xFD5D, 'M', 'سجح'), - (0xFD5E, 'M', 'سجى'), - (0xFD5F, 'M', 'سمح'), - (0xFD61, 'M', 'سمج'), - (0xFD62, 'M', 'سمم'), - (0xFD64, 'M', 'صحح'), - (0xFD66, 'M', 'صمم'), - (0xFD67, 'M', 'شحم'), - (0xFD69, 'M', 'شجي'), - (0xFD6A, 'M', 'شمخ'), - (0xFD6C, 'M', 'شمم'), - (0xFD6E, 'M', 'ضحى'), - (0xFD6F, 'M', 'ضخم'), - (0xFD71, 'M', 'طمح'), - (0xFD73, 'M', 'طمم'), - (0xFD74, 'M', 'طمي'), - (0xFD75, 'M', 'عجم'), - (0xFD76, 'M', 'عمم'), - (0xFD78, 'M', 'عمى'), - (0xFD79, 'M', 'غمم'), - (0xFD7A, 'M', 'غمي'), - (0xFD7B, 'M', 'غمى'), - (0xFD7C, 'M', 'فخم'), - (0xFD7E, 'M', 'قمح'), - (0xFD7F, 'M', 'قمم'), - (0xFD80, 'M', 'لحم'), - (0xFD81, 'M', 'لحي'), - (0xFD82, 'M', 'لحى'), - (0xFD83, 'M', 'لجج'), - (0xFD85, 'M', 'لخم'), - (0xFD87, 'M', 'لمح'), - (0xFD89, 'M', 'محج'), - (0xFD8A, 'M', 'محم'), - (0xFD8B, 'M', 'محي'), - (0xFD8C, 'M', 'مجح'), - (0xFD8D, 'M', 'مجم'), - (0xFD8E, 'M', 'مخج'), - (0xFD8F, 'M', 'مخم'), - (0xFD90, 'X'), - (0xFD92, 'M', 'مجخ'), - (0xFD93, 'M', 'همج'), - (0xFD94, 'M', 'همم'), - (0xFD95, 'M', 'نحم'), - (0xFD96, 'M', 'نحى'), - (0xFD97, 'M', 'نجم'), - (0xFD99, 'M', 'نجى'), - (0xFD9A, 'M', 'نمي'), - (0xFD9B, 'M', 'نمى'), - (0xFD9C, 'M', 'يمم'), - (0xFD9E, 'M', 'بخي'), - (0xFD9F, 'M', 'تجي'), - (0xFDA0, 'M', 'تجى'), - (0xFDA1, 'M', 'تخي'), - (0xFDA2, 'M', 'تخى'), - (0xFDA3, 'M', 'تمي'), - (0xFDA4, 'M', 'تمى'), - (0xFDA5, 'M', 'جمي'), - (0xFDA6, 'M', 'جحى'), - (0xFDA7, 'M', 'جمى'), - (0xFDA8, 'M', 'سخى'), - (0xFDA9, 'M', 'صحي'), - (0xFDAA, 'M', 'شحي'), - ] - -def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFDAB, 'M', 'ضحي'), - (0xFDAC, 'M', 'لجي'), - (0xFDAD, 'M', 'لمي'), - (0xFDAE, 'M', 'يحي'), - (0xFDAF, 'M', 'يجي'), - (0xFDB0, 'M', 'يمي'), - (0xFDB1, 'M', 'ممي'), - (0xFDB2, 'M', 'قمي'), - (0xFDB3, 'M', 'نحي'), - (0xFDB4, 'M', 'قمح'), - (0xFDB5, 'M', 'لحم'), - (0xFDB6, 'M', 'عمي'), - (0xFDB7, 'M', 'كمي'), - (0xFDB8, 'M', 'نجح'), - (0xFDB9, 'M', 'مخي'), - (0xFDBA, 'M', 'لجم'), - (0xFDBB, 'M', 'كمم'), - (0xFDBC, 'M', 'لجم'), - (0xFDBD, 'M', 'نجح'), - (0xFDBE, 'M', 'جحي'), - (0xFDBF, 'M', 'حجي'), - (0xFDC0, 'M', 'مجي'), - (0xFDC1, 'M', 'فمي'), - (0xFDC2, 'M', 'بحي'), - (0xFDC3, 'M', 'كمم'), - (0xFDC4, 'M', 'عجم'), - (0xFDC5, 'M', 'صمم'), - (0xFDC6, 'M', 'سخي'), - (0xFDC7, 'M', 'نجي'), - (0xFDC8, 'X'), - (0xFDCF, 'V'), - (0xFDD0, 'X'), - (0xFDF0, 'M', 'صلے'), - (0xFDF1, 'M', 'قلے'), - (0xFDF2, 'M', 'الله'), - (0xFDF3, 'M', 'اكبر'), - (0xFDF4, 'M', 'محمد'), - (0xFDF5, 'M', 'صلعم'), - (0xFDF6, 'M', 'رسول'), - (0xFDF7, 'M', 'عليه'), - (0xFDF8, 'M', 'وسلم'), - (0xFDF9, 'M', 'صلى'), - (0xFDFA, '3', 'صلى الله عليه وسلم'), - (0xFDFB, '3', 'جل جلاله'), - (0xFDFC, 'M', 'ریال'), - (0xFDFD, 'V'), - (0xFE00, 'I'), - (0xFE10, '3', ','), - (0xFE11, 'M', '、'), - (0xFE12, 'X'), - (0xFE13, '3', ':'), - (0xFE14, '3', ';'), - (0xFE15, '3', '!'), - (0xFE16, '3', '?'), - (0xFE17, 'M', '〖'), - (0xFE18, 'M', '〗'), - (0xFE19, 'X'), - (0xFE20, 'V'), - (0xFE30, 'X'), - (0xFE31, 'M', '—'), - (0xFE32, 'M', '–'), - (0xFE33, '3', '_'), - (0xFE35, '3', '('), - (0xFE36, '3', ')'), - (0xFE37, '3', '{'), - (0xFE38, '3', '}'), - (0xFE39, 'M', '〔'), - (0xFE3A, 'M', '〕'), - (0xFE3B, 'M', '【'), - (0xFE3C, 'M', '】'), - (0xFE3D, 'M', '《'), - (0xFE3E, 'M', '》'), - (0xFE3F, 'M', '〈'), - (0xFE40, 'M', '〉'), - (0xFE41, 'M', '「'), - (0xFE42, 'M', '」'), - (0xFE43, 'M', '『'), - (0xFE44, 'M', '』'), - (0xFE45, 'V'), - (0xFE47, '3', '['), - (0xFE48, '3', ']'), - (0xFE49, '3', ' ̅'), - (0xFE4D, '3', '_'), - (0xFE50, '3', ','), - (0xFE51, 'M', '、'), - (0xFE52, 'X'), - (0xFE54, '3', ';'), - (0xFE55, '3', ':'), - (0xFE56, '3', '?'), - (0xFE57, '3', '!'), - (0xFE58, 'M', '—'), - (0xFE59, '3', '('), - (0xFE5A, '3', ')'), - (0xFE5B, '3', '{'), - (0xFE5C, '3', '}'), - (0xFE5D, 'M', '〔'), - (0xFE5E, 'M', '〕'), - (0xFE5F, '3', '#'), - (0xFE60, '3', '&'), - (0xFE61, '3', '*'), - ] - -def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFE62, '3', '+'), - (0xFE63, 'M', '-'), - (0xFE64, '3', '<'), - (0xFE65, '3', '>'), - (0xFE66, '3', '='), - (0xFE67, 'X'), - (0xFE68, '3', '\\'), - (0xFE69, '3', '$'), - (0xFE6A, '3', '%'), - (0xFE6B, '3', '@'), - (0xFE6C, 'X'), - (0xFE70, '3', ' ً'), - (0xFE71, 'M', 'ـً'), - (0xFE72, '3', ' ٌ'), - (0xFE73, 'V'), - (0xFE74, '3', ' ٍ'), - (0xFE75, 'X'), - (0xFE76, '3', ' َ'), - (0xFE77, 'M', 'ـَ'), - (0xFE78, '3', ' ُ'), - (0xFE79, 'M', 'ـُ'), - (0xFE7A, '3', ' ِ'), - (0xFE7B, 'M', 'ـِ'), - (0xFE7C, '3', ' ّ'), - (0xFE7D, 'M', 'ـّ'), - (0xFE7E, '3', ' ْ'), - (0xFE7F, 'M', 'ـْ'), - (0xFE80, 'M', 'ء'), - (0xFE81, 'M', 'آ'), - (0xFE83, 'M', 'أ'), - (0xFE85, 'M', 'ؤ'), - (0xFE87, 'M', 'إ'), - (0xFE89, 'M', 'ئ'), - (0xFE8D, 'M', 'ا'), - (0xFE8F, 'M', 'ب'), - (0xFE93, 'M', 'ة'), - (0xFE95, 'M', 'ت'), - (0xFE99, 'M', 'ث'), - (0xFE9D, 'M', 'ج'), - (0xFEA1, 'M', 'ح'), - (0xFEA5, 'M', 'خ'), - (0xFEA9, 'M', 'د'), - (0xFEAB, 'M', 'ذ'), - (0xFEAD, 'M', 'ر'), - (0xFEAF, 'M', 'ز'), - (0xFEB1, 'M', 'س'), - (0xFEB5, 'M', 'ش'), - (0xFEB9, 'M', 'ص'), - (0xFEBD, 'M', 'ض'), - (0xFEC1, 'M', 'ط'), - (0xFEC5, 'M', 'ظ'), - (0xFEC9, 'M', 'ع'), - (0xFECD, 'M', 'غ'), - (0xFED1, 'M', 'ف'), - (0xFED5, 'M', 'ق'), - (0xFED9, 'M', 'ك'), - (0xFEDD, 'M', 'ل'), - (0xFEE1, 'M', 'م'), - (0xFEE5, 'M', 'ن'), - (0xFEE9, 'M', 'ه'), - (0xFEED, 'M', 'و'), - (0xFEEF, 'M', 'ى'), - (0xFEF1, 'M', 'ي'), - (0xFEF5, 'M', 'لآ'), - (0xFEF7, 'M', 'لأ'), - (0xFEF9, 'M', 'لإ'), - (0xFEFB, 'M', 'لا'), - (0xFEFD, 'X'), - (0xFEFF, 'I'), - (0xFF00, 'X'), - (0xFF01, '3', '!'), - (0xFF02, '3', '"'), - (0xFF03, '3', '#'), - (0xFF04, '3', '$'), - (0xFF05, '3', '%'), - (0xFF06, '3', '&'), - (0xFF07, '3', '\''), - (0xFF08, '3', '('), - (0xFF09, '3', ')'), - (0xFF0A, '3', '*'), - (0xFF0B, '3', '+'), - (0xFF0C, '3', ','), - (0xFF0D, 'M', '-'), - (0xFF0E, 'M', '.'), - (0xFF0F, '3', '/'), - (0xFF10, 'M', '0'), - (0xFF11, 'M', '1'), - (0xFF12, 'M', '2'), - (0xFF13, 'M', '3'), - (0xFF14, 'M', '4'), - (0xFF15, 'M', '5'), - (0xFF16, 'M', '6'), - (0xFF17, 'M', '7'), - (0xFF18, 'M', '8'), - (0xFF19, 'M', '9'), - (0xFF1A, '3', ':'), - (0xFF1B, '3', ';'), - (0xFF1C, '3', '<'), - (0xFF1D, '3', '='), - (0xFF1E, '3', '>'), - ] - -def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFF1F, '3', '?'), - (0xFF20, '3', '@'), - (0xFF21, 'M', 'a'), - (0xFF22, 'M', 'b'), - (0xFF23, 'M', 'c'), - (0xFF24, 'M', 'd'), - (0xFF25, 'M', 'e'), - (0xFF26, 'M', 'f'), - (0xFF27, 'M', 'g'), - (0xFF28, 'M', 'h'), - (0xFF29, 'M', 'i'), - (0xFF2A, 'M', 'j'), - (0xFF2B, 'M', 'k'), - (0xFF2C, 'M', 'l'), - (0xFF2D, 'M', 'm'), - (0xFF2E, 'M', 'n'), - (0xFF2F, 'M', 'o'), - (0xFF30, 'M', 'p'), - (0xFF31, 'M', 'q'), - (0xFF32, 'M', 'r'), - (0xFF33, 'M', 's'), - (0xFF34, 'M', 't'), - (0xFF35, 'M', 'u'), - (0xFF36, 'M', 'v'), - (0xFF37, 'M', 'w'), - (0xFF38, 'M', 'x'), - (0xFF39, 'M', 'y'), - (0xFF3A, 'M', 'z'), - (0xFF3B, '3', '['), - (0xFF3C, '3', '\\'), - (0xFF3D, '3', ']'), - (0xFF3E, '3', '^'), - (0xFF3F, '3', '_'), - (0xFF40, '3', '`'), - (0xFF41, 'M', 'a'), - (0xFF42, 'M', 'b'), - (0xFF43, 'M', 'c'), - (0xFF44, 'M', 'd'), - (0xFF45, 'M', 'e'), - (0xFF46, 'M', 'f'), - (0xFF47, 'M', 'g'), - (0xFF48, 'M', 'h'), - (0xFF49, 'M', 'i'), - (0xFF4A, 'M', 'j'), - (0xFF4B, 'M', 'k'), - (0xFF4C, 'M', 'l'), - (0xFF4D, 'M', 'm'), - (0xFF4E, 'M', 'n'), - (0xFF4F, 'M', 'o'), - (0xFF50, 'M', 'p'), - (0xFF51, 'M', 'q'), - (0xFF52, 'M', 'r'), - (0xFF53, 'M', 's'), - (0xFF54, 'M', 't'), - (0xFF55, 'M', 'u'), - (0xFF56, 'M', 'v'), - (0xFF57, 'M', 'w'), - (0xFF58, 'M', 'x'), - (0xFF59, 'M', 'y'), - (0xFF5A, 'M', 'z'), - (0xFF5B, '3', '{'), - (0xFF5C, '3', '|'), - (0xFF5D, '3', '}'), - (0xFF5E, '3', '~'), - (0xFF5F, 'M', '⦅'), - (0xFF60, 'M', '⦆'), - (0xFF61, 'M', '.'), - (0xFF62, 'M', '「'), - (0xFF63, 'M', '」'), - (0xFF64, 'M', '、'), - (0xFF65, 'M', '・'), - (0xFF66, 'M', 'ヲ'), - (0xFF67, 'M', 'ァ'), - (0xFF68, 'M', 'ィ'), - (0xFF69, 'M', 'ゥ'), - (0xFF6A, 'M', 'ェ'), - (0xFF6B, 'M', 'ォ'), - (0xFF6C, 'M', 'ャ'), - (0xFF6D, 'M', 'ュ'), - (0xFF6E, 'M', 'ョ'), - (0xFF6F, 'M', 'ッ'), - (0xFF70, 'M', 'ー'), - (0xFF71, 'M', 'ア'), - (0xFF72, 'M', 'イ'), - (0xFF73, 'M', 'ウ'), - (0xFF74, 'M', 'エ'), - (0xFF75, 'M', 'オ'), - (0xFF76, 'M', 'カ'), - (0xFF77, 'M', 'キ'), - (0xFF78, 'M', 'ク'), - (0xFF79, 'M', 'ケ'), - (0xFF7A, 'M', 'コ'), - (0xFF7B, 'M', 'サ'), - (0xFF7C, 'M', 'シ'), - (0xFF7D, 'M', 'ス'), - (0xFF7E, 'M', 'セ'), - (0xFF7F, 'M', 'ソ'), - (0xFF80, 'M', 'タ'), - (0xFF81, 'M', 'チ'), - (0xFF82, 'M', 'ツ'), - ] - -def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFF83, 'M', 'テ'), - (0xFF84, 'M', 'ト'), - (0xFF85, 'M', 'ナ'), - (0xFF86, 'M', 'ニ'), - (0xFF87, 'M', 'ヌ'), - (0xFF88, 'M', 'ネ'), - (0xFF89, 'M', 'ノ'), - (0xFF8A, 'M', 'ハ'), - (0xFF8B, 'M', 'ヒ'), - (0xFF8C, 'M', 'フ'), - (0xFF8D, 'M', 'ヘ'), - (0xFF8E, 'M', 'ホ'), - (0xFF8F, 'M', 'マ'), - (0xFF90, 'M', 'ミ'), - (0xFF91, 'M', 'ム'), - (0xFF92, 'M', 'メ'), - (0xFF93, 'M', 'モ'), - (0xFF94, 'M', 'ヤ'), - (0xFF95, 'M', 'ユ'), - (0xFF96, 'M', 'ヨ'), - (0xFF97, 'M', 'ラ'), - (0xFF98, 'M', 'リ'), - (0xFF99, 'M', 'ル'), - (0xFF9A, 'M', 'レ'), - (0xFF9B, 'M', 'ロ'), - (0xFF9C, 'M', 'ワ'), - (0xFF9D, 'M', 'ン'), - (0xFF9E, 'M', '゙'), - (0xFF9F, 'M', '゚'), - (0xFFA0, 'X'), - (0xFFA1, 'M', 'ᄀ'), - (0xFFA2, 'M', 'ᄁ'), - (0xFFA3, 'M', 'ᆪ'), - (0xFFA4, 'M', 'ᄂ'), - (0xFFA5, 'M', 'ᆬ'), - (0xFFA6, 'M', 'ᆭ'), - (0xFFA7, 'M', 'ᄃ'), - (0xFFA8, 'M', 'ᄄ'), - (0xFFA9, 'M', 'ᄅ'), - (0xFFAA, 'M', 'ᆰ'), - (0xFFAB, 'M', 'ᆱ'), - (0xFFAC, 'M', 'ᆲ'), - (0xFFAD, 'M', 'ᆳ'), - (0xFFAE, 'M', 'ᆴ'), - (0xFFAF, 'M', 'ᆵ'), - (0xFFB0, 'M', 'ᄚ'), - (0xFFB1, 'M', 'ᄆ'), - (0xFFB2, 'M', 'ᄇ'), - (0xFFB3, 'M', 'ᄈ'), - (0xFFB4, 'M', 'ᄡ'), - (0xFFB5, 'M', 'ᄉ'), - (0xFFB6, 'M', 'ᄊ'), - (0xFFB7, 'M', 'ᄋ'), - (0xFFB8, 'M', 'ᄌ'), - (0xFFB9, 'M', 'ᄍ'), - (0xFFBA, 'M', 'ᄎ'), - (0xFFBB, 'M', 'ᄏ'), - (0xFFBC, 'M', 'ᄐ'), - (0xFFBD, 'M', 'ᄑ'), - (0xFFBE, 'M', 'ᄒ'), - (0xFFBF, 'X'), - (0xFFC2, 'M', 'ᅡ'), - (0xFFC3, 'M', 'ᅢ'), - (0xFFC4, 'M', 'ᅣ'), - (0xFFC5, 'M', 'ᅤ'), - (0xFFC6, 'M', 'ᅥ'), - (0xFFC7, 'M', 'ᅦ'), - (0xFFC8, 'X'), - (0xFFCA, 'M', 'ᅧ'), - (0xFFCB, 'M', 'ᅨ'), - (0xFFCC, 'M', 'ᅩ'), - (0xFFCD, 'M', 'ᅪ'), - (0xFFCE, 'M', 'ᅫ'), - (0xFFCF, 'M', 'ᅬ'), - (0xFFD0, 'X'), - (0xFFD2, 'M', 'ᅭ'), - (0xFFD3, 'M', 'ᅮ'), - (0xFFD4, 'M', 'ᅯ'), - (0xFFD5, 'M', 'ᅰ'), - (0xFFD6, 'M', 'ᅱ'), - (0xFFD7, 'M', 'ᅲ'), - (0xFFD8, 'X'), - (0xFFDA, 'M', 'ᅳ'), - (0xFFDB, 'M', 'ᅴ'), - (0xFFDC, 'M', 'ᅵ'), - (0xFFDD, 'X'), - (0xFFE0, 'M', '¢'), - (0xFFE1, 'M', '£'), - (0xFFE2, 'M', '¬'), - (0xFFE3, '3', ' ̄'), - (0xFFE4, 'M', '¦'), - (0xFFE5, 'M', '¥'), - (0xFFE6, 'M', '₩'), - (0xFFE7, 'X'), - (0xFFE8, 'M', '│'), - (0xFFE9, 'M', '←'), - (0xFFEA, 'M', '↑'), - (0xFFEB, 'M', '→'), - (0xFFEC, 'M', '↓'), - (0xFFED, 'M', '■'), - ] - -def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFFEE, 'M', '○'), - (0xFFEF, 'X'), - (0x10000, 'V'), - (0x1000C, 'X'), - (0x1000D, 'V'), - (0x10027, 'X'), - (0x10028, 'V'), - (0x1003B, 'X'), - (0x1003C, 'V'), - (0x1003E, 'X'), - (0x1003F, 'V'), - (0x1004E, 'X'), - (0x10050, 'V'), - (0x1005E, 'X'), - (0x10080, 'V'), - (0x100FB, 'X'), - (0x10100, 'V'), - (0x10103, 'X'), - (0x10107, 'V'), - (0x10134, 'X'), - (0x10137, 'V'), - (0x1018F, 'X'), - (0x10190, 'V'), - (0x1019D, 'X'), - (0x101A0, 'V'), - (0x101A1, 'X'), - (0x101D0, 'V'), - (0x101FE, 'X'), - (0x10280, 'V'), - (0x1029D, 'X'), - (0x102A0, 'V'), - (0x102D1, 'X'), - (0x102E0, 'V'), - (0x102FC, 'X'), - (0x10300, 'V'), - (0x10324, 'X'), - (0x1032D, 'V'), - (0x1034B, 'X'), - (0x10350, 'V'), - (0x1037B, 'X'), - (0x10380, 'V'), - (0x1039E, 'X'), - (0x1039F, 'V'), - (0x103C4, 'X'), - (0x103C8, 'V'), - (0x103D6, 'X'), - (0x10400, 'M', '𐐨'), - (0x10401, 'M', '𐐩'), - (0x10402, 'M', '𐐪'), - (0x10403, 'M', '𐐫'), - (0x10404, 'M', '𐐬'), - (0x10405, 'M', '𐐭'), - (0x10406, 'M', '𐐮'), - (0x10407, 'M', '𐐯'), - (0x10408, 'M', '𐐰'), - (0x10409, 'M', '𐐱'), - (0x1040A, 'M', '𐐲'), - (0x1040B, 'M', '𐐳'), - (0x1040C, 'M', '𐐴'), - (0x1040D, 'M', '𐐵'), - (0x1040E, 'M', '𐐶'), - (0x1040F, 'M', '𐐷'), - (0x10410, 'M', '𐐸'), - (0x10411, 'M', '𐐹'), - (0x10412, 'M', '𐐺'), - (0x10413, 'M', '𐐻'), - (0x10414, 'M', '𐐼'), - (0x10415, 'M', '𐐽'), - (0x10416, 'M', '𐐾'), - (0x10417, 'M', '𐐿'), - (0x10418, 'M', '𐑀'), - (0x10419, 'M', '𐑁'), - (0x1041A, 'M', '𐑂'), - (0x1041B, 'M', '𐑃'), - (0x1041C, 'M', '𐑄'), - (0x1041D, 'M', '𐑅'), - (0x1041E, 'M', '𐑆'), - (0x1041F, 'M', '𐑇'), - (0x10420, 'M', '𐑈'), - (0x10421, 'M', '𐑉'), - (0x10422, 'M', '𐑊'), - (0x10423, 'M', '𐑋'), - (0x10424, 'M', '𐑌'), - (0x10425, 'M', '𐑍'), - (0x10426, 'M', '𐑎'), - (0x10427, 'M', '𐑏'), - (0x10428, 'V'), - (0x1049E, 'X'), - (0x104A0, 'V'), - (0x104AA, 'X'), - (0x104B0, 'M', '𐓘'), - (0x104B1, 'M', '𐓙'), - (0x104B2, 'M', '𐓚'), - (0x104B3, 'M', '𐓛'), - (0x104B4, 'M', '𐓜'), - (0x104B5, 'M', '𐓝'), - (0x104B6, 'M', '𐓞'), - (0x104B7, 'M', '𐓟'), - (0x104B8, 'M', '𐓠'), - (0x104B9, 'M', '𐓡'), - ] - -def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x104BA, 'M', '𐓢'), - (0x104BB, 'M', '𐓣'), - (0x104BC, 'M', '𐓤'), - (0x104BD, 'M', '𐓥'), - (0x104BE, 'M', '𐓦'), - (0x104BF, 'M', '𐓧'), - (0x104C0, 'M', '𐓨'), - (0x104C1, 'M', '𐓩'), - (0x104C2, 'M', '𐓪'), - (0x104C3, 'M', '𐓫'), - (0x104C4, 'M', '𐓬'), - (0x104C5, 'M', '𐓭'), - (0x104C6, 'M', '𐓮'), - (0x104C7, 'M', '𐓯'), - (0x104C8, 'M', '𐓰'), - (0x104C9, 'M', '𐓱'), - (0x104CA, 'M', '𐓲'), - (0x104CB, 'M', '𐓳'), - (0x104CC, 'M', '𐓴'), - (0x104CD, 'M', '𐓵'), - (0x104CE, 'M', '𐓶'), - (0x104CF, 'M', '𐓷'), - (0x104D0, 'M', '𐓸'), - (0x104D1, 'M', '𐓹'), - (0x104D2, 'M', '𐓺'), - (0x104D3, 'M', '𐓻'), - (0x104D4, 'X'), - (0x104D8, 'V'), - (0x104FC, 'X'), - (0x10500, 'V'), - (0x10528, 'X'), - (0x10530, 'V'), - (0x10564, 'X'), - (0x1056F, 'V'), - (0x10570, 'M', '𐖗'), - (0x10571, 'M', '𐖘'), - (0x10572, 'M', '𐖙'), - (0x10573, 'M', '𐖚'), - (0x10574, 'M', '𐖛'), - (0x10575, 'M', '𐖜'), - (0x10576, 'M', '𐖝'), - (0x10577, 'M', '𐖞'), - (0x10578, 'M', '𐖟'), - (0x10579, 'M', '𐖠'), - (0x1057A, 'M', '𐖡'), - (0x1057B, 'X'), - (0x1057C, 'M', '𐖣'), - (0x1057D, 'M', '𐖤'), - (0x1057E, 'M', '𐖥'), - (0x1057F, 'M', '𐖦'), - (0x10580, 'M', '𐖧'), - (0x10581, 'M', '𐖨'), - (0x10582, 'M', '𐖩'), - (0x10583, 'M', '𐖪'), - (0x10584, 'M', '𐖫'), - (0x10585, 'M', '𐖬'), - (0x10586, 'M', '𐖭'), - (0x10587, 'M', '𐖮'), - (0x10588, 'M', '𐖯'), - (0x10589, 'M', '𐖰'), - (0x1058A, 'M', '𐖱'), - (0x1058B, 'X'), - (0x1058C, 'M', '𐖳'), - (0x1058D, 'M', '𐖴'), - (0x1058E, 'M', '𐖵'), - (0x1058F, 'M', '𐖶'), - (0x10590, 'M', '𐖷'), - (0x10591, 'M', '𐖸'), - (0x10592, 'M', '𐖹'), - (0x10593, 'X'), - (0x10594, 'M', '𐖻'), - (0x10595, 'M', '𐖼'), - (0x10596, 'X'), - (0x10597, 'V'), - (0x105A2, 'X'), - (0x105A3, 'V'), - (0x105B2, 'X'), - (0x105B3, 'V'), - (0x105BA, 'X'), - (0x105BB, 'V'), - (0x105BD, 'X'), - (0x10600, 'V'), - (0x10737, 'X'), - (0x10740, 'V'), - (0x10756, 'X'), - (0x10760, 'V'), - (0x10768, 'X'), - (0x10780, 'V'), - (0x10781, 'M', 'ː'), - (0x10782, 'M', 'ˑ'), - (0x10783, 'M', 'æ'), - (0x10784, 'M', 'ʙ'), - (0x10785, 'M', 'ɓ'), - (0x10786, 'X'), - (0x10787, 'M', 'ʣ'), - (0x10788, 'M', 'ꭦ'), - (0x10789, 'M', 'ʥ'), - (0x1078A, 'M', 'ʤ'), - (0x1078B, 'M', 'ɖ'), - (0x1078C, 'M', 'ɗ'), - ] - -def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1078D, 'M', 'ᶑ'), - (0x1078E, 'M', 'ɘ'), - (0x1078F, 'M', 'ɞ'), - (0x10790, 'M', 'ʩ'), - (0x10791, 'M', 'ɤ'), - (0x10792, 'M', 'ɢ'), - (0x10793, 'M', 'ɠ'), - (0x10794, 'M', 'ʛ'), - (0x10795, 'M', 'ħ'), - (0x10796, 'M', 'ʜ'), - (0x10797, 'M', 'ɧ'), - (0x10798, 'M', 'ʄ'), - (0x10799, 'M', 'ʪ'), - (0x1079A, 'M', 'ʫ'), - (0x1079B, 'M', 'ɬ'), - (0x1079C, 'M', '𝼄'), - (0x1079D, 'M', 'ꞎ'), - (0x1079E, 'M', 'ɮ'), - (0x1079F, 'M', '𝼅'), - (0x107A0, 'M', 'ʎ'), - (0x107A1, 'M', '𝼆'), - (0x107A2, 'M', 'ø'), - (0x107A3, 'M', 'ɶ'), - (0x107A4, 'M', 'ɷ'), - (0x107A5, 'M', 'q'), - (0x107A6, 'M', 'ɺ'), - (0x107A7, 'M', '𝼈'), - (0x107A8, 'M', 'ɽ'), - (0x107A9, 'M', 'ɾ'), - (0x107AA, 'M', 'ʀ'), - (0x107AB, 'M', 'ʨ'), - (0x107AC, 'M', 'ʦ'), - (0x107AD, 'M', 'ꭧ'), - (0x107AE, 'M', 'ʧ'), - (0x107AF, 'M', 'ʈ'), - (0x107B0, 'M', 'ⱱ'), - (0x107B1, 'X'), - (0x107B2, 'M', 'ʏ'), - (0x107B3, 'M', 'ʡ'), - (0x107B4, 'M', 'ʢ'), - (0x107B5, 'M', 'ʘ'), - (0x107B6, 'M', 'ǀ'), - (0x107B7, 'M', 'ǁ'), - (0x107B8, 'M', 'ǂ'), - (0x107B9, 'M', '𝼊'), - (0x107BA, 'M', '𝼞'), - (0x107BB, 'X'), - (0x10800, 'V'), - (0x10806, 'X'), - (0x10808, 'V'), - (0x10809, 'X'), - (0x1080A, 'V'), - (0x10836, 'X'), - (0x10837, 'V'), - (0x10839, 'X'), - (0x1083C, 'V'), - (0x1083D, 'X'), - (0x1083F, 'V'), - (0x10856, 'X'), - (0x10857, 'V'), - (0x1089F, 'X'), - (0x108A7, 'V'), - (0x108B0, 'X'), - (0x108E0, 'V'), - (0x108F3, 'X'), - (0x108F4, 'V'), - (0x108F6, 'X'), - (0x108FB, 'V'), - (0x1091C, 'X'), - (0x1091F, 'V'), - (0x1093A, 'X'), - (0x1093F, 'V'), - (0x10940, 'X'), - (0x10980, 'V'), - (0x109B8, 'X'), - (0x109BC, 'V'), - (0x109D0, 'X'), - (0x109D2, 'V'), - (0x10A04, 'X'), - (0x10A05, 'V'), - (0x10A07, 'X'), - (0x10A0C, 'V'), - (0x10A14, 'X'), - (0x10A15, 'V'), - (0x10A18, 'X'), - (0x10A19, 'V'), - (0x10A36, 'X'), - (0x10A38, 'V'), - (0x10A3B, 'X'), - (0x10A3F, 'V'), - (0x10A49, 'X'), - (0x10A50, 'V'), - (0x10A59, 'X'), - (0x10A60, 'V'), - (0x10AA0, 'X'), - (0x10AC0, 'V'), - (0x10AE7, 'X'), - (0x10AEB, 'V'), - (0x10AF7, 'X'), - (0x10B00, 'V'), - ] - -def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x10B36, 'X'), - (0x10B39, 'V'), - (0x10B56, 'X'), - (0x10B58, 'V'), - (0x10B73, 'X'), - (0x10B78, 'V'), - (0x10B92, 'X'), - (0x10B99, 'V'), - (0x10B9D, 'X'), - (0x10BA9, 'V'), - (0x10BB0, 'X'), - (0x10C00, 'V'), - (0x10C49, 'X'), - (0x10C80, 'M', '𐳀'), - (0x10C81, 'M', '𐳁'), - (0x10C82, 'M', '𐳂'), - (0x10C83, 'M', '𐳃'), - (0x10C84, 'M', '𐳄'), - (0x10C85, 'M', '𐳅'), - (0x10C86, 'M', '𐳆'), - (0x10C87, 'M', '𐳇'), - (0x10C88, 'M', '𐳈'), - (0x10C89, 'M', '𐳉'), - (0x10C8A, 'M', '𐳊'), - (0x10C8B, 'M', '𐳋'), - (0x10C8C, 'M', '𐳌'), - (0x10C8D, 'M', '𐳍'), - (0x10C8E, 'M', '𐳎'), - (0x10C8F, 'M', '𐳏'), - (0x10C90, 'M', '𐳐'), - (0x10C91, 'M', '𐳑'), - (0x10C92, 'M', '𐳒'), - (0x10C93, 'M', '𐳓'), - (0x10C94, 'M', '𐳔'), - (0x10C95, 'M', '𐳕'), - (0x10C96, 'M', '𐳖'), - (0x10C97, 'M', '𐳗'), - (0x10C98, 'M', '𐳘'), - (0x10C99, 'M', '𐳙'), - (0x10C9A, 'M', '𐳚'), - (0x10C9B, 'M', '𐳛'), - (0x10C9C, 'M', '𐳜'), - (0x10C9D, 'M', '𐳝'), - (0x10C9E, 'M', '𐳞'), - (0x10C9F, 'M', '𐳟'), - (0x10CA0, 'M', '𐳠'), - (0x10CA1, 'M', '𐳡'), - (0x10CA2, 'M', '𐳢'), - (0x10CA3, 'M', '𐳣'), - (0x10CA4, 'M', '𐳤'), - (0x10CA5, 'M', '𐳥'), - (0x10CA6, 'M', '𐳦'), - (0x10CA7, 'M', '𐳧'), - (0x10CA8, 'M', '𐳨'), - (0x10CA9, 'M', '𐳩'), - (0x10CAA, 'M', '𐳪'), - (0x10CAB, 'M', '𐳫'), - (0x10CAC, 'M', '𐳬'), - (0x10CAD, 'M', '𐳭'), - (0x10CAE, 'M', '𐳮'), - (0x10CAF, 'M', '𐳯'), - (0x10CB0, 'M', '𐳰'), - (0x10CB1, 'M', '𐳱'), - (0x10CB2, 'M', '𐳲'), - (0x10CB3, 'X'), - (0x10CC0, 'V'), - (0x10CF3, 'X'), - (0x10CFA, 'V'), - (0x10D28, 'X'), - (0x10D30, 'V'), - (0x10D3A, 'X'), - (0x10E60, 'V'), - (0x10E7F, 'X'), - (0x10E80, 'V'), - (0x10EAA, 'X'), - (0x10EAB, 'V'), - (0x10EAE, 'X'), - (0x10EB0, 'V'), - (0x10EB2, 'X'), - (0x10EFD, 'V'), - (0x10F28, 'X'), - (0x10F30, 'V'), - (0x10F5A, 'X'), - (0x10F70, 'V'), - (0x10F8A, 'X'), - (0x10FB0, 'V'), - (0x10FCC, 'X'), - (0x10FE0, 'V'), - (0x10FF7, 'X'), - (0x11000, 'V'), - (0x1104E, 'X'), - (0x11052, 'V'), - (0x11076, 'X'), - (0x1107F, 'V'), - (0x110BD, 'X'), - (0x110BE, 'V'), - (0x110C3, 'X'), - (0x110D0, 'V'), - (0x110E9, 'X'), - (0x110F0, 'V'), - ] - -def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x110FA, 'X'), - (0x11100, 'V'), - (0x11135, 'X'), - (0x11136, 'V'), - (0x11148, 'X'), - (0x11150, 'V'), - (0x11177, 'X'), - (0x11180, 'V'), - (0x111E0, 'X'), - (0x111E1, 'V'), - (0x111F5, 'X'), - (0x11200, 'V'), - (0x11212, 'X'), - (0x11213, 'V'), - (0x11242, 'X'), - (0x11280, 'V'), - (0x11287, 'X'), - (0x11288, 'V'), - (0x11289, 'X'), - (0x1128A, 'V'), - (0x1128E, 'X'), - (0x1128F, 'V'), - (0x1129E, 'X'), - (0x1129F, 'V'), - (0x112AA, 'X'), - (0x112B0, 'V'), - (0x112EB, 'X'), - (0x112F0, 'V'), - (0x112FA, 'X'), - (0x11300, 'V'), - (0x11304, 'X'), - (0x11305, 'V'), - (0x1130D, 'X'), - (0x1130F, 'V'), - (0x11311, 'X'), - (0x11313, 'V'), - (0x11329, 'X'), - (0x1132A, 'V'), - (0x11331, 'X'), - (0x11332, 'V'), - (0x11334, 'X'), - (0x11335, 'V'), - (0x1133A, 'X'), - (0x1133B, 'V'), - (0x11345, 'X'), - (0x11347, 'V'), - (0x11349, 'X'), - (0x1134B, 'V'), - (0x1134E, 'X'), - (0x11350, 'V'), - (0x11351, 'X'), - (0x11357, 'V'), - (0x11358, 'X'), - (0x1135D, 'V'), - (0x11364, 'X'), - (0x11366, 'V'), - (0x1136D, 'X'), - (0x11370, 'V'), - (0x11375, 'X'), - (0x11400, 'V'), - (0x1145C, 'X'), - (0x1145D, 'V'), - (0x11462, 'X'), - (0x11480, 'V'), - (0x114C8, 'X'), - (0x114D0, 'V'), - (0x114DA, 'X'), - (0x11580, 'V'), - (0x115B6, 'X'), - (0x115B8, 'V'), - (0x115DE, 'X'), - (0x11600, 'V'), - (0x11645, 'X'), - (0x11650, 'V'), - (0x1165A, 'X'), - (0x11660, 'V'), - (0x1166D, 'X'), - (0x11680, 'V'), - (0x116BA, 'X'), - (0x116C0, 'V'), - (0x116CA, 'X'), - (0x11700, 'V'), - (0x1171B, 'X'), - (0x1171D, 'V'), - (0x1172C, 'X'), - (0x11730, 'V'), - (0x11747, 'X'), - (0x11800, 'V'), - (0x1183C, 'X'), - (0x118A0, 'M', '𑣀'), - (0x118A1, 'M', '𑣁'), - (0x118A2, 'M', '𑣂'), - (0x118A3, 'M', '𑣃'), - (0x118A4, 'M', '𑣄'), - (0x118A5, 'M', '𑣅'), - (0x118A6, 'M', '𑣆'), - (0x118A7, 'M', '𑣇'), - (0x118A8, 'M', '𑣈'), - (0x118A9, 'M', '𑣉'), - (0x118AA, 'M', '𑣊'), - ] - -def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x118AB, 'M', '𑣋'), - (0x118AC, 'M', '𑣌'), - (0x118AD, 'M', '𑣍'), - (0x118AE, 'M', '𑣎'), - (0x118AF, 'M', '𑣏'), - (0x118B0, 'M', '𑣐'), - (0x118B1, 'M', '𑣑'), - (0x118B2, 'M', '𑣒'), - (0x118B3, 'M', '𑣓'), - (0x118B4, 'M', '𑣔'), - (0x118B5, 'M', '𑣕'), - (0x118B6, 'M', '𑣖'), - (0x118B7, 'M', '𑣗'), - (0x118B8, 'M', '𑣘'), - (0x118B9, 'M', '𑣙'), - (0x118BA, 'M', '𑣚'), - (0x118BB, 'M', '𑣛'), - (0x118BC, 'M', '𑣜'), - (0x118BD, 'M', '𑣝'), - (0x118BE, 'M', '𑣞'), - (0x118BF, 'M', '𑣟'), - (0x118C0, 'V'), - (0x118F3, 'X'), - (0x118FF, 'V'), - (0x11907, 'X'), - (0x11909, 'V'), - (0x1190A, 'X'), - (0x1190C, 'V'), - (0x11914, 'X'), - (0x11915, 'V'), - (0x11917, 'X'), - (0x11918, 'V'), - (0x11936, 'X'), - (0x11937, 'V'), - (0x11939, 'X'), - (0x1193B, 'V'), - (0x11947, 'X'), - (0x11950, 'V'), - (0x1195A, 'X'), - (0x119A0, 'V'), - (0x119A8, 'X'), - (0x119AA, 'V'), - (0x119D8, 'X'), - (0x119DA, 'V'), - (0x119E5, 'X'), - (0x11A00, 'V'), - (0x11A48, 'X'), - (0x11A50, 'V'), - (0x11AA3, 'X'), - (0x11AB0, 'V'), - (0x11AF9, 'X'), - (0x11B00, 'V'), - (0x11B0A, 'X'), - (0x11C00, 'V'), - (0x11C09, 'X'), - (0x11C0A, 'V'), - (0x11C37, 'X'), - (0x11C38, 'V'), - (0x11C46, 'X'), - (0x11C50, 'V'), - (0x11C6D, 'X'), - (0x11C70, 'V'), - (0x11C90, 'X'), - (0x11C92, 'V'), - (0x11CA8, 'X'), - (0x11CA9, 'V'), - (0x11CB7, 'X'), - (0x11D00, 'V'), - (0x11D07, 'X'), - (0x11D08, 'V'), - (0x11D0A, 'X'), - (0x11D0B, 'V'), - (0x11D37, 'X'), - (0x11D3A, 'V'), - (0x11D3B, 'X'), - (0x11D3C, 'V'), - (0x11D3E, 'X'), - (0x11D3F, 'V'), - (0x11D48, 'X'), - (0x11D50, 'V'), - (0x11D5A, 'X'), - (0x11D60, 'V'), - (0x11D66, 'X'), - (0x11D67, 'V'), - (0x11D69, 'X'), - (0x11D6A, 'V'), - (0x11D8F, 'X'), - (0x11D90, 'V'), - (0x11D92, 'X'), - (0x11D93, 'V'), - (0x11D99, 'X'), - (0x11DA0, 'V'), - (0x11DAA, 'X'), - (0x11EE0, 'V'), - (0x11EF9, 'X'), - (0x11F00, 'V'), - (0x11F11, 'X'), - (0x11F12, 'V'), - (0x11F3B, 'X'), - (0x11F3E, 'V'), - ] - -def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x11F5A, 'X'), - (0x11FB0, 'V'), - (0x11FB1, 'X'), - (0x11FC0, 'V'), - (0x11FF2, 'X'), - (0x11FFF, 'V'), - (0x1239A, 'X'), - (0x12400, 'V'), - (0x1246F, 'X'), - (0x12470, 'V'), - (0x12475, 'X'), - (0x12480, 'V'), - (0x12544, 'X'), - (0x12F90, 'V'), - (0x12FF3, 'X'), - (0x13000, 'V'), - (0x13430, 'X'), - (0x13440, 'V'), - (0x13456, 'X'), - (0x14400, 'V'), - (0x14647, 'X'), - (0x16800, 'V'), - (0x16A39, 'X'), - (0x16A40, 'V'), - (0x16A5F, 'X'), - (0x16A60, 'V'), - (0x16A6A, 'X'), - (0x16A6E, 'V'), - (0x16ABF, 'X'), - (0x16AC0, 'V'), - (0x16ACA, 'X'), - (0x16AD0, 'V'), - (0x16AEE, 'X'), - (0x16AF0, 'V'), - (0x16AF6, 'X'), - (0x16B00, 'V'), - (0x16B46, 'X'), - (0x16B50, 'V'), - (0x16B5A, 'X'), - (0x16B5B, 'V'), - (0x16B62, 'X'), - (0x16B63, 'V'), - (0x16B78, 'X'), - (0x16B7D, 'V'), - (0x16B90, 'X'), - (0x16E40, 'M', '𖹠'), - (0x16E41, 'M', '𖹡'), - (0x16E42, 'M', '𖹢'), - (0x16E43, 'M', '𖹣'), - (0x16E44, 'M', '𖹤'), - (0x16E45, 'M', '𖹥'), - (0x16E46, 'M', '𖹦'), - (0x16E47, 'M', '𖹧'), - (0x16E48, 'M', '𖹨'), - (0x16E49, 'M', '𖹩'), - (0x16E4A, 'M', '𖹪'), - (0x16E4B, 'M', '𖹫'), - (0x16E4C, 'M', '𖹬'), - (0x16E4D, 'M', '𖹭'), - (0x16E4E, 'M', '𖹮'), - (0x16E4F, 'M', '𖹯'), - (0x16E50, 'M', '𖹰'), - (0x16E51, 'M', '𖹱'), - (0x16E52, 'M', '𖹲'), - (0x16E53, 'M', '𖹳'), - (0x16E54, 'M', '𖹴'), - (0x16E55, 'M', '𖹵'), - (0x16E56, 'M', '𖹶'), - (0x16E57, 'M', '𖹷'), - (0x16E58, 'M', '𖹸'), - (0x16E59, 'M', '𖹹'), - (0x16E5A, 'M', '𖹺'), - (0x16E5B, 'M', '𖹻'), - (0x16E5C, 'M', '𖹼'), - (0x16E5D, 'M', '𖹽'), - (0x16E5E, 'M', '𖹾'), - (0x16E5F, 'M', '𖹿'), - (0x16E60, 'V'), - (0x16E9B, 'X'), - (0x16F00, 'V'), - (0x16F4B, 'X'), - (0x16F4F, 'V'), - (0x16F88, 'X'), - (0x16F8F, 'V'), - (0x16FA0, 'X'), - (0x16FE0, 'V'), - (0x16FE5, 'X'), - (0x16FF0, 'V'), - (0x16FF2, 'X'), - (0x17000, 'V'), - (0x187F8, 'X'), - (0x18800, 'V'), - (0x18CD6, 'X'), - (0x18D00, 'V'), - (0x18D09, 'X'), - (0x1AFF0, 'V'), - (0x1AFF4, 'X'), - (0x1AFF5, 'V'), - (0x1AFFC, 'X'), - (0x1AFFD, 'V'), - ] - -def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1AFFF, 'X'), - (0x1B000, 'V'), - (0x1B123, 'X'), - (0x1B132, 'V'), - (0x1B133, 'X'), - (0x1B150, 'V'), - (0x1B153, 'X'), - (0x1B155, 'V'), - (0x1B156, 'X'), - (0x1B164, 'V'), - (0x1B168, 'X'), - (0x1B170, 'V'), - (0x1B2FC, 'X'), - (0x1BC00, 'V'), - (0x1BC6B, 'X'), - (0x1BC70, 'V'), - (0x1BC7D, 'X'), - (0x1BC80, 'V'), - (0x1BC89, 'X'), - (0x1BC90, 'V'), - (0x1BC9A, 'X'), - (0x1BC9C, 'V'), - (0x1BCA0, 'I'), - (0x1BCA4, 'X'), - (0x1CF00, 'V'), - (0x1CF2E, 'X'), - (0x1CF30, 'V'), - (0x1CF47, 'X'), - (0x1CF50, 'V'), - (0x1CFC4, 'X'), - (0x1D000, 'V'), - (0x1D0F6, 'X'), - (0x1D100, 'V'), - (0x1D127, 'X'), - (0x1D129, 'V'), - (0x1D15E, 'M', '𝅗𝅥'), - (0x1D15F, 'M', '𝅘𝅥'), - (0x1D160, 'M', '𝅘𝅥𝅮'), - (0x1D161, 'M', '𝅘𝅥𝅯'), - (0x1D162, 'M', '𝅘𝅥𝅰'), - (0x1D163, 'M', '𝅘𝅥𝅱'), - (0x1D164, 'M', '𝅘𝅥𝅲'), - (0x1D165, 'V'), - (0x1D173, 'X'), - (0x1D17B, 'V'), - (0x1D1BB, 'M', '𝆹𝅥'), - (0x1D1BC, 'M', '𝆺𝅥'), - (0x1D1BD, 'M', '𝆹𝅥𝅮'), - (0x1D1BE, 'M', '𝆺𝅥𝅮'), - (0x1D1BF, 'M', '𝆹𝅥𝅯'), - (0x1D1C0, 'M', '𝆺𝅥𝅯'), - (0x1D1C1, 'V'), - (0x1D1EB, 'X'), - (0x1D200, 'V'), - (0x1D246, 'X'), - (0x1D2C0, 'V'), - (0x1D2D4, 'X'), - (0x1D2E0, 'V'), - (0x1D2F4, 'X'), - (0x1D300, 'V'), - (0x1D357, 'X'), - (0x1D360, 'V'), - (0x1D379, 'X'), - (0x1D400, 'M', 'a'), - (0x1D401, 'M', 'b'), - (0x1D402, 'M', 'c'), - (0x1D403, 'M', 'd'), - (0x1D404, 'M', 'e'), - (0x1D405, 'M', 'f'), - (0x1D406, 'M', 'g'), - (0x1D407, 'M', 'h'), - (0x1D408, 'M', 'i'), - (0x1D409, 'M', 'j'), - (0x1D40A, 'M', 'k'), - (0x1D40B, 'M', 'l'), - (0x1D40C, 'M', 'm'), - (0x1D40D, 'M', 'n'), - (0x1D40E, 'M', 'o'), - (0x1D40F, 'M', 'p'), - (0x1D410, 'M', 'q'), - (0x1D411, 'M', 'r'), - (0x1D412, 'M', 's'), - (0x1D413, 'M', 't'), - (0x1D414, 'M', 'u'), - (0x1D415, 'M', 'v'), - (0x1D416, 'M', 'w'), - (0x1D417, 'M', 'x'), - (0x1D418, 'M', 'y'), - (0x1D419, 'M', 'z'), - (0x1D41A, 'M', 'a'), - (0x1D41B, 'M', 'b'), - (0x1D41C, 'M', 'c'), - (0x1D41D, 'M', 'd'), - (0x1D41E, 'M', 'e'), - (0x1D41F, 'M', 'f'), - (0x1D420, 'M', 'g'), - (0x1D421, 'M', 'h'), - (0x1D422, 'M', 'i'), - (0x1D423, 'M', 'j'), - (0x1D424, 'M', 'k'), - ] - -def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D425, 'M', 'l'), - (0x1D426, 'M', 'm'), - (0x1D427, 'M', 'n'), - (0x1D428, 'M', 'o'), - (0x1D429, 'M', 'p'), - (0x1D42A, 'M', 'q'), - (0x1D42B, 'M', 'r'), - (0x1D42C, 'M', 's'), - (0x1D42D, 'M', 't'), - (0x1D42E, 'M', 'u'), - (0x1D42F, 'M', 'v'), - (0x1D430, 'M', 'w'), - (0x1D431, 'M', 'x'), - (0x1D432, 'M', 'y'), - (0x1D433, 'M', 'z'), - (0x1D434, 'M', 'a'), - (0x1D435, 'M', 'b'), - (0x1D436, 'M', 'c'), - (0x1D437, 'M', 'd'), - (0x1D438, 'M', 'e'), - (0x1D439, 'M', 'f'), - (0x1D43A, 'M', 'g'), - (0x1D43B, 'M', 'h'), - (0x1D43C, 'M', 'i'), - (0x1D43D, 'M', 'j'), - (0x1D43E, 'M', 'k'), - (0x1D43F, 'M', 'l'), - (0x1D440, 'M', 'm'), - (0x1D441, 'M', 'n'), - (0x1D442, 'M', 'o'), - (0x1D443, 'M', 'p'), - (0x1D444, 'M', 'q'), - (0x1D445, 'M', 'r'), - (0x1D446, 'M', 's'), - (0x1D447, 'M', 't'), - (0x1D448, 'M', 'u'), - (0x1D449, 'M', 'v'), - (0x1D44A, 'M', 'w'), - (0x1D44B, 'M', 'x'), - (0x1D44C, 'M', 'y'), - (0x1D44D, 'M', 'z'), - (0x1D44E, 'M', 'a'), - (0x1D44F, 'M', 'b'), - (0x1D450, 'M', 'c'), - (0x1D451, 'M', 'd'), - (0x1D452, 'M', 'e'), - (0x1D453, 'M', 'f'), - (0x1D454, 'M', 'g'), - (0x1D455, 'X'), - (0x1D456, 'M', 'i'), - (0x1D457, 'M', 'j'), - (0x1D458, 'M', 'k'), - (0x1D459, 'M', 'l'), - (0x1D45A, 'M', 'm'), - (0x1D45B, 'M', 'n'), - (0x1D45C, 'M', 'o'), - (0x1D45D, 'M', 'p'), - (0x1D45E, 'M', 'q'), - (0x1D45F, 'M', 'r'), - (0x1D460, 'M', 's'), - (0x1D461, 'M', 't'), - (0x1D462, 'M', 'u'), - (0x1D463, 'M', 'v'), - (0x1D464, 'M', 'w'), - (0x1D465, 'M', 'x'), - (0x1D466, 'M', 'y'), - (0x1D467, 'M', 'z'), - (0x1D468, 'M', 'a'), - (0x1D469, 'M', 'b'), - (0x1D46A, 'M', 'c'), - (0x1D46B, 'M', 'd'), - (0x1D46C, 'M', 'e'), - (0x1D46D, 'M', 'f'), - (0x1D46E, 'M', 'g'), - (0x1D46F, 'M', 'h'), - (0x1D470, 'M', 'i'), - (0x1D471, 'M', 'j'), - (0x1D472, 'M', 'k'), - (0x1D473, 'M', 'l'), - (0x1D474, 'M', 'm'), - (0x1D475, 'M', 'n'), - (0x1D476, 'M', 'o'), - (0x1D477, 'M', 'p'), - (0x1D478, 'M', 'q'), - (0x1D479, 'M', 'r'), - (0x1D47A, 'M', 's'), - (0x1D47B, 'M', 't'), - (0x1D47C, 'M', 'u'), - (0x1D47D, 'M', 'v'), - (0x1D47E, 'M', 'w'), - (0x1D47F, 'M', 'x'), - (0x1D480, 'M', 'y'), - (0x1D481, 'M', 'z'), - (0x1D482, 'M', 'a'), - (0x1D483, 'M', 'b'), - (0x1D484, 'M', 'c'), - (0x1D485, 'M', 'd'), - (0x1D486, 'M', 'e'), - (0x1D487, 'M', 'f'), - (0x1D488, 'M', 'g'), - ] - -def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D489, 'M', 'h'), - (0x1D48A, 'M', 'i'), - (0x1D48B, 'M', 'j'), - (0x1D48C, 'M', 'k'), - (0x1D48D, 'M', 'l'), - (0x1D48E, 'M', 'm'), - (0x1D48F, 'M', 'n'), - (0x1D490, 'M', 'o'), - (0x1D491, 'M', 'p'), - (0x1D492, 'M', 'q'), - (0x1D493, 'M', 'r'), - (0x1D494, 'M', 's'), - (0x1D495, 'M', 't'), - (0x1D496, 'M', 'u'), - (0x1D497, 'M', 'v'), - (0x1D498, 'M', 'w'), - (0x1D499, 'M', 'x'), - (0x1D49A, 'M', 'y'), - (0x1D49B, 'M', 'z'), - (0x1D49C, 'M', 'a'), - (0x1D49D, 'X'), - (0x1D49E, 'M', 'c'), - (0x1D49F, 'M', 'd'), - (0x1D4A0, 'X'), - (0x1D4A2, 'M', 'g'), - (0x1D4A3, 'X'), - (0x1D4A5, 'M', 'j'), - (0x1D4A6, 'M', 'k'), - (0x1D4A7, 'X'), - (0x1D4A9, 'M', 'n'), - (0x1D4AA, 'M', 'o'), - (0x1D4AB, 'M', 'p'), - (0x1D4AC, 'M', 'q'), - (0x1D4AD, 'X'), - (0x1D4AE, 'M', 's'), - (0x1D4AF, 'M', 't'), - (0x1D4B0, 'M', 'u'), - (0x1D4B1, 'M', 'v'), - (0x1D4B2, 'M', 'w'), - (0x1D4B3, 'M', 'x'), - (0x1D4B4, 'M', 'y'), - (0x1D4B5, 'M', 'z'), - (0x1D4B6, 'M', 'a'), - (0x1D4B7, 'M', 'b'), - (0x1D4B8, 'M', 'c'), - (0x1D4B9, 'M', 'd'), - (0x1D4BA, 'X'), - (0x1D4BB, 'M', 'f'), - (0x1D4BC, 'X'), - (0x1D4BD, 'M', 'h'), - (0x1D4BE, 'M', 'i'), - (0x1D4BF, 'M', 'j'), - (0x1D4C0, 'M', 'k'), - (0x1D4C1, 'M', 'l'), - (0x1D4C2, 'M', 'm'), - (0x1D4C3, 'M', 'n'), - (0x1D4C4, 'X'), - (0x1D4C5, 'M', 'p'), - (0x1D4C6, 'M', 'q'), - (0x1D4C7, 'M', 'r'), - (0x1D4C8, 'M', 's'), - (0x1D4C9, 'M', 't'), - (0x1D4CA, 'M', 'u'), - (0x1D4CB, 'M', 'v'), - (0x1D4CC, 'M', 'w'), - (0x1D4CD, 'M', 'x'), - (0x1D4CE, 'M', 'y'), - (0x1D4CF, 'M', 'z'), - (0x1D4D0, 'M', 'a'), - (0x1D4D1, 'M', 'b'), - (0x1D4D2, 'M', 'c'), - (0x1D4D3, 'M', 'd'), - (0x1D4D4, 'M', 'e'), - (0x1D4D5, 'M', 'f'), - (0x1D4D6, 'M', 'g'), - (0x1D4D7, 'M', 'h'), - (0x1D4D8, 'M', 'i'), - (0x1D4D9, 'M', 'j'), - (0x1D4DA, 'M', 'k'), - (0x1D4DB, 'M', 'l'), - (0x1D4DC, 'M', 'm'), - (0x1D4DD, 'M', 'n'), - (0x1D4DE, 'M', 'o'), - (0x1D4DF, 'M', 'p'), - (0x1D4E0, 'M', 'q'), - (0x1D4E1, 'M', 'r'), - (0x1D4E2, 'M', 's'), - (0x1D4E3, 'M', 't'), - (0x1D4E4, 'M', 'u'), - (0x1D4E5, 'M', 'v'), - (0x1D4E6, 'M', 'w'), - (0x1D4E7, 'M', 'x'), - (0x1D4E8, 'M', 'y'), - (0x1D4E9, 'M', 'z'), - (0x1D4EA, 'M', 'a'), - (0x1D4EB, 'M', 'b'), - (0x1D4EC, 'M', 'c'), - (0x1D4ED, 'M', 'd'), - (0x1D4EE, 'M', 'e'), - (0x1D4EF, 'M', 'f'), - ] - -def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D4F0, 'M', 'g'), - (0x1D4F1, 'M', 'h'), - (0x1D4F2, 'M', 'i'), - (0x1D4F3, 'M', 'j'), - (0x1D4F4, 'M', 'k'), - (0x1D4F5, 'M', 'l'), - (0x1D4F6, 'M', 'm'), - (0x1D4F7, 'M', 'n'), - (0x1D4F8, 'M', 'o'), - (0x1D4F9, 'M', 'p'), - (0x1D4FA, 'M', 'q'), - (0x1D4FB, 'M', 'r'), - (0x1D4FC, 'M', 's'), - (0x1D4FD, 'M', 't'), - (0x1D4FE, 'M', 'u'), - (0x1D4FF, 'M', 'v'), - (0x1D500, 'M', 'w'), - (0x1D501, 'M', 'x'), - (0x1D502, 'M', 'y'), - (0x1D503, 'M', 'z'), - (0x1D504, 'M', 'a'), - (0x1D505, 'M', 'b'), - (0x1D506, 'X'), - (0x1D507, 'M', 'd'), - (0x1D508, 'M', 'e'), - (0x1D509, 'M', 'f'), - (0x1D50A, 'M', 'g'), - (0x1D50B, 'X'), - (0x1D50D, 'M', 'j'), - (0x1D50E, 'M', 'k'), - (0x1D50F, 'M', 'l'), - (0x1D510, 'M', 'm'), - (0x1D511, 'M', 'n'), - (0x1D512, 'M', 'o'), - (0x1D513, 'M', 'p'), - (0x1D514, 'M', 'q'), - (0x1D515, 'X'), - (0x1D516, 'M', 's'), - (0x1D517, 'M', 't'), - (0x1D518, 'M', 'u'), - (0x1D519, 'M', 'v'), - (0x1D51A, 'M', 'w'), - (0x1D51B, 'M', 'x'), - (0x1D51C, 'M', 'y'), - (0x1D51D, 'X'), - (0x1D51E, 'M', 'a'), - (0x1D51F, 'M', 'b'), - (0x1D520, 'M', 'c'), - (0x1D521, 'M', 'd'), - (0x1D522, 'M', 'e'), - (0x1D523, 'M', 'f'), - (0x1D524, 'M', 'g'), - (0x1D525, 'M', 'h'), - (0x1D526, 'M', 'i'), - (0x1D527, 'M', 'j'), - (0x1D528, 'M', 'k'), - (0x1D529, 'M', 'l'), - (0x1D52A, 'M', 'm'), - (0x1D52B, 'M', 'n'), - (0x1D52C, 'M', 'o'), - (0x1D52D, 'M', 'p'), - (0x1D52E, 'M', 'q'), - (0x1D52F, 'M', 'r'), - (0x1D530, 'M', 's'), - (0x1D531, 'M', 't'), - (0x1D532, 'M', 'u'), - (0x1D533, 'M', 'v'), - (0x1D534, 'M', 'w'), - (0x1D535, 'M', 'x'), - (0x1D536, 'M', 'y'), - (0x1D537, 'M', 'z'), - (0x1D538, 'M', 'a'), - (0x1D539, 'M', 'b'), - (0x1D53A, 'X'), - (0x1D53B, 'M', 'd'), - (0x1D53C, 'M', 'e'), - (0x1D53D, 'M', 'f'), - (0x1D53E, 'M', 'g'), - (0x1D53F, 'X'), - (0x1D540, 'M', 'i'), - (0x1D541, 'M', 'j'), - (0x1D542, 'M', 'k'), - (0x1D543, 'M', 'l'), - (0x1D544, 'M', 'm'), - (0x1D545, 'X'), - (0x1D546, 'M', 'o'), - (0x1D547, 'X'), - (0x1D54A, 'M', 's'), - (0x1D54B, 'M', 't'), - (0x1D54C, 'M', 'u'), - (0x1D54D, 'M', 'v'), - (0x1D54E, 'M', 'w'), - (0x1D54F, 'M', 'x'), - (0x1D550, 'M', 'y'), - (0x1D551, 'X'), - (0x1D552, 'M', 'a'), - (0x1D553, 'M', 'b'), - (0x1D554, 'M', 'c'), - (0x1D555, 'M', 'd'), - (0x1D556, 'M', 'e'), - ] - -def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D557, 'M', 'f'), - (0x1D558, 'M', 'g'), - (0x1D559, 'M', 'h'), - (0x1D55A, 'M', 'i'), - (0x1D55B, 'M', 'j'), - (0x1D55C, 'M', 'k'), - (0x1D55D, 'M', 'l'), - (0x1D55E, 'M', 'm'), - (0x1D55F, 'M', 'n'), - (0x1D560, 'M', 'o'), - (0x1D561, 'M', 'p'), - (0x1D562, 'M', 'q'), - (0x1D563, 'M', 'r'), - (0x1D564, 'M', 's'), - (0x1D565, 'M', 't'), - (0x1D566, 'M', 'u'), - (0x1D567, 'M', 'v'), - (0x1D568, 'M', 'w'), - (0x1D569, 'M', 'x'), - (0x1D56A, 'M', 'y'), - (0x1D56B, 'M', 'z'), - (0x1D56C, 'M', 'a'), - (0x1D56D, 'M', 'b'), - (0x1D56E, 'M', 'c'), - (0x1D56F, 'M', 'd'), - (0x1D570, 'M', 'e'), - (0x1D571, 'M', 'f'), - (0x1D572, 'M', 'g'), - (0x1D573, 'M', 'h'), - (0x1D574, 'M', 'i'), - (0x1D575, 'M', 'j'), - (0x1D576, 'M', 'k'), - (0x1D577, 'M', 'l'), - (0x1D578, 'M', 'm'), - (0x1D579, 'M', 'n'), - (0x1D57A, 'M', 'o'), - (0x1D57B, 'M', 'p'), - (0x1D57C, 'M', 'q'), - (0x1D57D, 'M', 'r'), - (0x1D57E, 'M', 's'), - (0x1D57F, 'M', 't'), - (0x1D580, 'M', 'u'), - (0x1D581, 'M', 'v'), - (0x1D582, 'M', 'w'), - (0x1D583, 'M', 'x'), - (0x1D584, 'M', 'y'), - (0x1D585, 'M', 'z'), - (0x1D586, 'M', 'a'), - (0x1D587, 'M', 'b'), - (0x1D588, 'M', 'c'), - (0x1D589, 'M', 'd'), - (0x1D58A, 'M', 'e'), - (0x1D58B, 'M', 'f'), - (0x1D58C, 'M', 'g'), - (0x1D58D, 'M', 'h'), - (0x1D58E, 'M', 'i'), - (0x1D58F, 'M', 'j'), - (0x1D590, 'M', 'k'), - (0x1D591, 'M', 'l'), - (0x1D592, 'M', 'm'), - (0x1D593, 'M', 'n'), - (0x1D594, 'M', 'o'), - (0x1D595, 'M', 'p'), - (0x1D596, 'M', 'q'), - (0x1D597, 'M', 'r'), - (0x1D598, 'M', 's'), - (0x1D599, 'M', 't'), - (0x1D59A, 'M', 'u'), - (0x1D59B, 'M', 'v'), - (0x1D59C, 'M', 'w'), - (0x1D59D, 'M', 'x'), - (0x1D59E, 'M', 'y'), - (0x1D59F, 'M', 'z'), - (0x1D5A0, 'M', 'a'), - (0x1D5A1, 'M', 'b'), - (0x1D5A2, 'M', 'c'), - (0x1D5A3, 'M', 'd'), - (0x1D5A4, 'M', 'e'), - (0x1D5A5, 'M', 'f'), - (0x1D5A6, 'M', 'g'), - (0x1D5A7, 'M', 'h'), - (0x1D5A8, 'M', 'i'), - (0x1D5A9, 'M', 'j'), - (0x1D5AA, 'M', 'k'), - (0x1D5AB, 'M', 'l'), - (0x1D5AC, 'M', 'm'), - (0x1D5AD, 'M', 'n'), - (0x1D5AE, 'M', 'o'), - (0x1D5AF, 'M', 'p'), - (0x1D5B0, 'M', 'q'), - (0x1D5B1, 'M', 'r'), - (0x1D5B2, 'M', 's'), - (0x1D5B3, 'M', 't'), - (0x1D5B4, 'M', 'u'), - (0x1D5B5, 'M', 'v'), - (0x1D5B6, 'M', 'w'), - (0x1D5B7, 'M', 'x'), - (0x1D5B8, 'M', 'y'), - (0x1D5B9, 'M', 'z'), - (0x1D5BA, 'M', 'a'), - ] - -def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D5BB, 'M', 'b'), - (0x1D5BC, 'M', 'c'), - (0x1D5BD, 'M', 'd'), - (0x1D5BE, 'M', 'e'), - (0x1D5BF, 'M', 'f'), - (0x1D5C0, 'M', 'g'), - (0x1D5C1, 'M', 'h'), - (0x1D5C2, 'M', 'i'), - (0x1D5C3, 'M', 'j'), - (0x1D5C4, 'M', 'k'), - (0x1D5C5, 'M', 'l'), - (0x1D5C6, 'M', 'm'), - (0x1D5C7, 'M', 'n'), - (0x1D5C8, 'M', 'o'), - (0x1D5C9, 'M', 'p'), - (0x1D5CA, 'M', 'q'), - (0x1D5CB, 'M', 'r'), - (0x1D5CC, 'M', 's'), - (0x1D5CD, 'M', 't'), - (0x1D5CE, 'M', 'u'), - (0x1D5CF, 'M', 'v'), - (0x1D5D0, 'M', 'w'), - (0x1D5D1, 'M', 'x'), - (0x1D5D2, 'M', 'y'), - (0x1D5D3, 'M', 'z'), - (0x1D5D4, 'M', 'a'), - (0x1D5D5, 'M', 'b'), - (0x1D5D6, 'M', 'c'), - (0x1D5D7, 'M', 'd'), - (0x1D5D8, 'M', 'e'), - (0x1D5D9, 'M', 'f'), - (0x1D5DA, 'M', 'g'), - (0x1D5DB, 'M', 'h'), - (0x1D5DC, 'M', 'i'), - (0x1D5DD, 'M', 'j'), - (0x1D5DE, 'M', 'k'), - (0x1D5DF, 'M', 'l'), - (0x1D5E0, 'M', 'm'), - (0x1D5E1, 'M', 'n'), - (0x1D5E2, 'M', 'o'), - (0x1D5E3, 'M', 'p'), - (0x1D5E4, 'M', 'q'), - (0x1D5E5, 'M', 'r'), - (0x1D5E6, 'M', 's'), - (0x1D5E7, 'M', 't'), - (0x1D5E8, 'M', 'u'), - (0x1D5E9, 'M', 'v'), - (0x1D5EA, 'M', 'w'), - (0x1D5EB, 'M', 'x'), - (0x1D5EC, 'M', 'y'), - (0x1D5ED, 'M', 'z'), - (0x1D5EE, 'M', 'a'), - (0x1D5EF, 'M', 'b'), - (0x1D5F0, 'M', 'c'), - (0x1D5F1, 'M', 'd'), - (0x1D5F2, 'M', 'e'), - (0x1D5F3, 'M', 'f'), - (0x1D5F4, 'M', 'g'), - (0x1D5F5, 'M', 'h'), - (0x1D5F6, 'M', 'i'), - (0x1D5F7, 'M', 'j'), - (0x1D5F8, 'M', 'k'), - (0x1D5F9, 'M', 'l'), - (0x1D5FA, 'M', 'm'), - (0x1D5FB, 'M', 'n'), - (0x1D5FC, 'M', 'o'), - (0x1D5FD, 'M', 'p'), - (0x1D5FE, 'M', 'q'), - (0x1D5FF, 'M', 'r'), - (0x1D600, 'M', 's'), - (0x1D601, 'M', 't'), - (0x1D602, 'M', 'u'), - (0x1D603, 'M', 'v'), - (0x1D604, 'M', 'w'), - (0x1D605, 'M', 'x'), - (0x1D606, 'M', 'y'), - (0x1D607, 'M', 'z'), - (0x1D608, 'M', 'a'), - (0x1D609, 'M', 'b'), - (0x1D60A, 'M', 'c'), - (0x1D60B, 'M', 'd'), - (0x1D60C, 'M', 'e'), - (0x1D60D, 'M', 'f'), - (0x1D60E, 'M', 'g'), - (0x1D60F, 'M', 'h'), - (0x1D610, 'M', 'i'), - (0x1D611, 'M', 'j'), - (0x1D612, 'M', 'k'), - (0x1D613, 'M', 'l'), - (0x1D614, 'M', 'm'), - (0x1D615, 'M', 'n'), - (0x1D616, 'M', 'o'), - (0x1D617, 'M', 'p'), - (0x1D618, 'M', 'q'), - (0x1D619, 'M', 'r'), - (0x1D61A, 'M', 's'), - (0x1D61B, 'M', 't'), - (0x1D61C, 'M', 'u'), - (0x1D61D, 'M', 'v'), - (0x1D61E, 'M', 'w'), - ] - -def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D61F, 'M', 'x'), - (0x1D620, 'M', 'y'), - (0x1D621, 'M', 'z'), - (0x1D622, 'M', 'a'), - (0x1D623, 'M', 'b'), - (0x1D624, 'M', 'c'), - (0x1D625, 'M', 'd'), - (0x1D626, 'M', 'e'), - (0x1D627, 'M', 'f'), - (0x1D628, 'M', 'g'), - (0x1D629, 'M', 'h'), - (0x1D62A, 'M', 'i'), - (0x1D62B, 'M', 'j'), - (0x1D62C, 'M', 'k'), - (0x1D62D, 'M', 'l'), - (0x1D62E, 'M', 'm'), - (0x1D62F, 'M', 'n'), - (0x1D630, 'M', 'o'), - (0x1D631, 'M', 'p'), - (0x1D632, 'M', 'q'), - (0x1D633, 'M', 'r'), - (0x1D634, 'M', 's'), - (0x1D635, 'M', 't'), - (0x1D636, 'M', 'u'), - (0x1D637, 'M', 'v'), - (0x1D638, 'M', 'w'), - (0x1D639, 'M', 'x'), - (0x1D63A, 'M', 'y'), - (0x1D63B, 'M', 'z'), - (0x1D63C, 'M', 'a'), - (0x1D63D, 'M', 'b'), - (0x1D63E, 'M', 'c'), - (0x1D63F, 'M', 'd'), - (0x1D640, 'M', 'e'), - (0x1D641, 'M', 'f'), - (0x1D642, 'M', 'g'), - (0x1D643, 'M', 'h'), - (0x1D644, 'M', 'i'), - (0x1D645, 'M', 'j'), - (0x1D646, 'M', 'k'), - (0x1D647, 'M', 'l'), - (0x1D648, 'M', 'm'), - (0x1D649, 'M', 'n'), - (0x1D64A, 'M', 'o'), - (0x1D64B, 'M', 'p'), - (0x1D64C, 'M', 'q'), - (0x1D64D, 'M', 'r'), - (0x1D64E, 'M', 's'), - (0x1D64F, 'M', 't'), - (0x1D650, 'M', 'u'), - (0x1D651, 'M', 'v'), - (0x1D652, 'M', 'w'), - (0x1D653, 'M', 'x'), - (0x1D654, 'M', 'y'), - (0x1D655, 'M', 'z'), - (0x1D656, 'M', 'a'), - (0x1D657, 'M', 'b'), - (0x1D658, 'M', 'c'), - (0x1D659, 'M', 'd'), - (0x1D65A, 'M', 'e'), - (0x1D65B, 'M', 'f'), - (0x1D65C, 'M', 'g'), - (0x1D65D, 'M', 'h'), - (0x1D65E, 'M', 'i'), - (0x1D65F, 'M', 'j'), - (0x1D660, 'M', 'k'), - (0x1D661, 'M', 'l'), - (0x1D662, 'M', 'm'), - (0x1D663, 'M', 'n'), - (0x1D664, 'M', 'o'), - (0x1D665, 'M', 'p'), - (0x1D666, 'M', 'q'), - (0x1D667, 'M', 'r'), - (0x1D668, 'M', 's'), - (0x1D669, 'M', 't'), - (0x1D66A, 'M', 'u'), - (0x1D66B, 'M', 'v'), - (0x1D66C, 'M', 'w'), - (0x1D66D, 'M', 'x'), - (0x1D66E, 'M', 'y'), - (0x1D66F, 'M', 'z'), - (0x1D670, 'M', 'a'), - (0x1D671, 'M', 'b'), - (0x1D672, 'M', 'c'), - (0x1D673, 'M', 'd'), - (0x1D674, 'M', 'e'), - (0x1D675, 'M', 'f'), - (0x1D676, 'M', 'g'), - (0x1D677, 'M', 'h'), - (0x1D678, 'M', 'i'), - (0x1D679, 'M', 'j'), - (0x1D67A, 'M', 'k'), - (0x1D67B, 'M', 'l'), - (0x1D67C, 'M', 'm'), - (0x1D67D, 'M', 'n'), - (0x1D67E, 'M', 'o'), - (0x1D67F, 'M', 'p'), - (0x1D680, 'M', 'q'), - (0x1D681, 'M', 'r'), - (0x1D682, 'M', 's'), - ] - -def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D683, 'M', 't'), - (0x1D684, 'M', 'u'), - (0x1D685, 'M', 'v'), - (0x1D686, 'M', 'w'), - (0x1D687, 'M', 'x'), - (0x1D688, 'M', 'y'), - (0x1D689, 'M', 'z'), - (0x1D68A, 'M', 'a'), - (0x1D68B, 'M', 'b'), - (0x1D68C, 'M', 'c'), - (0x1D68D, 'M', 'd'), - (0x1D68E, 'M', 'e'), - (0x1D68F, 'M', 'f'), - (0x1D690, 'M', 'g'), - (0x1D691, 'M', 'h'), - (0x1D692, 'M', 'i'), - (0x1D693, 'M', 'j'), - (0x1D694, 'M', 'k'), - (0x1D695, 'M', 'l'), - (0x1D696, 'M', 'm'), - (0x1D697, 'M', 'n'), - (0x1D698, 'M', 'o'), - (0x1D699, 'M', 'p'), - (0x1D69A, 'M', 'q'), - (0x1D69B, 'M', 'r'), - (0x1D69C, 'M', 's'), - (0x1D69D, 'M', 't'), - (0x1D69E, 'M', 'u'), - (0x1D69F, 'M', 'v'), - (0x1D6A0, 'M', 'w'), - (0x1D6A1, 'M', 'x'), - (0x1D6A2, 'M', 'y'), - (0x1D6A3, 'M', 'z'), - (0x1D6A4, 'M', 'ı'), - (0x1D6A5, 'M', 'ȷ'), - (0x1D6A6, 'X'), - (0x1D6A8, 'M', 'α'), - (0x1D6A9, 'M', 'β'), - (0x1D6AA, 'M', 'γ'), - (0x1D6AB, 'M', 'δ'), - (0x1D6AC, 'M', 'ε'), - (0x1D6AD, 'M', 'ζ'), - (0x1D6AE, 'M', 'η'), - (0x1D6AF, 'M', 'θ'), - (0x1D6B0, 'M', 'ι'), - (0x1D6B1, 'M', 'κ'), - (0x1D6B2, 'M', 'λ'), - (0x1D6B3, 'M', 'μ'), - (0x1D6B4, 'M', 'ν'), - (0x1D6B5, 'M', 'ξ'), - (0x1D6B6, 'M', 'ο'), - (0x1D6B7, 'M', 'π'), - (0x1D6B8, 'M', 'ρ'), - (0x1D6B9, 'M', 'θ'), - (0x1D6BA, 'M', 'σ'), - (0x1D6BB, 'M', 'τ'), - (0x1D6BC, 'M', 'υ'), - (0x1D6BD, 'M', 'φ'), - (0x1D6BE, 'M', 'χ'), - (0x1D6BF, 'M', 'ψ'), - (0x1D6C0, 'M', 'ω'), - (0x1D6C1, 'M', '∇'), - (0x1D6C2, 'M', 'α'), - (0x1D6C3, 'M', 'β'), - (0x1D6C4, 'M', 'γ'), - (0x1D6C5, 'M', 'δ'), - (0x1D6C6, 'M', 'ε'), - (0x1D6C7, 'M', 'ζ'), - (0x1D6C8, 'M', 'η'), - (0x1D6C9, 'M', 'θ'), - (0x1D6CA, 'M', 'ι'), - (0x1D6CB, 'M', 'κ'), - (0x1D6CC, 'M', 'λ'), - (0x1D6CD, 'M', 'μ'), - (0x1D6CE, 'M', 'ν'), - (0x1D6CF, 'M', 'ξ'), - (0x1D6D0, 'M', 'ο'), - (0x1D6D1, 'M', 'π'), - (0x1D6D2, 'M', 'ρ'), - (0x1D6D3, 'M', 'σ'), - (0x1D6D5, 'M', 'τ'), - (0x1D6D6, 'M', 'υ'), - (0x1D6D7, 'M', 'φ'), - (0x1D6D8, 'M', 'χ'), - (0x1D6D9, 'M', 'ψ'), - (0x1D6DA, 'M', 'ω'), - (0x1D6DB, 'M', '∂'), - (0x1D6DC, 'M', 'ε'), - (0x1D6DD, 'M', 'θ'), - (0x1D6DE, 'M', 'κ'), - (0x1D6DF, 'M', 'φ'), - (0x1D6E0, 'M', 'ρ'), - (0x1D6E1, 'M', 'π'), - (0x1D6E2, 'M', 'α'), - (0x1D6E3, 'M', 'β'), - (0x1D6E4, 'M', 'γ'), - (0x1D6E5, 'M', 'δ'), - (0x1D6E6, 'M', 'ε'), - (0x1D6E7, 'M', 'ζ'), - (0x1D6E8, 'M', 'η'), - ] - -def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D6E9, 'M', 'θ'), - (0x1D6EA, 'M', 'ι'), - (0x1D6EB, 'M', 'κ'), - (0x1D6EC, 'M', 'λ'), - (0x1D6ED, 'M', 'μ'), - (0x1D6EE, 'M', 'ν'), - (0x1D6EF, 'M', 'ξ'), - (0x1D6F0, 'M', 'ο'), - (0x1D6F1, 'M', 'π'), - (0x1D6F2, 'M', 'ρ'), - (0x1D6F3, 'M', 'θ'), - (0x1D6F4, 'M', 'σ'), - (0x1D6F5, 'M', 'τ'), - (0x1D6F6, 'M', 'υ'), - (0x1D6F7, 'M', 'φ'), - (0x1D6F8, 'M', 'χ'), - (0x1D6F9, 'M', 'ψ'), - (0x1D6FA, 'M', 'ω'), - (0x1D6FB, 'M', '∇'), - (0x1D6FC, 'M', 'α'), - (0x1D6FD, 'M', 'β'), - (0x1D6FE, 'M', 'γ'), - (0x1D6FF, 'M', 'δ'), - (0x1D700, 'M', 'ε'), - (0x1D701, 'M', 'ζ'), - (0x1D702, 'M', 'η'), - (0x1D703, 'M', 'θ'), - (0x1D704, 'M', 'ι'), - (0x1D705, 'M', 'κ'), - (0x1D706, 'M', 'λ'), - (0x1D707, 'M', 'μ'), - (0x1D708, 'M', 'ν'), - (0x1D709, 'M', 'ξ'), - (0x1D70A, 'M', 'ο'), - (0x1D70B, 'M', 'π'), - (0x1D70C, 'M', 'ρ'), - (0x1D70D, 'M', 'σ'), - (0x1D70F, 'M', 'τ'), - (0x1D710, 'M', 'υ'), - (0x1D711, 'M', 'φ'), - (0x1D712, 'M', 'χ'), - (0x1D713, 'M', 'ψ'), - (0x1D714, 'M', 'ω'), - (0x1D715, 'M', '∂'), - (0x1D716, 'M', 'ε'), - (0x1D717, 'M', 'θ'), - (0x1D718, 'M', 'κ'), - (0x1D719, 'M', 'φ'), - (0x1D71A, 'M', 'ρ'), - (0x1D71B, 'M', 'π'), - (0x1D71C, 'M', 'α'), - (0x1D71D, 'M', 'β'), - (0x1D71E, 'M', 'γ'), - (0x1D71F, 'M', 'δ'), - (0x1D720, 'M', 'ε'), - (0x1D721, 'M', 'ζ'), - (0x1D722, 'M', 'η'), - (0x1D723, 'M', 'θ'), - (0x1D724, 'M', 'ι'), - (0x1D725, 'M', 'κ'), - (0x1D726, 'M', 'λ'), - (0x1D727, 'M', 'μ'), - (0x1D728, 'M', 'ν'), - (0x1D729, 'M', 'ξ'), - (0x1D72A, 'M', 'ο'), - (0x1D72B, 'M', 'π'), - (0x1D72C, 'M', 'ρ'), - (0x1D72D, 'M', 'θ'), - (0x1D72E, 'M', 'σ'), - (0x1D72F, 'M', 'τ'), - (0x1D730, 'M', 'υ'), - (0x1D731, 'M', 'φ'), - (0x1D732, 'M', 'χ'), - (0x1D733, 'M', 'ψ'), - (0x1D734, 'M', 'ω'), - (0x1D735, 'M', '∇'), - (0x1D736, 'M', 'α'), - (0x1D737, 'M', 'β'), - (0x1D738, 'M', 'γ'), - (0x1D739, 'M', 'δ'), - (0x1D73A, 'M', 'ε'), - (0x1D73B, 'M', 'ζ'), - (0x1D73C, 'M', 'η'), - (0x1D73D, 'M', 'θ'), - (0x1D73E, 'M', 'ι'), - (0x1D73F, 'M', 'κ'), - (0x1D740, 'M', 'λ'), - (0x1D741, 'M', 'μ'), - (0x1D742, 'M', 'ν'), - (0x1D743, 'M', 'ξ'), - (0x1D744, 'M', 'ο'), - (0x1D745, 'M', 'π'), - (0x1D746, 'M', 'ρ'), - (0x1D747, 'M', 'σ'), - (0x1D749, 'M', 'τ'), - (0x1D74A, 'M', 'υ'), - (0x1D74B, 'M', 'φ'), - (0x1D74C, 'M', 'χ'), - (0x1D74D, 'M', 'ψ'), - (0x1D74E, 'M', 'ω'), - ] - -def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D74F, 'M', '∂'), - (0x1D750, 'M', 'ε'), - (0x1D751, 'M', 'θ'), - (0x1D752, 'M', 'κ'), - (0x1D753, 'M', 'φ'), - (0x1D754, 'M', 'ρ'), - (0x1D755, 'M', 'π'), - (0x1D756, 'M', 'α'), - (0x1D757, 'M', 'β'), - (0x1D758, 'M', 'γ'), - (0x1D759, 'M', 'δ'), - (0x1D75A, 'M', 'ε'), - (0x1D75B, 'M', 'ζ'), - (0x1D75C, 'M', 'η'), - (0x1D75D, 'M', 'θ'), - (0x1D75E, 'M', 'ι'), - (0x1D75F, 'M', 'κ'), - (0x1D760, 'M', 'λ'), - (0x1D761, 'M', 'μ'), - (0x1D762, 'M', 'ν'), - (0x1D763, 'M', 'ξ'), - (0x1D764, 'M', 'ο'), - (0x1D765, 'M', 'π'), - (0x1D766, 'M', 'ρ'), - (0x1D767, 'M', 'θ'), - (0x1D768, 'M', 'σ'), - (0x1D769, 'M', 'τ'), - (0x1D76A, 'M', 'υ'), - (0x1D76B, 'M', 'φ'), - (0x1D76C, 'M', 'χ'), - (0x1D76D, 'M', 'ψ'), - (0x1D76E, 'M', 'ω'), - (0x1D76F, 'M', '∇'), - (0x1D770, 'M', 'α'), - (0x1D771, 'M', 'β'), - (0x1D772, 'M', 'γ'), - (0x1D773, 'M', 'δ'), - (0x1D774, 'M', 'ε'), - (0x1D775, 'M', 'ζ'), - (0x1D776, 'M', 'η'), - (0x1D777, 'M', 'θ'), - (0x1D778, 'M', 'ι'), - (0x1D779, 'M', 'κ'), - (0x1D77A, 'M', 'λ'), - (0x1D77B, 'M', 'μ'), - (0x1D77C, 'M', 'ν'), - (0x1D77D, 'M', 'ξ'), - (0x1D77E, 'M', 'ο'), - (0x1D77F, 'M', 'π'), - (0x1D780, 'M', 'ρ'), - (0x1D781, 'M', 'σ'), - (0x1D783, 'M', 'τ'), - (0x1D784, 'M', 'υ'), - (0x1D785, 'M', 'φ'), - (0x1D786, 'M', 'χ'), - (0x1D787, 'M', 'ψ'), - (0x1D788, 'M', 'ω'), - (0x1D789, 'M', '∂'), - (0x1D78A, 'M', 'ε'), - (0x1D78B, 'M', 'θ'), - (0x1D78C, 'M', 'κ'), - (0x1D78D, 'M', 'φ'), - (0x1D78E, 'M', 'ρ'), - (0x1D78F, 'M', 'π'), - (0x1D790, 'M', 'α'), - (0x1D791, 'M', 'β'), - (0x1D792, 'M', 'γ'), - (0x1D793, 'M', 'δ'), - (0x1D794, 'M', 'ε'), - (0x1D795, 'M', 'ζ'), - (0x1D796, 'M', 'η'), - (0x1D797, 'M', 'θ'), - (0x1D798, 'M', 'ι'), - (0x1D799, 'M', 'κ'), - (0x1D79A, 'M', 'λ'), - (0x1D79B, 'M', 'μ'), - (0x1D79C, 'M', 'ν'), - (0x1D79D, 'M', 'ξ'), - (0x1D79E, 'M', 'ο'), - (0x1D79F, 'M', 'π'), - (0x1D7A0, 'M', 'ρ'), - (0x1D7A1, 'M', 'θ'), - (0x1D7A2, 'M', 'σ'), - (0x1D7A3, 'M', 'τ'), - (0x1D7A4, 'M', 'υ'), - (0x1D7A5, 'M', 'φ'), - (0x1D7A6, 'M', 'χ'), - (0x1D7A7, 'M', 'ψ'), - (0x1D7A8, 'M', 'ω'), - (0x1D7A9, 'M', '∇'), - (0x1D7AA, 'M', 'α'), - (0x1D7AB, 'M', 'β'), - (0x1D7AC, 'M', 'γ'), - (0x1D7AD, 'M', 'δ'), - (0x1D7AE, 'M', 'ε'), - (0x1D7AF, 'M', 'ζ'), - (0x1D7B0, 'M', 'η'), - (0x1D7B1, 'M', 'θ'), - (0x1D7B2, 'M', 'ι'), - (0x1D7B3, 'M', 'κ'), - ] - -def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D7B4, 'M', 'λ'), - (0x1D7B5, 'M', 'μ'), - (0x1D7B6, 'M', 'ν'), - (0x1D7B7, 'M', 'ξ'), - (0x1D7B8, 'M', 'ο'), - (0x1D7B9, 'M', 'π'), - (0x1D7BA, 'M', 'ρ'), - (0x1D7BB, 'M', 'σ'), - (0x1D7BD, 'M', 'τ'), - (0x1D7BE, 'M', 'υ'), - (0x1D7BF, 'M', 'φ'), - (0x1D7C0, 'M', 'χ'), - (0x1D7C1, 'M', 'ψ'), - (0x1D7C2, 'M', 'ω'), - (0x1D7C3, 'M', '∂'), - (0x1D7C4, 'M', 'ε'), - (0x1D7C5, 'M', 'θ'), - (0x1D7C6, 'M', 'κ'), - (0x1D7C7, 'M', 'φ'), - (0x1D7C8, 'M', 'ρ'), - (0x1D7C9, 'M', 'π'), - (0x1D7CA, 'M', 'ϝ'), - (0x1D7CC, 'X'), - (0x1D7CE, 'M', '0'), - (0x1D7CF, 'M', '1'), - (0x1D7D0, 'M', '2'), - (0x1D7D1, 'M', '3'), - (0x1D7D2, 'M', '4'), - (0x1D7D3, 'M', '5'), - (0x1D7D4, 'M', '6'), - (0x1D7D5, 'M', '7'), - (0x1D7D6, 'M', '8'), - (0x1D7D7, 'M', '9'), - (0x1D7D8, 'M', '0'), - (0x1D7D9, 'M', '1'), - (0x1D7DA, 'M', '2'), - (0x1D7DB, 'M', '3'), - (0x1D7DC, 'M', '4'), - (0x1D7DD, 'M', '5'), - (0x1D7DE, 'M', '6'), - (0x1D7DF, 'M', '7'), - (0x1D7E0, 'M', '8'), - (0x1D7E1, 'M', '9'), - (0x1D7E2, 'M', '0'), - (0x1D7E3, 'M', '1'), - (0x1D7E4, 'M', '2'), - (0x1D7E5, 'M', '3'), - (0x1D7E6, 'M', '4'), - (0x1D7E7, 'M', '5'), - (0x1D7E8, 'M', '6'), - (0x1D7E9, 'M', '7'), - (0x1D7EA, 'M', '8'), - (0x1D7EB, 'M', '9'), - (0x1D7EC, 'M', '0'), - (0x1D7ED, 'M', '1'), - (0x1D7EE, 'M', '2'), - (0x1D7EF, 'M', '3'), - (0x1D7F0, 'M', '4'), - (0x1D7F1, 'M', '5'), - (0x1D7F2, 'M', '6'), - (0x1D7F3, 'M', '7'), - (0x1D7F4, 'M', '8'), - (0x1D7F5, 'M', '9'), - (0x1D7F6, 'M', '0'), - (0x1D7F7, 'M', '1'), - (0x1D7F8, 'M', '2'), - (0x1D7F9, 'M', '3'), - (0x1D7FA, 'M', '4'), - (0x1D7FB, 'M', '5'), - (0x1D7FC, 'M', '6'), - (0x1D7FD, 'M', '7'), - (0x1D7FE, 'M', '8'), - (0x1D7FF, 'M', '9'), - (0x1D800, 'V'), - (0x1DA8C, 'X'), - (0x1DA9B, 'V'), - (0x1DAA0, 'X'), - (0x1DAA1, 'V'), - (0x1DAB0, 'X'), - (0x1DF00, 'V'), - (0x1DF1F, 'X'), - (0x1DF25, 'V'), - (0x1DF2B, 'X'), - (0x1E000, 'V'), - (0x1E007, 'X'), - (0x1E008, 'V'), - (0x1E019, 'X'), - (0x1E01B, 'V'), - (0x1E022, 'X'), - (0x1E023, 'V'), - (0x1E025, 'X'), - (0x1E026, 'V'), - (0x1E02B, 'X'), - (0x1E030, 'M', 'а'), - (0x1E031, 'M', 'б'), - (0x1E032, 'M', 'в'), - (0x1E033, 'M', 'г'), - (0x1E034, 'M', 'д'), - (0x1E035, 'M', 'е'), - (0x1E036, 'M', 'ж'), - ] - -def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E037, 'M', 'з'), - (0x1E038, 'M', 'и'), - (0x1E039, 'M', 'к'), - (0x1E03A, 'M', 'л'), - (0x1E03B, 'M', 'м'), - (0x1E03C, 'M', 'о'), - (0x1E03D, 'M', 'п'), - (0x1E03E, 'M', 'р'), - (0x1E03F, 'M', 'с'), - (0x1E040, 'M', 'т'), - (0x1E041, 'M', 'у'), - (0x1E042, 'M', 'ф'), - (0x1E043, 'M', 'х'), - (0x1E044, 'M', 'ц'), - (0x1E045, 'M', 'ч'), - (0x1E046, 'M', 'ш'), - (0x1E047, 'M', 'ы'), - (0x1E048, 'M', 'э'), - (0x1E049, 'M', 'ю'), - (0x1E04A, 'M', 'ꚉ'), - (0x1E04B, 'M', 'ә'), - (0x1E04C, 'M', 'і'), - (0x1E04D, 'M', 'ј'), - (0x1E04E, 'M', 'ө'), - (0x1E04F, 'M', 'ү'), - (0x1E050, 'M', 'ӏ'), - (0x1E051, 'M', 'а'), - (0x1E052, 'M', 'б'), - (0x1E053, 'M', 'в'), - (0x1E054, 'M', 'г'), - (0x1E055, 'M', 'д'), - (0x1E056, 'M', 'е'), - (0x1E057, 'M', 'ж'), - (0x1E058, 'M', 'з'), - (0x1E059, 'M', 'и'), - (0x1E05A, 'M', 'к'), - (0x1E05B, 'M', 'л'), - (0x1E05C, 'M', 'о'), - (0x1E05D, 'M', 'п'), - (0x1E05E, 'M', 'с'), - (0x1E05F, 'M', 'у'), - (0x1E060, 'M', 'ф'), - (0x1E061, 'M', 'х'), - (0x1E062, 'M', 'ц'), - (0x1E063, 'M', 'ч'), - (0x1E064, 'M', 'ш'), - (0x1E065, 'M', 'ъ'), - (0x1E066, 'M', 'ы'), - (0x1E067, 'M', 'ґ'), - (0x1E068, 'M', 'і'), - (0x1E069, 'M', 'ѕ'), - (0x1E06A, 'M', 'џ'), - (0x1E06B, 'M', 'ҫ'), - (0x1E06C, 'M', 'ꙑ'), - (0x1E06D, 'M', 'ұ'), - (0x1E06E, 'X'), - (0x1E08F, 'V'), - (0x1E090, 'X'), - (0x1E100, 'V'), - (0x1E12D, 'X'), - (0x1E130, 'V'), - (0x1E13E, 'X'), - (0x1E140, 'V'), - (0x1E14A, 'X'), - (0x1E14E, 'V'), - (0x1E150, 'X'), - (0x1E290, 'V'), - (0x1E2AF, 'X'), - (0x1E2C0, 'V'), - (0x1E2FA, 'X'), - (0x1E2FF, 'V'), - (0x1E300, 'X'), - (0x1E4D0, 'V'), - (0x1E4FA, 'X'), - (0x1E7E0, 'V'), - (0x1E7E7, 'X'), - (0x1E7E8, 'V'), - (0x1E7EC, 'X'), - (0x1E7ED, 'V'), - (0x1E7EF, 'X'), - (0x1E7F0, 'V'), - (0x1E7FF, 'X'), - (0x1E800, 'V'), - (0x1E8C5, 'X'), - (0x1E8C7, 'V'), - (0x1E8D7, 'X'), - (0x1E900, 'M', '𞤢'), - (0x1E901, 'M', '𞤣'), - (0x1E902, 'M', '𞤤'), - (0x1E903, 'M', '𞤥'), - (0x1E904, 'M', '𞤦'), - (0x1E905, 'M', '𞤧'), - (0x1E906, 'M', '𞤨'), - (0x1E907, 'M', '𞤩'), - (0x1E908, 'M', '𞤪'), - (0x1E909, 'M', '𞤫'), - (0x1E90A, 'M', '𞤬'), - (0x1E90B, 'M', '𞤭'), - (0x1E90C, 'M', '𞤮'), - (0x1E90D, 'M', '𞤯'), - ] - -def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E90E, 'M', '𞤰'), - (0x1E90F, 'M', '𞤱'), - (0x1E910, 'M', '𞤲'), - (0x1E911, 'M', '𞤳'), - (0x1E912, 'M', '𞤴'), - (0x1E913, 'M', '𞤵'), - (0x1E914, 'M', '𞤶'), - (0x1E915, 'M', '𞤷'), - (0x1E916, 'M', '𞤸'), - (0x1E917, 'M', '𞤹'), - (0x1E918, 'M', '𞤺'), - (0x1E919, 'M', '𞤻'), - (0x1E91A, 'M', '𞤼'), - (0x1E91B, 'M', '𞤽'), - (0x1E91C, 'M', '𞤾'), - (0x1E91D, 'M', '𞤿'), - (0x1E91E, 'M', '𞥀'), - (0x1E91F, 'M', '𞥁'), - (0x1E920, 'M', '𞥂'), - (0x1E921, 'M', '𞥃'), - (0x1E922, 'V'), - (0x1E94C, 'X'), - (0x1E950, 'V'), - (0x1E95A, 'X'), - (0x1E95E, 'V'), - (0x1E960, 'X'), - (0x1EC71, 'V'), - (0x1ECB5, 'X'), - (0x1ED01, 'V'), - (0x1ED3E, 'X'), - (0x1EE00, 'M', 'ا'), - (0x1EE01, 'M', 'ب'), - (0x1EE02, 'M', 'ج'), - (0x1EE03, 'M', 'د'), - (0x1EE04, 'X'), - (0x1EE05, 'M', 'و'), - (0x1EE06, 'M', 'ز'), - (0x1EE07, 'M', 'ح'), - (0x1EE08, 'M', 'ط'), - (0x1EE09, 'M', 'ي'), - (0x1EE0A, 'M', 'ك'), - (0x1EE0B, 'M', 'ل'), - (0x1EE0C, 'M', 'م'), - (0x1EE0D, 'M', 'ن'), - (0x1EE0E, 'M', 'س'), - (0x1EE0F, 'M', 'ع'), - (0x1EE10, 'M', 'ف'), - (0x1EE11, 'M', 'ص'), - (0x1EE12, 'M', 'ق'), - (0x1EE13, 'M', 'ر'), - (0x1EE14, 'M', 'ش'), - (0x1EE15, 'M', 'ت'), - (0x1EE16, 'M', 'ث'), - (0x1EE17, 'M', 'خ'), - (0x1EE18, 'M', 'ذ'), - (0x1EE19, 'M', 'ض'), - (0x1EE1A, 'M', 'ظ'), - (0x1EE1B, 'M', 'غ'), - (0x1EE1C, 'M', 'ٮ'), - (0x1EE1D, 'M', 'ں'), - (0x1EE1E, 'M', 'ڡ'), - (0x1EE1F, 'M', 'ٯ'), - (0x1EE20, 'X'), - (0x1EE21, 'M', 'ب'), - (0x1EE22, 'M', 'ج'), - (0x1EE23, 'X'), - (0x1EE24, 'M', 'ه'), - (0x1EE25, 'X'), - (0x1EE27, 'M', 'ح'), - (0x1EE28, 'X'), - (0x1EE29, 'M', 'ي'), - (0x1EE2A, 'M', 'ك'), - (0x1EE2B, 'M', 'ل'), - (0x1EE2C, 'M', 'م'), - (0x1EE2D, 'M', 'ن'), - (0x1EE2E, 'M', 'س'), - (0x1EE2F, 'M', 'ع'), - (0x1EE30, 'M', 'ف'), - (0x1EE31, 'M', 'ص'), - (0x1EE32, 'M', 'ق'), - (0x1EE33, 'X'), - (0x1EE34, 'M', 'ش'), - (0x1EE35, 'M', 'ت'), - (0x1EE36, 'M', 'ث'), - (0x1EE37, 'M', 'خ'), - (0x1EE38, 'X'), - (0x1EE39, 'M', 'ض'), - (0x1EE3A, 'X'), - (0x1EE3B, 'M', 'غ'), - (0x1EE3C, 'X'), - (0x1EE42, 'M', 'ج'), - (0x1EE43, 'X'), - (0x1EE47, 'M', 'ح'), - (0x1EE48, 'X'), - (0x1EE49, 'M', 'ي'), - (0x1EE4A, 'X'), - (0x1EE4B, 'M', 'ل'), - (0x1EE4C, 'X'), - (0x1EE4D, 'M', 'ن'), - (0x1EE4E, 'M', 'س'), - ] - -def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1EE4F, 'M', 'ع'), - (0x1EE50, 'X'), - (0x1EE51, 'M', 'ص'), - (0x1EE52, 'M', 'ق'), - (0x1EE53, 'X'), - (0x1EE54, 'M', 'ش'), - (0x1EE55, 'X'), - (0x1EE57, 'M', 'خ'), - (0x1EE58, 'X'), - (0x1EE59, 'M', 'ض'), - (0x1EE5A, 'X'), - (0x1EE5B, 'M', 'غ'), - (0x1EE5C, 'X'), - (0x1EE5D, 'M', 'ں'), - (0x1EE5E, 'X'), - (0x1EE5F, 'M', 'ٯ'), - (0x1EE60, 'X'), - (0x1EE61, 'M', 'ب'), - (0x1EE62, 'M', 'ج'), - (0x1EE63, 'X'), - (0x1EE64, 'M', 'ه'), - (0x1EE65, 'X'), - (0x1EE67, 'M', 'ح'), - (0x1EE68, 'M', 'ط'), - (0x1EE69, 'M', 'ي'), - (0x1EE6A, 'M', 'ك'), - (0x1EE6B, 'X'), - (0x1EE6C, 'M', 'م'), - (0x1EE6D, 'M', 'ن'), - (0x1EE6E, 'M', 'س'), - (0x1EE6F, 'M', 'ع'), - (0x1EE70, 'M', 'ف'), - (0x1EE71, 'M', 'ص'), - (0x1EE72, 'M', 'ق'), - (0x1EE73, 'X'), - (0x1EE74, 'M', 'ش'), - (0x1EE75, 'M', 'ت'), - (0x1EE76, 'M', 'ث'), - (0x1EE77, 'M', 'خ'), - (0x1EE78, 'X'), - (0x1EE79, 'M', 'ض'), - (0x1EE7A, 'M', 'ظ'), - (0x1EE7B, 'M', 'غ'), - (0x1EE7C, 'M', 'ٮ'), - (0x1EE7D, 'X'), - (0x1EE7E, 'M', 'ڡ'), - (0x1EE7F, 'X'), - (0x1EE80, 'M', 'ا'), - (0x1EE81, 'M', 'ب'), - (0x1EE82, 'M', 'ج'), - (0x1EE83, 'M', 'د'), - (0x1EE84, 'M', 'ه'), - (0x1EE85, 'M', 'و'), - (0x1EE86, 'M', 'ز'), - (0x1EE87, 'M', 'ح'), - (0x1EE88, 'M', 'ط'), - (0x1EE89, 'M', 'ي'), - (0x1EE8A, 'X'), - (0x1EE8B, 'M', 'ل'), - (0x1EE8C, 'M', 'م'), - (0x1EE8D, 'M', 'ن'), - (0x1EE8E, 'M', 'س'), - (0x1EE8F, 'M', 'ع'), - (0x1EE90, 'M', 'ف'), - (0x1EE91, 'M', 'ص'), - (0x1EE92, 'M', 'ق'), - (0x1EE93, 'M', 'ر'), - (0x1EE94, 'M', 'ش'), - (0x1EE95, 'M', 'ت'), - (0x1EE96, 'M', 'ث'), - (0x1EE97, 'M', 'خ'), - (0x1EE98, 'M', 'ذ'), - (0x1EE99, 'M', 'ض'), - (0x1EE9A, 'M', 'ظ'), - (0x1EE9B, 'M', 'غ'), - (0x1EE9C, 'X'), - (0x1EEA1, 'M', 'ب'), - (0x1EEA2, 'M', 'ج'), - (0x1EEA3, 'M', 'د'), - (0x1EEA4, 'X'), - (0x1EEA5, 'M', 'و'), - (0x1EEA6, 'M', 'ز'), - (0x1EEA7, 'M', 'ح'), - (0x1EEA8, 'M', 'ط'), - (0x1EEA9, 'M', 'ي'), - (0x1EEAA, 'X'), - (0x1EEAB, 'M', 'ل'), - (0x1EEAC, 'M', 'م'), - (0x1EEAD, 'M', 'ن'), - (0x1EEAE, 'M', 'س'), - (0x1EEAF, 'M', 'ع'), - (0x1EEB0, 'M', 'ف'), - (0x1EEB1, 'M', 'ص'), - (0x1EEB2, 'M', 'ق'), - (0x1EEB3, 'M', 'ر'), - (0x1EEB4, 'M', 'ش'), - (0x1EEB5, 'M', 'ت'), - (0x1EEB6, 'M', 'ث'), - (0x1EEB7, 'M', 'خ'), - (0x1EEB8, 'M', 'ذ'), - ] - -def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1EEB9, 'M', 'ض'), - (0x1EEBA, 'M', 'ظ'), - (0x1EEBB, 'M', 'غ'), - (0x1EEBC, 'X'), - (0x1EEF0, 'V'), - (0x1EEF2, 'X'), - (0x1F000, 'V'), - (0x1F02C, 'X'), - (0x1F030, 'V'), - (0x1F094, 'X'), - (0x1F0A0, 'V'), - (0x1F0AF, 'X'), - (0x1F0B1, 'V'), - (0x1F0C0, 'X'), - (0x1F0C1, 'V'), - (0x1F0D0, 'X'), - (0x1F0D1, 'V'), - (0x1F0F6, 'X'), - (0x1F101, '3', '0,'), - (0x1F102, '3', '1,'), - (0x1F103, '3', '2,'), - (0x1F104, '3', '3,'), - (0x1F105, '3', '4,'), - (0x1F106, '3', '5,'), - (0x1F107, '3', '6,'), - (0x1F108, '3', '7,'), - (0x1F109, '3', '8,'), - (0x1F10A, '3', '9,'), - (0x1F10B, 'V'), - (0x1F110, '3', '(a)'), - (0x1F111, '3', '(b)'), - (0x1F112, '3', '(c)'), - (0x1F113, '3', '(d)'), - (0x1F114, '3', '(e)'), - (0x1F115, '3', '(f)'), - (0x1F116, '3', '(g)'), - (0x1F117, '3', '(h)'), - (0x1F118, '3', '(i)'), - (0x1F119, '3', '(j)'), - (0x1F11A, '3', '(k)'), - (0x1F11B, '3', '(l)'), - (0x1F11C, '3', '(m)'), - (0x1F11D, '3', '(n)'), - (0x1F11E, '3', '(o)'), - (0x1F11F, '3', '(p)'), - (0x1F120, '3', '(q)'), - (0x1F121, '3', '(r)'), - (0x1F122, '3', '(s)'), - (0x1F123, '3', '(t)'), - (0x1F124, '3', '(u)'), - (0x1F125, '3', '(v)'), - (0x1F126, '3', '(w)'), - (0x1F127, '3', '(x)'), - (0x1F128, '3', '(y)'), - (0x1F129, '3', '(z)'), - (0x1F12A, 'M', '〔s〕'), - (0x1F12B, 'M', 'c'), - (0x1F12C, 'M', 'r'), - (0x1F12D, 'M', 'cd'), - (0x1F12E, 'M', 'wz'), - (0x1F12F, 'V'), - (0x1F130, 'M', 'a'), - (0x1F131, 'M', 'b'), - (0x1F132, 'M', 'c'), - (0x1F133, 'M', 'd'), - (0x1F134, 'M', 'e'), - (0x1F135, 'M', 'f'), - (0x1F136, 'M', 'g'), - (0x1F137, 'M', 'h'), - (0x1F138, 'M', 'i'), - (0x1F139, 'M', 'j'), - (0x1F13A, 'M', 'k'), - (0x1F13B, 'M', 'l'), - (0x1F13C, 'M', 'm'), - (0x1F13D, 'M', 'n'), - (0x1F13E, 'M', 'o'), - (0x1F13F, 'M', 'p'), - (0x1F140, 'M', 'q'), - (0x1F141, 'M', 'r'), - (0x1F142, 'M', 's'), - (0x1F143, 'M', 't'), - (0x1F144, 'M', 'u'), - (0x1F145, 'M', 'v'), - (0x1F146, 'M', 'w'), - (0x1F147, 'M', 'x'), - (0x1F148, 'M', 'y'), - (0x1F149, 'M', 'z'), - (0x1F14A, 'M', 'hv'), - (0x1F14B, 'M', 'mv'), - (0x1F14C, 'M', 'sd'), - (0x1F14D, 'M', 'ss'), - (0x1F14E, 'M', 'ppv'), - (0x1F14F, 'M', 'wc'), - (0x1F150, 'V'), - (0x1F16A, 'M', 'mc'), - (0x1F16B, 'M', 'md'), - (0x1F16C, 'M', 'mr'), - (0x1F16D, 'V'), - (0x1F190, 'M', 'dj'), - (0x1F191, 'V'), - ] - -def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1F1AE, 'X'), - (0x1F1E6, 'V'), - (0x1F200, 'M', 'ほか'), - (0x1F201, 'M', 'ココ'), - (0x1F202, 'M', 'サ'), - (0x1F203, 'X'), - (0x1F210, 'M', '手'), - (0x1F211, 'M', '字'), - (0x1F212, 'M', '双'), - (0x1F213, 'M', 'デ'), - (0x1F214, 'M', '二'), - (0x1F215, 'M', '多'), - (0x1F216, 'M', '解'), - (0x1F217, 'M', '天'), - (0x1F218, 'M', '交'), - (0x1F219, 'M', '映'), - (0x1F21A, 'M', '無'), - (0x1F21B, 'M', '料'), - (0x1F21C, 'M', '前'), - (0x1F21D, 'M', '後'), - (0x1F21E, 'M', '再'), - (0x1F21F, 'M', '新'), - (0x1F220, 'M', '初'), - (0x1F221, 'M', '終'), - (0x1F222, 'M', '生'), - (0x1F223, 'M', '販'), - (0x1F224, 'M', '声'), - (0x1F225, 'M', '吹'), - (0x1F226, 'M', '演'), - (0x1F227, 'M', '投'), - (0x1F228, 'M', '捕'), - (0x1F229, 'M', '一'), - (0x1F22A, 'M', '三'), - (0x1F22B, 'M', '遊'), - (0x1F22C, 'M', '左'), - (0x1F22D, 'M', '中'), - (0x1F22E, 'M', '右'), - (0x1F22F, 'M', '指'), - (0x1F230, 'M', '走'), - (0x1F231, 'M', '打'), - (0x1F232, 'M', '禁'), - (0x1F233, 'M', '空'), - (0x1F234, 'M', '合'), - (0x1F235, 'M', '満'), - (0x1F236, 'M', '有'), - (0x1F237, 'M', '月'), - (0x1F238, 'M', '申'), - (0x1F239, 'M', '割'), - (0x1F23A, 'M', '営'), - (0x1F23B, 'M', '配'), - (0x1F23C, 'X'), - (0x1F240, 'M', '〔本〕'), - (0x1F241, 'M', '〔三〕'), - (0x1F242, 'M', '〔二〕'), - (0x1F243, 'M', '〔安〕'), - (0x1F244, 'M', '〔点〕'), - (0x1F245, 'M', '〔打〕'), - (0x1F246, 'M', '〔盗〕'), - (0x1F247, 'M', '〔勝〕'), - (0x1F248, 'M', '〔敗〕'), - (0x1F249, 'X'), - (0x1F250, 'M', '得'), - (0x1F251, 'M', '可'), - (0x1F252, 'X'), - (0x1F260, 'V'), - (0x1F266, 'X'), - (0x1F300, 'V'), - (0x1F6D8, 'X'), - (0x1F6DC, 'V'), - (0x1F6ED, 'X'), - (0x1F6F0, 'V'), - (0x1F6FD, 'X'), - (0x1F700, 'V'), - (0x1F777, 'X'), - (0x1F77B, 'V'), - (0x1F7DA, 'X'), - (0x1F7E0, 'V'), - (0x1F7EC, 'X'), - (0x1F7F0, 'V'), - (0x1F7F1, 'X'), - (0x1F800, 'V'), - (0x1F80C, 'X'), - (0x1F810, 'V'), - (0x1F848, 'X'), - (0x1F850, 'V'), - (0x1F85A, 'X'), - (0x1F860, 'V'), - (0x1F888, 'X'), - (0x1F890, 'V'), - (0x1F8AE, 'X'), - (0x1F8B0, 'V'), - (0x1F8B2, 'X'), - (0x1F900, 'V'), - (0x1FA54, 'X'), - (0x1FA60, 'V'), - (0x1FA6E, 'X'), - (0x1FA70, 'V'), - (0x1FA7D, 'X'), - (0x1FA80, 'V'), - (0x1FA89, 'X'), - ] - -def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1FA90, 'V'), - (0x1FABE, 'X'), - (0x1FABF, 'V'), - (0x1FAC6, 'X'), - (0x1FACE, 'V'), - (0x1FADC, 'X'), - (0x1FAE0, 'V'), - (0x1FAE9, 'X'), - (0x1FAF0, 'V'), - (0x1FAF9, 'X'), - (0x1FB00, 'V'), - (0x1FB93, 'X'), - (0x1FB94, 'V'), - (0x1FBCB, 'X'), - (0x1FBF0, 'M', '0'), - (0x1FBF1, 'M', '1'), - (0x1FBF2, 'M', '2'), - (0x1FBF3, 'M', '3'), - (0x1FBF4, 'M', '4'), - (0x1FBF5, 'M', '5'), - (0x1FBF6, 'M', '6'), - (0x1FBF7, 'M', '7'), - (0x1FBF8, 'M', '8'), - (0x1FBF9, 'M', '9'), - (0x1FBFA, 'X'), - (0x20000, 'V'), - (0x2A6E0, 'X'), - (0x2A700, 'V'), - (0x2B73A, 'X'), - (0x2B740, 'V'), - (0x2B81E, 'X'), - (0x2B820, 'V'), - (0x2CEA2, 'X'), - (0x2CEB0, 'V'), - (0x2EBE1, 'X'), - (0x2EBF0, 'V'), - (0x2EE5E, 'X'), - (0x2F800, 'M', '丽'), - (0x2F801, 'M', '丸'), - (0x2F802, 'M', '乁'), - (0x2F803, 'M', '𠄢'), - (0x2F804, 'M', '你'), - (0x2F805, 'M', '侮'), - (0x2F806, 'M', '侻'), - (0x2F807, 'M', '倂'), - (0x2F808, 'M', '偺'), - (0x2F809, 'M', '備'), - (0x2F80A, 'M', '僧'), - (0x2F80B, 'M', '像'), - (0x2F80C, 'M', '㒞'), - (0x2F80D, 'M', '𠘺'), - (0x2F80E, 'M', '免'), - (0x2F80F, 'M', '兔'), - (0x2F810, 'M', '兤'), - (0x2F811, 'M', '具'), - (0x2F812, 'M', '𠔜'), - (0x2F813, 'M', '㒹'), - (0x2F814, 'M', '內'), - (0x2F815, 'M', '再'), - (0x2F816, 'M', '𠕋'), - (0x2F817, 'M', '冗'), - (0x2F818, 'M', '冤'), - (0x2F819, 'M', '仌'), - (0x2F81A, 'M', '冬'), - (0x2F81B, 'M', '况'), - (0x2F81C, 'M', '𩇟'), - (0x2F81D, 'M', '凵'), - (0x2F81E, 'M', '刃'), - (0x2F81F, 'M', '㓟'), - (0x2F820, 'M', '刻'), - (0x2F821, 'M', '剆'), - (0x2F822, 'M', '割'), - (0x2F823, 'M', '剷'), - (0x2F824, 'M', '㔕'), - (0x2F825, 'M', '勇'), - (0x2F826, 'M', '勉'), - (0x2F827, 'M', '勤'), - (0x2F828, 'M', '勺'), - (0x2F829, 'M', '包'), - (0x2F82A, 'M', '匆'), - (0x2F82B, 'M', '北'), - (0x2F82C, 'M', '卉'), - (0x2F82D, 'M', '卑'), - (0x2F82E, 'M', '博'), - (0x2F82F, 'M', '即'), - (0x2F830, 'M', '卽'), - (0x2F831, 'M', '卿'), - (0x2F834, 'M', '𠨬'), - (0x2F835, 'M', '灰'), - (0x2F836, 'M', '及'), - (0x2F837, 'M', '叟'), - (0x2F838, 'M', '𠭣'), - (0x2F839, 'M', '叫'), - (0x2F83A, 'M', '叱'), - (0x2F83B, 'M', '吆'), - (0x2F83C, 'M', '咞'), - (0x2F83D, 'M', '吸'), - (0x2F83E, 'M', '呈'), - (0x2F83F, 'M', '周'), - (0x2F840, 'M', '咢'), - ] - -def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F841, 'M', '哶'), - (0x2F842, 'M', '唐'), - (0x2F843, 'M', '啓'), - (0x2F844, 'M', '啣'), - (0x2F845, 'M', '善'), - (0x2F847, 'M', '喙'), - (0x2F848, 'M', '喫'), - (0x2F849, 'M', '喳'), - (0x2F84A, 'M', '嗂'), - (0x2F84B, 'M', '圖'), - (0x2F84C, 'M', '嘆'), - (0x2F84D, 'M', '圗'), - (0x2F84E, 'M', '噑'), - (0x2F84F, 'M', '噴'), - (0x2F850, 'M', '切'), - (0x2F851, 'M', '壮'), - (0x2F852, 'M', '城'), - (0x2F853, 'M', '埴'), - (0x2F854, 'M', '堍'), - (0x2F855, 'M', '型'), - (0x2F856, 'M', '堲'), - (0x2F857, 'M', '報'), - (0x2F858, 'M', '墬'), - (0x2F859, 'M', '𡓤'), - (0x2F85A, 'M', '売'), - (0x2F85B, 'M', '壷'), - (0x2F85C, 'M', '夆'), - (0x2F85D, 'M', '多'), - (0x2F85E, 'M', '夢'), - (0x2F85F, 'M', '奢'), - (0x2F860, 'M', '𡚨'), - (0x2F861, 'M', '𡛪'), - (0x2F862, 'M', '姬'), - (0x2F863, 'M', '娛'), - (0x2F864, 'M', '娧'), - (0x2F865, 'M', '姘'), - (0x2F866, 'M', '婦'), - (0x2F867, 'M', '㛮'), - (0x2F868, 'X'), - (0x2F869, 'M', '嬈'), - (0x2F86A, 'M', '嬾'), - (0x2F86C, 'M', '𡧈'), - (0x2F86D, 'M', '寃'), - (0x2F86E, 'M', '寘'), - (0x2F86F, 'M', '寧'), - (0x2F870, 'M', '寳'), - (0x2F871, 'M', '𡬘'), - (0x2F872, 'M', '寿'), - (0x2F873, 'M', '将'), - (0x2F874, 'X'), - (0x2F875, 'M', '尢'), - (0x2F876, 'M', '㞁'), - (0x2F877, 'M', '屠'), - (0x2F878, 'M', '屮'), - (0x2F879, 'M', '峀'), - (0x2F87A, 'M', '岍'), - (0x2F87B, 'M', '𡷤'), - (0x2F87C, 'M', '嵃'), - (0x2F87D, 'M', '𡷦'), - (0x2F87E, 'M', '嵮'), - (0x2F87F, 'M', '嵫'), - (0x2F880, 'M', '嵼'), - (0x2F881, 'M', '巡'), - (0x2F882, 'M', '巢'), - (0x2F883, 'M', '㠯'), - (0x2F884, 'M', '巽'), - (0x2F885, 'M', '帨'), - (0x2F886, 'M', '帽'), - (0x2F887, 'M', '幩'), - (0x2F888, 'M', '㡢'), - (0x2F889, 'M', '𢆃'), - (0x2F88A, 'M', '㡼'), - (0x2F88B, 'M', '庰'), - (0x2F88C, 'M', '庳'), - (0x2F88D, 'M', '庶'), - (0x2F88E, 'M', '廊'), - (0x2F88F, 'M', '𪎒'), - (0x2F890, 'M', '廾'), - (0x2F891, 'M', '𢌱'), - (0x2F893, 'M', '舁'), - (0x2F894, 'M', '弢'), - (0x2F896, 'M', '㣇'), - (0x2F897, 'M', '𣊸'), - (0x2F898, 'M', '𦇚'), - (0x2F899, 'M', '形'), - (0x2F89A, 'M', '彫'), - (0x2F89B, 'M', '㣣'), - (0x2F89C, 'M', '徚'), - (0x2F89D, 'M', '忍'), - (0x2F89E, 'M', '志'), - (0x2F89F, 'M', '忹'), - (0x2F8A0, 'M', '悁'), - (0x2F8A1, 'M', '㤺'), - (0x2F8A2, 'M', '㤜'), - (0x2F8A3, 'M', '悔'), - (0x2F8A4, 'M', '𢛔'), - (0x2F8A5, 'M', '惇'), - (0x2F8A6, 'M', '慈'), - (0x2F8A7, 'M', '慌'), - (0x2F8A8, 'M', '慎'), - ] - -def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F8A9, 'M', '慌'), - (0x2F8AA, 'M', '慺'), - (0x2F8AB, 'M', '憎'), - (0x2F8AC, 'M', '憲'), - (0x2F8AD, 'M', '憤'), - (0x2F8AE, 'M', '憯'), - (0x2F8AF, 'M', '懞'), - (0x2F8B0, 'M', '懲'), - (0x2F8B1, 'M', '懶'), - (0x2F8B2, 'M', '成'), - (0x2F8B3, 'M', '戛'), - (0x2F8B4, 'M', '扝'), - (0x2F8B5, 'M', '抱'), - (0x2F8B6, 'M', '拔'), - (0x2F8B7, 'M', '捐'), - (0x2F8B8, 'M', '𢬌'), - (0x2F8B9, 'M', '挽'), - (0x2F8BA, 'M', '拼'), - (0x2F8BB, 'M', '捨'), - (0x2F8BC, 'M', '掃'), - (0x2F8BD, 'M', '揤'), - (0x2F8BE, 'M', '𢯱'), - (0x2F8BF, 'M', '搢'), - (0x2F8C0, 'M', '揅'), - (0x2F8C1, 'M', '掩'), - (0x2F8C2, 'M', '㨮'), - (0x2F8C3, 'M', '摩'), - (0x2F8C4, 'M', '摾'), - (0x2F8C5, 'M', '撝'), - (0x2F8C6, 'M', '摷'), - (0x2F8C7, 'M', '㩬'), - (0x2F8C8, 'M', '敏'), - (0x2F8C9, 'M', '敬'), - (0x2F8CA, 'M', '𣀊'), - (0x2F8CB, 'M', '旣'), - (0x2F8CC, 'M', '書'), - (0x2F8CD, 'M', '晉'), - (0x2F8CE, 'M', '㬙'), - (0x2F8CF, 'M', '暑'), - (0x2F8D0, 'M', '㬈'), - (0x2F8D1, 'M', '㫤'), - (0x2F8D2, 'M', '冒'), - (0x2F8D3, 'M', '冕'), - (0x2F8D4, 'M', '最'), - (0x2F8D5, 'M', '暜'), - (0x2F8D6, 'M', '肭'), - (0x2F8D7, 'M', '䏙'), - (0x2F8D8, 'M', '朗'), - (0x2F8D9, 'M', '望'), - (0x2F8DA, 'M', '朡'), - (0x2F8DB, 'M', '杞'), - (0x2F8DC, 'M', '杓'), - (0x2F8DD, 'M', '𣏃'), - (0x2F8DE, 'M', '㭉'), - (0x2F8DF, 'M', '柺'), - (0x2F8E0, 'M', '枅'), - (0x2F8E1, 'M', '桒'), - (0x2F8E2, 'M', '梅'), - (0x2F8E3, 'M', '𣑭'), - (0x2F8E4, 'M', '梎'), - (0x2F8E5, 'M', '栟'), - (0x2F8E6, 'M', '椔'), - (0x2F8E7, 'M', '㮝'), - (0x2F8E8, 'M', '楂'), - (0x2F8E9, 'M', '榣'), - (0x2F8EA, 'M', '槪'), - (0x2F8EB, 'M', '檨'), - (0x2F8EC, 'M', '𣚣'), - (0x2F8ED, 'M', '櫛'), - (0x2F8EE, 'M', '㰘'), - (0x2F8EF, 'M', '次'), - (0x2F8F0, 'M', '𣢧'), - (0x2F8F1, 'M', '歔'), - (0x2F8F2, 'M', '㱎'), - (0x2F8F3, 'M', '歲'), - (0x2F8F4, 'M', '殟'), - (0x2F8F5, 'M', '殺'), - (0x2F8F6, 'M', '殻'), - (0x2F8F7, 'M', '𣪍'), - (0x2F8F8, 'M', '𡴋'), - (0x2F8F9, 'M', '𣫺'), - (0x2F8FA, 'M', '汎'), - (0x2F8FB, 'M', '𣲼'), - (0x2F8FC, 'M', '沿'), - (0x2F8FD, 'M', '泍'), - (0x2F8FE, 'M', '汧'), - (0x2F8FF, 'M', '洖'), - (0x2F900, 'M', '派'), - (0x2F901, 'M', '海'), - (0x2F902, 'M', '流'), - (0x2F903, 'M', '浩'), - (0x2F904, 'M', '浸'), - (0x2F905, 'M', '涅'), - (0x2F906, 'M', '𣴞'), - (0x2F907, 'M', '洴'), - (0x2F908, 'M', '港'), - (0x2F909, 'M', '湮'), - (0x2F90A, 'M', '㴳'), - (0x2F90B, 'M', '滋'), - (0x2F90C, 'M', '滇'), - ] - -def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F90D, 'M', '𣻑'), - (0x2F90E, 'M', '淹'), - (0x2F90F, 'M', '潮'), - (0x2F910, 'M', '𣽞'), - (0x2F911, 'M', '𣾎'), - (0x2F912, 'M', '濆'), - (0x2F913, 'M', '瀹'), - (0x2F914, 'M', '瀞'), - (0x2F915, 'M', '瀛'), - (0x2F916, 'M', '㶖'), - (0x2F917, 'M', '灊'), - (0x2F918, 'M', '災'), - (0x2F919, 'M', '灷'), - (0x2F91A, 'M', '炭'), - (0x2F91B, 'M', '𠔥'), - (0x2F91C, 'M', '煅'), - (0x2F91D, 'M', '𤉣'), - (0x2F91E, 'M', '熜'), - (0x2F91F, 'X'), - (0x2F920, 'M', '爨'), - (0x2F921, 'M', '爵'), - (0x2F922, 'M', '牐'), - (0x2F923, 'M', '𤘈'), - (0x2F924, 'M', '犀'), - (0x2F925, 'M', '犕'), - (0x2F926, 'M', '𤜵'), - (0x2F927, 'M', '𤠔'), - (0x2F928, 'M', '獺'), - (0x2F929, 'M', '王'), - (0x2F92A, 'M', '㺬'), - (0x2F92B, 'M', '玥'), - (0x2F92C, 'M', '㺸'), - (0x2F92E, 'M', '瑇'), - (0x2F92F, 'M', '瑜'), - (0x2F930, 'M', '瑱'), - (0x2F931, 'M', '璅'), - (0x2F932, 'M', '瓊'), - (0x2F933, 'M', '㼛'), - (0x2F934, 'M', '甤'), - (0x2F935, 'M', '𤰶'), - (0x2F936, 'M', '甾'), - (0x2F937, 'M', '𤲒'), - (0x2F938, 'M', '異'), - (0x2F939, 'M', '𢆟'), - (0x2F93A, 'M', '瘐'), - (0x2F93B, 'M', '𤾡'), - (0x2F93C, 'M', '𤾸'), - (0x2F93D, 'M', '𥁄'), - (0x2F93E, 'M', '㿼'), - (0x2F93F, 'M', '䀈'), - (0x2F940, 'M', '直'), - (0x2F941, 'M', '𥃳'), - (0x2F942, 'M', '𥃲'), - (0x2F943, 'M', '𥄙'), - (0x2F944, 'M', '𥄳'), - (0x2F945, 'M', '眞'), - (0x2F946, 'M', '真'), - (0x2F948, 'M', '睊'), - (0x2F949, 'M', '䀹'), - (0x2F94A, 'M', '瞋'), - (0x2F94B, 'M', '䁆'), - (0x2F94C, 'M', '䂖'), - (0x2F94D, 'M', '𥐝'), - (0x2F94E, 'M', '硎'), - (0x2F94F, 'M', '碌'), - (0x2F950, 'M', '磌'), - (0x2F951, 'M', '䃣'), - (0x2F952, 'M', '𥘦'), - (0x2F953, 'M', '祖'), - (0x2F954, 'M', '𥚚'), - (0x2F955, 'M', '𥛅'), - (0x2F956, 'M', '福'), - (0x2F957, 'M', '秫'), - (0x2F958, 'M', '䄯'), - (0x2F959, 'M', '穀'), - (0x2F95A, 'M', '穊'), - (0x2F95B, 'M', '穏'), - (0x2F95C, 'M', '𥥼'), - (0x2F95D, 'M', '𥪧'), - (0x2F95F, 'X'), - (0x2F960, 'M', '䈂'), - (0x2F961, 'M', '𥮫'), - (0x2F962, 'M', '篆'), - (0x2F963, 'M', '築'), - (0x2F964, 'M', '䈧'), - (0x2F965, 'M', '𥲀'), - (0x2F966, 'M', '糒'), - (0x2F967, 'M', '䊠'), - (0x2F968, 'M', '糨'), - (0x2F969, 'M', '糣'), - (0x2F96A, 'M', '紀'), - (0x2F96B, 'M', '𥾆'), - (0x2F96C, 'M', '絣'), - (0x2F96D, 'M', '䌁'), - (0x2F96E, 'M', '緇'), - (0x2F96F, 'M', '縂'), - (0x2F970, 'M', '繅'), - (0x2F971, 'M', '䌴'), - (0x2F972, 'M', '𦈨'), - (0x2F973, 'M', '𦉇'), - ] - -def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F974, 'M', '䍙'), - (0x2F975, 'M', '𦋙'), - (0x2F976, 'M', '罺'), - (0x2F977, 'M', '𦌾'), - (0x2F978, 'M', '羕'), - (0x2F979, 'M', '翺'), - (0x2F97A, 'M', '者'), - (0x2F97B, 'M', '𦓚'), - (0x2F97C, 'M', '𦔣'), - (0x2F97D, 'M', '聠'), - (0x2F97E, 'M', '𦖨'), - (0x2F97F, 'M', '聰'), - (0x2F980, 'M', '𣍟'), - (0x2F981, 'M', '䏕'), - (0x2F982, 'M', '育'), - (0x2F983, 'M', '脃'), - (0x2F984, 'M', '䐋'), - (0x2F985, 'M', '脾'), - (0x2F986, 'M', '媵'), - (0x2F987, 'M', '𦞧'), - (0x2F988, 'M', '𦞵'), - (0x2F989, 'M', '𣎓'), - (0x2F98A, 'M', '𣎜'), - (0x2F98B, 'M', '舁'), - (0x2F98C, 'M', '舄'), - (0x2F98D, 'M', '辞'), - (0x2F98E, 'M', '䑫'), - (0x2F98F, 'M', '芑'), - (0x2F990, 'M', '芋'), - (0x2F991, 'M', '芝'), - (0x2F992, 'M', '劳'), - (0x2F993, 'M', '花'), - (0x2F994, 'M', '芳'), - (0x2F995, 'M', '芽'), - (0x2F996, 'M', '苦'), - (0x2F997, 'M', '𦬼'), - (0x2F998, 'M', '若'), - (0x2F999, 'M', '茝'), - (0x2F99A, 'M', '荣'), - (0x2F99B, 'M', '莭'), - (0x2F99C, 'M', '茣'), - (0x2F99D, 'M', '莽'), - (0x2F99E, 'M', '菧'), - (0x2F99F, 'M', '著'), - (0x2F9A0, 'M', '荓'), - (0x2F9A1, 'M', '菊'), - (0x2F9A2, 'M', '菌'), - (0x2F9A3, 'M', '菜'), - (0x2F9A4, 'M', '𦰶'), - (0x2F9A5, 'M', '𦵫'), - (0x2F9A6, 'M', '𦳕'), - (0x2F9A7, 'M', '䔫'), - (0x2F9A8, 'M', '蓱'), - (0x2F9A9, 'M', '蓳'), - (0x2F9AA, 'M', '蔖'), - (0x2F9AB, 'M', '𧏊'), - (0x2F9AC, 'M', '蕤'), - (0x2F9AD, 'M', '𦼬'), - (0x2F9AE, 'M', '䕝'), - (0x2F9AF, 'M', '䕡'), - (0x2F9B0, 'M', '𦾱'), - (0x2F9B1, 'M', '𧃒'), - (0x2F9B2, 'M', '䕫'), - (0x2F9B3, 'M', '虐'), - (0x2F9B4, 'M', '虜'), - (0x2F9B5, 'M', '虧'), - (0x2F9B6, 'M', '虩'), - (0x2F9B7, 'M', '蚩'), - (0x2F9B8, 'M', '蚈'), - (0x2F9B9, 'M', '蜎'), - (0x2F9BA, 'M', '蛢'), - (0x2F9BB, 'M', '蝹'), - (0x2F9BC, 'M', '蜨'), - (0x2F9BD, 'M', '蝫'), - (0x2F9BE, 'M', '螆'), - (0x2F9BF, 'X'), - (0x2F9C0, 'M', '蟡'), - (0x2F9C1, 'M', '蠁'), - (0x2F9C2, 'M', '䗹'), - (0x2F9C3, 'M', '衠'), - (0x2F9C4, 'M', '衣'), - (0x2F9C5, 'M', '𧙧'), - (0x2F9C6, 'M', '裗'), - (0x2F9C7, 'M', '裞'), - (0x2F9C8, 'M', '䘵'), - (0x2F9C9, 'M', '裺'), - (0x2F9CA, 'M', '㒻'), - (0x2F9CB, 'M', '𧢮'), - (0x2F9CC, 'M', '𧥦'), - (0x2F9CD, 'M', '䚾'), - (0x2F9CE, 'M', '䛇'), - (0x2F9CF, 'M', '誠'), - (0x2F9D0, 'M', '諭'), - (0x2F9D1, 'M', '變'), - (0x2F9D2, 'M', '豕'), - (0x2F9D3, 'M', '𧲨'), - (0x2F9D4, 'M', '貫'), - (0x2F9D5, 'M', '賁'), - (0x2F9D6, 'M', '贛'), - (0x2F9D7, 'M', '起'), - ] - -def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F9D8, 'M', '𧼯'), - (0x2F9D9, 'M', '𠠄'), - (0x2F9DA, 'M', '跋'), - (0x2F9DB, 'M', '趼'), - (0x2F9DC, 'M', '跰'), - (0x2F9DD, 'M', '𠣞'), - (0x2F9DE, 'M', '軔'), - (0x2F9DF, 'M', '輸'), - (0x2F9E0, 'M', '𨗒'), - (0x2F9E1, 'M', '𨗭'), - (0x2F9E2, 'M', '邔'), - (0x2F9E3, 'M', '郱'), - (0x2F9E4, 'M', '鄑'), - (0x2F9E5, 'M', '𨜮'), - (0x2F9E6, 'M', '鄛'), - (0x2F9E7, 'M', '鈸'), - (0x2F9E8, 'M', '鋗'), - (0x2F9E9, 'M', '鋘'), - (0x2F9EA, 'M', '鉼'), - (0x2F9EB, 'M', '鏹'), - (0x2F9EC, 'M', '鐕'), - (0x2F9ED, 'M', '𨯺'), - (0x2F9EE, 'M', '開'), - (0x2F9EF, 'M', '䦕'), - (0x2F9F0, 'M', '閷'), - (0x2F9F1, 'M', '𨵷'), - (0x2F9F2, 'M', '䧦'), - (0x2F9F3, 'M', '雃'), - (0x2F9F4, 'M', '嶲'), - (0x2F9F5, 'M', '霣'), - (0x2F9F6, 'M', '𩅅'), - (0x2F9F7, 'M', '𩈚'), - (0x2F9F8, 'M', '䩮'), - (0x2F9F9, 'M', '䩶'), - (0x2F9FA, 'M', '韠'), - (0x2F9FB, 'M', '𩐊'), - (0x2F9FC, 'M', '䪲'), - (0x2F9FD, 'M', '𩒖'), - (0x2F9FE, 'M', '頋'), - (0x2FA00, 'M', '頩'), - (0x2FA01, 'M', '𩖶'), - (0x2FA02, 'M', '飢'), - (0x2FA03, 'M', '䬳'), - (0x2FA04, 'M', '餩'), - (0x2FA05, 'M', '馧'), - (0x2FA06, 'M', '駂'), - (0x2FA07, 'M', '駾'), - (0x2FA08, 'M', '䯎'), - (0x2FA09, 'M', '𩬰'), - (0x2FA0A, 'M', '鬒'), - (0x2FA0B, 'M', '鱀'), - (0x2FA0C, 'M', '鳽'), - (0x2FA0D, 'M', '䳎'), - (0x2FA0E, 'M', '䳭'), - (0x2FA0F, 'M', '鵧'), - (0x2FA10, 'M', '𪃎'), - (0x2FA11, 'M', '䳸'), - (0x2FA12, 'M', '𪄅'), - (0x2FA13, 'M', '𪈎'), - (0x2FA14, 'M', '𪊑'), - (0x2FA15, 'M', '麻'), - (0x2FA16, 'M', '䵖'), - (0x2FA17, 'M', '黹'), - (0x2FA18, 'M', '黾'), - (0x2FA19, 'M', '鼅'), - (0x2FA1A, 'M', '鼏'), - (0x2FA1B, 'M', '鼖'), - (0x2FA1C, 'M', '鼻'), - (0x2FA1D, 'M', '𪘀'), - (0x2FA1E, 'X'), - (0x30000, 'V'), - (0x3134B, 'X'), - (0x31350, 'V'), - (0x323B0, 'X'), - (0xE0100, 'I'), - (0xE01F0, 'X'), - ] - -uts46data = tuple( - _seg_0() - + _seg_1() - + _seg_2() - + _seg_3() - + _seg_4() - + _seg_5() - + _seg_6() - + _seg_7() - + _seg_8() - + _seg_9() - + _seg_10() - + _seg_11() - + _seg_12() - + _seg_13() - + _seg_14() - + _seg_15() - + _seg_16() - + _seg_17() - + _seg_18() - + _seg_19() - + _seg_20() - + _seg_21() - + _seg_22() - + _seg_23() - + _seg_24() - + _seg_25() - + _seg_26() - + _seg_27() - + _seg_28() - + _seg_29() - + _seg_30() - + _seg_31() - + _seg_32() - + _seg_33() - + _seg_34() - + _seg_35() - + _seg_36() - + _seg_37() - + _seg_38() - + _seg_39() - + _seg_40() - + _seg_41() - + _seg_42() - + _seg_43() - + _seg_44() - + _seg_45() - + _seg_46() - + _seg_47() - + _seg_48() - + _seg_49() - + _seg_50() - + _seg_51() - + _seg_52() - + _seg_53() - + _seg_54() - + _seg_55() - + _seg_56() - + _seg_57() - + _seg_58() - + _seg_59() - + _seg_60() - + _seg_61() - + _seg_62() - + _seg_63() - + _seg_64() - + _seg_65() - + _seg_66() - + _seg_67() - + _seg_68() - + _seg_69() - + _seg_70() - + _seg_71() - + _seg_72() - + _seg_73() - + _seg_74() - + _seg_75() - + _seg_76() - + _seg_77() - + _seg_78() - + _seg_79() - + _seg_80() - + _seg_81() -) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/.flatpak-builder/cache/objects/9b/3b5e426c23cd04d330f61b08b2bb3f0ba9e1ae89571cd4561bf8a1b01e5fe1.file b/.flatpak-builder/cache/objects/9b/3b5e426c23cd04d330f61b08b2bb3f0ba9e1ae89571cd4561bf8a1b01e5fe1.file deleted file mode 100644 index 31d447f..0000000 --- a/.flatpak-builder/cache/objects/9b/3b5e426c23cd04d330f61b08b2bb3f0ba9e1ae89571cd4561bf8a1b01e5fe1.file +++ /dev/null @@ -1,4 +0,0 @@ -[Application] -name=com.jeffser.Alpaca -runtime=org.gnome.Platform/x86_64/46 -sdk=org.gnome.Sdk/x86_64/46 diff --git a/.flatpak-builder/cache/objects/9b/414ca8481b15c3267a90215d2c649877ff204b75b4ccf00f750fa39f697160.file b/.flatpak-builder/cache/objects/9b/414ca8481b15c3267a90215d2c649877ff204b75b4ccf00f750fa39f697160.file deleted file mode 100755 index fa241f7e3353348d43e153bb61e8058f3023c879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33488 zcmbTd1CVUn(ly$)ZQI6fYqxFNw!Pc7ZQHhO+ctOizt27A#P|L8#fy0HGGf)p%#mYe z#hh8SA}Ut-ib(wg0t5v3*MI?d0sbcf0O0?JKyd%J;;$SB0Q8?%asaab)PnpE_5bkf zNd8X!ivS3J$A9$z{mW(eJN|DpC;U7AFaB@cfBNbDqx&zs1^+w$FaB>G*dGeP@^2o& z^Z&+DsK4XYfAC)&(4X{QI2w_MZm-;=i-_SNg9}`Di^QW=d0lxXCTyx4nIlAEegM};LRfbBmKWXR7mIt0mUB$B>^Kd9TVNZg|9fWwLMbMxyXz;&qWuitBI zU1vP$Pp^GnnDZ(s+W)rVle9dF@M?yHFL{iwR+PIQBad)-bw0;*0!Rdw{LHUH+W6LC zB!Lb>@lURZY$xdss(gxciNolZ`1kyA7BVABiJ;;c_1a$q-WG6FPvWm5CT@a*zMOMK zN&)m=g$=(X$dzf1jUODyU$GSHIZU7g)(tZ9IUeHA`Slj4A4;j%1Isl+Z1bqBLvzMO zC{MLD%jDg??;#Sq^r?0-0vrr5f4{}!>FV-6$C)q^NE7yD)z~B9{zlgou8OkIen9F$ z9Ke*0KUFWR*(Z5t9``j2&&P3XVaF#gTip;ozcx#>PokS3%Z*8}Qci}C~9TM?T!pOguAf`_^$)?@qN!wT()l++$do}X-;;H>?{+C-uk z`hW_QTvx>6@KW200(8CxrO@Ho`XURmIoe(Z63GCM*phUqTj=;Ab|Vgiwc4S_Fy|dR zs?yMHq;@@#&`mJu@k}$!%=yL*n6cJF@PtA)jdm=+r@G2WyrB-DAnWWzriZS1MyQ9C zQWaO_zo?qVC!f(3?gCx+fHAhF#QAOmQyoR#kr^q!BkhK}6qYJ4HbkC9l~d&4VjD01 z4N`o_%BQYHba_;K;|;(bENlG*lVw@Gws*4i~8c;}9?h{EV6sm%sx&dTUYMl7gT=Ux@_NMp_D|_(evg0-P6P zy}^FIhjZ6PGwowy99dljJHL)C0~Kf=Kr&0uwabh8xF$;|o{6rZpPDxl`gu#|gL|w6 z`Liq7`ftlfC6<|$9rAu=FIJlcI+z%sKX^1^3Ia=AVwE0RD`+CjPJP>9MC>z!C8+Jw zA4KG{j(XVDhvsX8vTZMB+`*573Y5IjwZanD=T6MD1({5#<%4Whb7N&{FrRUu}aB$w*BtF=}A_G%-u$gs~>$604qjXX8*jo*>nWY#^K*Q4*){ zWpE~ni{dOaMEtdqjt;X%(J8|wL2f?aDmj-^L5$4{>TWw2&%o#{0hF{*b zK~!P#?Su`61@T853ck-&jx^GxDL()C%3E!QnlTyR$8RA>$4uOxCAMH>2zKdHLIAX-R+#4YEEkJ7^TDLf$fn>Y`P!FA9_V{ctA5qEve2K;SWx1QFEEAnu zbhNDIDq?CD5@_JF>c6sNV}R0V2uYz(YWD%a$6HI%ZSC}!0khO3JWx*inXKgNZ7R7j zKt1YRyX12dS%+I;^{N&ri}#DW8w2iVIM7hgF@kbEMr=-lp<{{yF0(?pi_seLmwJY+iW_x;JFI_2rW39|>+ks7XRt}pyGxM5`~;PhT<`Qt@& z#Egt6=I*L6Zc92(^3Zfte8KMQuM zOo@og?T!1PKkxDp9JZJjEe;yIzgXAlmkJZl;!adZJq&bPKm5UY~b`Ku#}8*_$Vu2D$BPs9mEH~SbFBP zzs)6FJQZgkaM2~v86jtaq+Ic7j-n_f0>7y4ItkPMAnC32E zTmP4!V>K;GKGnMY<(%?4u5j^FpS+Q+8$JeJKA)Er{(M1xuGy72UDL{dF3@*U(1_0P zU3@8scNe0IeABh7Wd8D0D2XwMq(e>%G=--hk_F~|^!|7FsI9LX&TR@XeB8h`C2PvNXAF0jqnUQWd!;iM)Jb=tgWaDi+^9Eug$@gqc@j=mSb(*`Y$CtGAlW zyVd)Gr9F%*^ID_Jq$>EPbnn(#Sh&1^j({h<6TV#rkAgT?0gu)p%=p;PrWc`9wW(eb z{1-gIK;mSvZ?k3o`fCxgV(;Cc{zi1OBXe>=23%`~_D_bxJknzFdHfqS1*UxXH5-uV zLUJK%|C`e!BG@N3MHcv!CZ5PUC#g}C==CV_X6T$iymX+jrv1y1@l`XfHSG{0R+0kX!cg;=@Dohd&hND zEknpmaLz^*#izi-@9|S&M?%~%VU`&af#8laqE_PO59((=fw%zm+QCT~8bid0+Uc=% z0R2|7^J`}Kbxq7!8~KK)7QMfDzSbkYwKuoP!&X~HfIYxiv4-9od0@TVurh1H4bIkp z&M*&&v)b>%|ANd}o0TP)$q^Rggw7Q)FmQykFe*coojK|M`x5zAq$0=cAf7-5HHTg1 z6Y!c6T&BrL->w8)rm?HwimLrCcSeZ5>`5=EEGO-;T~Q|f4CmlA^BV?5p-unhR5J5n z8*D);af#TRR;bKL`OEBOOC`k210uc)*w&=$KpE8~3Ym?6=4BKB8rZIkHw~m$#h;I5 zk0Aa^XaT+^=w$wEmREhxa3sxfs=+fRoSvkYUF_B>JwZow1D!D!0L{_nILZ~|ua$|# z4B*w6{)rI5$}_onD9UB#*ba?wR&emZbYTv&^~^7LFy)Hk{+_HsqVgCe1@#;u-%d4; z)v1F{Fn$ryI%AX9;jYtjc^1tv)Y4km(-*R`DJZjD6S!A3z-Y`CH!_lY!;^~IS>SB}ea45!9s1T7RNK=)`9;tpxT7 z4RV`TOwxOW>A7hlKqN3`vNk*RmYfEOC3?wDloFg_?oc*<0`}d@tU2ICBh5JQ8v=`` z7oKqF)yHv2aN}oAubFXNlU*sW&-1NIHwuVyZ|9U%eq$y2REdnH!|G5)yb)#wYoLiT zz031pNBhw+BN_)`hJMr&#f~dEW!^NUg_bld!SsKO5PC!&zG2NG#0eI5aV3~yO#7D` zF6Rg$IDs%^#a}}S{5etax*r;+1!pnC?oKN5&$y2bF1&9 zMg;9kWhALA%TOcDDE#_cHi2Xb2~~8AeVo<<=`0Q7P&?lrl!9Hu2zy^J z3~EN9j(U=@w2XtCx7Na{D_DQ3q3UUm_{pD{{4QYadusq%P=h&ka{?Aw|9~oCcop*? zpf9v^wnrc#+-m_qCCeaS4785%=k_~HZ(rum zS5VY$b24yJWk6g5fcUQiPA>C?F%~KP_ zhg@`HH{21yc-pgj>M+t=cW-t^KVh~Yt(A9Cz6<(Q#Faqkme8zo10Nu!2h&Q75fsl= z6`?Nvv5Gl3WkXG1QXw2619 znW{0L$hI&porkW8FJJ>#^c(SD(e`w&F%k6dgjSZ-4?>Kr$$;OG8rCnp+tmo%D;qf? zH>%;=>>J-;r3$y3Ht@yv6o|8QAJn~5detoXR*kL%zPZzgS~43Oy}2h)r5(aM?RrgvKY0u~ zXHxpGYZF}~TNL!)@P3GwjYKk+F*I>8R=;pC#B_lwcg^@)ETcL;1Kym#sQ@mMbJV8u zfZ5=;?cOcdt1~1j;xuG;g{*N;`NLYlcaD+ctWL`G2JjyB4p@-|zo!u*VQl2qFypwz z!~V>e;jHCRayBOAB(#CyGMDYuGB(X3uluAhE#Jw&g+NW`Gwja)>TRNb26+;#Bd=AF zdyzGeMcDj0+o!}Qb%mV66k{wu*mac>Mh#zsEc1NeL+M?c#3x8`2OPmV$FU->IHiAC zM^jmdg3mt_b)z=_bFWApYcu-+ix|%dTH^IkEY+E@I4kC@mL&^|v^UKl?v*k-XxZID zvr4whET8(VEOHg2Lfa?Dcd6ZtvnbPx(*68iDgj?49urLx5w0hkDGfm7!KS01>;Bz% zs$iCvMDFQBnY|lY&Vdl52HPyPdXKIwPCVh6>LhRmZSkg)TD^`REbY< z&c|*g*9^r-O}#j);>Q%AH%}InxAf9nBeaa?vC)tI)8Z5hq)Ge38kh%C5U^u13uE@2 z0u{Ii<@lvCClFoMh_VaeyCHbIc>9BT-I+ zOQt#xH7516y8xC-2659*>1(xGrUQ|$_L%+#M7`K-du)tcE&Wa_w0Jzh73yK?eD_lg zDhGD+;OYXRm-z14B&A5Zld)ZfsGn^itZ{Tvsz-RqA=5ff5j-$o^KR1D`WQ)dArbPE zHYIHg&klZ_%-}#-Z!*eIU^R{~S+IC{YfMb@9dUj>i7A-2=`W^wx&(^saIg52{dRlb zQGvk_(tBS~fq0D1MUADALO2KgwcB$oCh8XxZtQjx&>72&2wfv1Iz?txX30^No#dq{ zY!v7i*l8KdpgYEq(#vpz9c{Y&>A#VszDz8^Erjyw@BI98&Tm_9(erb60v>O2Ox&6mh5}KjN$Lkj64W&$B3BXP7iug zkJ_H{K)!h31-@u7l&qY|Q#xS5C##&O9J2HkImqHJ6l|WLjwC}hQE*{b#_Lm{@ys-f zF_;TG@?fGqKXKTB)Y#9GED*?`?fev>iw-d%f!tr}TT4|1A=u^$jhOOm`%nu=4j;z+ zEDazxjqU)Sf3iSF*eoW6&nrh+{E**U@Jx+>(8KMkGzIulyrl7+c zEW4zYuOYLG0V>><0gc&Ye6xIAV}~;ckaC=hKk(3%;x};e_6!0Ryu2f z5M<52j2;VnWU#^eaG&f}5tU`qgDyxtDFfAldmEm+CIn{4HR?~GDHyTt5(Bsm)S@wR81z5A(qrE@CJ{h4^_I6n?Kte1X`Np%}EQhaX|CSe^&5UsBcs9 zwoEgv!2yaV40*N zi;hP|jS-PKhu=??l|2~Nnk&0tm(X-L*;r}i1@|1RH7cdi)Q>dj=?rTY6caSNhKzW4 zHZiM>$u0P`8%8jjgO|Gzv zw|eMg{rfQ%Z0*l0EK6Bm^M}JW5|NGY1mEw*ZlyJ_BOK-!9$~*O@+^f(FH4iO=s9Sy zg9oc-q}Va*UMpIH6mLN3n6;n${nQyj27;s1DS>BxpIM6nP#$*$L?fRmkaMfrv6p-f zH~zLPz6sHo4;ECDM-vAXc%Age(wUJ2rmO*A{ZIbl0u(K(^PL8c%&?beNI3Qez$e_c8ytkBVkner(6h4 zjYAicY3B&FQ-l%excwCb2A&Ce8xBAn?^=l$++$4+VD?!lj?s?4aZca-r@iuHd-R~W zQ~MQyTcE87eT|j#PB99bvwjo-p8}uGh#P8?d{p$vKc<9U(5k=9@sI8i4t#S--kms> z?U#X_h%W87idg|SCst>ce}Rbyk*t4ymNMZ68M(id^-*S8ICkYieF>hAo=z7ehTK=d z2pY2>qHYSvI}n7GNa@txO3VXAlF8%1WZWA+>q2h-lp%0LCFc#%_!2d`FkP?<977Q< zJhJx^1kC$shiF4yW$bd?c@O17FL;Amk$jB?QS|+gr%#L zkLEi%vmgjBlNa4!BMsEk4m73>=@Y7bpN3|~@>1~Z16{;BnZee_rN@*oO-%O@U8G0O zB{xgM76KqKPZnSe8Ts%7{Rq@kWyW5I9O3X&__t|`tALg-wIHVwwUn+OgdilIziZEr zOj$8*2fbC5a3t{-+LpCVZw+|IGC?q*rH97Xww45_Fl>`-1$g72oRi_UK4P8aB; zLZm`cCTpz>Y`;TaJhPx-cEgAv1Mzk|xCJt&?wX|=crtg*IJ`DDoYI3%TDVRTACBQV z8auovH5!Szd63Qm1HdNd#dxrOSr~*#M-54dB-2KK@F{{D>~;G|i+dPsJP=UCJXMRhWYa{=WUd&osqJ7`QX6FSw|;AQzO6xblkj6R?Z zn!LoqjaX>-S|@(#Dq8J_c)3?L3*<~OlhlO}eAVfur)W(F3po5W?x?&d4=3gv@@$5Op+$B4gZ1O^D!Vgvz zMDLPJwbl zIL=Eb!ds%$jTN9cK{rGgxqS)eo!sTYW)Oj&7^BaDP`(2f+Sl2rs-k}x&r4LIY$d~7 z7tqj2%(G;!WPm&j1@Xf`f%G-_@+06#;~rV>MzogAV&< zT*R7r1+xFnm!l&mJu}fDX|4ekRgGiS)7f|2rSC6|ymXjn*wfiYC9(LL1dpJZ zpzI%#aYlvawzO9W$eFd6(H*ls(34+$x*=&8mDV5m`(k3XRi?{yUK8=fevidsMo{7?B`s<%Wwas@y?t;Rl|>k9(u1?cI* z8VSV1=a|r{D8N|Cg7tx|u2OVp;3&s2bLw1AToNFch(qP#PSXWp8^3WRn<_JoYC2#{cuYS&r zepwP@Xt$4&64AC@bPkT_HE)eQ)e6{g2soKL7#&e1vOt{IJ4iqU6p`6 z=*+9;)V>-mcx`J+_X!xNu*3mXGBezpQRRYy)HUmSVjX*^(JpROc8_g|e4QFVwM}qo zJo|mfw&;frZE^01;zV|cu#cGU7MlGF0+6e;7IkNNGWie!ziwI#B~_6zE#aI&KffWg zGY1Fh16qf^^qN&WbcXepTcF!zQHcn55>)xUk<2X|Va)78bF$waT81=)K=3(xfHW}S z?HkB8TytoNg1{1c8nT!4s3UoHyIT zN^-cOWjYd^E5*?0HAdW$+P)U{jZn*E@%d!5#Lz z`$EuUbB2(ilOCjcIVk}<21)mqzoMJC;;^)<&UMu*6-%{4vw>=-Yt=M^XgKK;tX#Gg zP4h29vwvvKE5hbzs!a?ePge!dxzos9b#;trMu_C-RaazOd4(Sl z!gqxSdma_@KJq*{iRZA>Nl3Mc(cMmNX6d3#zPc*x+N2=)O>d*zn`oDB;I+WF>?$79 z+8r`XYk9Eghq1KiR=z`G!2N!pdddVohqt^l{BlM(zhu75%hTSoS@N;*%Da_9)}R{j zAAg%OZg=jH;}*)!FKUGDJl!>g>lVo_7ZhLjx)(QJ0L{yx%@7z=F3?)WCsNnZqwT;Z zV1nj#(gEBCElKmyG=gr&2m&p?po@Qj@*s8&As1c6vLQ(bGW7KG? ze0=LZO%)Ef*qM_QvsA9U@yl0&ax2e6VIF@~_PUa{Lh3!n2y4xAT3ZNJL^+GlPO~YhxR{ zVNIt+@_qa1%MFOH$tZ+*PAT(U^5h_A4pAm>GXN3J=I40+Nx1ny&>NcMH$!rO5+2Hz z#lhJ&VXctjPuhtPP2L=(2mB0AJABNh-RY5|;z$h|DpVyVi?oOu6KTw*MRhA3J#LG$ zWznCsl41KAe?(|WP*j*ro5G{me|R;J9}q^1^}(^O=}Z=D{6XK$#*6nDsCbMbiv~?7 z@)3^Px2@8=o7wMgCZ&;Y*QCqfR&g0(f-ms(^Yowfp~oX zy1_%ko|o**25VTwihM{FCJwWTOi&44JW-Em*0$QUH!J87hL6hMi9eNy=b8~L(F}1p z$Y@;#re$fEosJkdaCwtT@cKOxX?xqlHUDj4eT&cR!||0!b7knEwJ>U)V^G$sOYkbH zsG+Vq7N8C~;liu`!yq9wNgd?8D3OucQKK~Gl`H?D6@QyiSN<8o931NKL*ASnHgW!1 ze=Qec-JC1G1iG7MbK-EhyJC7SsJU<@4F=U^S)bZl$PYNQvqjqk%+wDX8nz%DSBO}FjqK$c2Mb_t#zO8%@?GH}Oz@tO%F^zj!IrCZ3 zD<&1Mc;`cRynvpD362X&vV+PeXRRvDAdNs2o!3+QsuDL_?1)`ZZNNVFRt64gWL-4U zJ#G9UU1zW1Y&7QOu-hRx^Wu^sw@E6s;TNEW8f+BXVl;mbO5;psuWHvx%x<>QHs()` zZOrN##mo=VJDm6p4oZJs5U(N4XyI)=l+8%yD%njVRIyxC`FC(p@3;o-oL5MQ*&myu z=7n z(ZHf?h3TW0XpuLlBcA`EI;$1 z3E0^AY=@lTn?|?1#M*amQaq+buT|SdYG{;eXYQ|YA$rbc)Gjm7@0{nAxb^W;3}%sX zD9hx0okN|hhKVan`9>H5Es^TlO;OWmH99Aaf#Rh5XcP#v+>1$J*|0E#y>FdVfsi zoE!p=r!$8`^JnBSfs=%28zr5}i-uzTlX838A#hOP{D6ehaHp!!YeVu5$o6OSk`%VQ zD+a~kCDuc>!2oc}@uO98Lm3~Bohp$=wrLMGt%#L!$Ut(gbfy_dveczT6=DO7;YyW@->?rfAdD&ziMcdFA0ZnG=u#8=k84B2>5Bppm|3-G)VMpny zw)v^mBNW*nWRchE)PC;g-LRB{Z+bCT%zp-{WOo}fOiLY2u?7} zt-BfGjffrGoWvP9QejUZ@$^5DguY2m| zL`HS}^L>8zo#q(*Su4`$K~7&j-j2jLzh&d2yh~lu>Rnoh<~s$~MX#?((5{t-+xCz? zsBTmf_sxFe?(e^#ez#a7TgYCM_ri^KCeMxL)#)#weYL7Gltk-+rhWi#+M=JYzi;^S z+hpX07a-a&DTEiv)(Wj7P}pQ(X73V+to_6&9mW2yDv*N`7zyxL>ltiFvIsOvkw|g^ zAHu;Dn=}IR3Ag$@{IQUTL~en3nMLVgTMT!jfI_uJS`v(#L^q&9o(3cwXKujxz5vyg zI}kBZ=xwbL-7zVugm!#?^xjELHo@-rvXbE@yf=ws7pl$h9g+-<<;$c{6rA zyDRb0U=|Um&uJWXiAYiMAd)H{;yqW)CI>B07fEt!{XqjvO=d0uDv%DRfVz^{0~9!T z1DCb>JV`M9+9Ui=@qbsWJ+PiIqH#n z_eBUp!@e7fy%dI5HQpF39V;4YNOjXFV;EsF;X44!#&>wv*g@lVn#rJF6El z%q_1M4qRK0KZBI#(3woG^t^KaYy3=O=vBg@m!~~`E+sYpK}~&Af4`(&P2nnht`3?@ zd;B0&DsBHvUhE)(*n*M7WO2Hm@Qxnld~D`@E+p z&j4pfq#hdj8>>^qn&@=P3(T-q=^!i1Ubi?R#LR8GS5<8uo8JnIt(cvoHGnPVv-p09B``$n z%fv4aLu=JbR@?ikVjjpW$r(8-PVm~jNm4U19&P)mPdxzDJrzVZ9v)6Hyyz>+B?Hua z^AzUj%{nG`x7gB`y@B*0o(yvMif_?-1oBPDE)wPn1X#ATZYQfx$Q2?v`l84zJICHT zzoENcQm4zt-%}9z&tW?BwaFq~~kY$;MiIbk|$$&Bub$K;ov06jzQGiB?0U zv4yRJZ}Y9K{AujFC+-Kl;(?mQreC31Dg{oXgy1{W$>fW}Bd0W<{;l2j!@5X`4~x%y zoln_eWl}D z0>8o?dx(4eIXm0bWXao=bpT!i4Z^v_<46G+C1x&MAh?P;){n+R=N+WA<7k`QW7v z1^9g1)M4e}`#2$?K#sS``W=I!&^8ephS#vjN1DMUVGC?_8(Up(n!)L-n!%Y>i&quN zRw{&6_8ak~(nL1op{FAIk3c+-A&_oaP@VuRNOr%VYzuN;j2~1)mZjygfp>3m=G#ZK zMsmfcv_p_?esm*MA9UK`@0xwhc1lQo_(Y`aJz-`sv-~Qfu zY#gfU4@LcKG9E2#L;V>4BAP%W@>$_>OVit8!%D1w+xCAHZ>J= ztBcn+IZjP;$92rdH#R1Z#mqYq53CHeoh5w{{2)=5PFBdwm5I?*@RAO4jNM-s_~xU0 z9xOy~VZQ5uGUR5UVB>^MC?IUS^U?Z!-1>fVaPB&E&IMj%V^_3=!OZc~$)rB>?qLqI z$G~ng@&VuXCsvMcBCGaUioh2UkE7lLw!D=PJ_lH5q?m2sK7C<$&gq#J1?8J;#i^V0 zoUJ^PkAnAZ(T#^qEeDAsoKHOqd3J2!ptdLJw-lKVtl!anj7{x+gWVS!vpNL6l@Tn2 zT`oJXz5M-mzzso6oz~YIkd`W%R?QX9T{S6mbc!DV_%1BuX><*8;-~5D-l-1S-ZT=p zp1*Ha(H<~J(f7%#U_K#ih+Aiu%mMxw+oKy1~*6y?!Yp%l`5*7TeZW7FffCSx$IRR|J!o)^|Md9;%b%e?b?eWqZhXXcw zQLR{z387SBdiSSd&8O)7ZM>iH!Fvf*PDW5h#_$7?e8!R_fO;!vd=swj?@NQS*Fn)S z-IyGYRuzYzv#CuoN32cthvhpGHvY0#oN+dCg{0+wuxylues-O08ap~tGHEg=-1v-2 z)W-+Yu|qT;3ju`~alKjMI;xUE|&UuYmR zBJiBqTnZZH(KvMg38GNAQRY`{Qi*iR-{dzfejN3{@4l4noJgKEyt0_YJ7p|>S&}C( zGoNHm)@QCMxD|)MoU2j9 z$q=Xf?VSpAMEsofTPhVw)RM|q2QW(AXj>F-hLRvHEKv#49;6*C^En3Q^cNtgL5=9r z(;-cTskOF^L^&NhiU+B_0L?G)f`l{P;?opK4CWLQtjeS(Lddc-c{i1%FfF=rXe(w; z6JIzHa-O)#kq#_Q+G@uak0=Ph`b@cC6V3y|yX;e{*EZ#;TW);DPoNhwz780|XAuP8 z2vDUU>6EPIWGhW9af@JzgWPB77V@?Na63AA-waGUUj1Y?&Y$iRyxqAvl-)>F0WU$Z z`do}>j6tfnbVp7+%vy`sf9{Lo#FenlcnT-IKVE(@J?PeIpj@}9omK=#KwQViqojD# zN<9TnxG?q(%ehzdC(%~*n_MGokB6pJtdAr2HkFHNPiJlWT^#P~(hyf{-wvtb+8hxV zZ#-WjJRk1VQjhp$=|gG*x^{^IUCw>fI%iZvX}ptS9=@+jd(b=@_W0|s0MqjJSAhpO zE3`XU&cO~NW=c|qa14N%sV^(X~U_i^m)hWHVl$h0-}f2JBez-_%s%{x+Q2{q?qI`hKw zqwjipl5Rr51>Hz{(IwV^b}=s!1awQ^jJk68eU)HSIFi#_*%-v?nuHAVI2AeA~^Y;|Q!b8qHXu~B! z=xZ5F4MI9=@waq!=}ixX2R z#~7wMF><28vCY~xfN8Sb;b0$OUTa*xlFg_OUbDNwRbA~xSJbvbu+-^*+flNufdPoF zg2trAj_S9ESXRz*7MsnuI99Rh@0&={r;{iuwL&dm8Mk}R>ItD2p6AZRE7?%dnEe2W zI~OPhG%CJmh={U|EAr`#ZHaRyW}Ag#2US5Cn>b9if2Kfc5o)9gc@ua(-XO#&Xhw0> zaLo>1K?T*KAK|Jo(t&v&b`fy5=H9`RCtX3$olQCb8j_r?6v?D!evfcgRMd0}7!c^fkPs)q{9!Ph7tEQlS9YjO6LU6#pFlB%~>Tg{rxK9E0P`M-t!yFX3RAsvOl6>s?1*c8uv+wmLp|nuhtASt&~@0 z#g8_hMD+P}w=s!2hpfJ!A=Wl1JddR49;K&b>$~05d%Bpkg^Rr;fw(Xs*3C-4-25eaFmtw}cpt8tXD{S#l-~!jFXUvBsGtbJ znqZH;;iL}xFCZb+6aOxEg zH)f@;J1j!4k59=3eD5nU@AtKYuqYd{n;>!6lvU}-Q$;tw?1n93S-!66L{0zmK<$u` zI>73Xbt;>M3bE{9n#tK%rDJ#N!16-cPsQq*z!XviR@803%`t;C_J)B^PPrO-lVdt5 z>{V@$TFo%;sg*;LI>c`ypf*>F}kA4a)- zc2kd9&57@15z~s%ltF8GeF?$>c|^viX*t-4mrt{`G*|1plZ@9}=U6YM5#4*o-Y`Av(9}FMMRZS}np7ML6`L)ln??h9~AGZOF?;T33shwd(`fd@sUn;>HSi9S_ z16#Pe+mr*=$VJ9Vrr*=q!lq^8EL?}BD3%M~^pySk1dSsUYwUvV%8V>?N6imwXlJEW zF+CEh3C(m^qP}TF$3uhJX$lM}%^5W+XUmRd)5;igX z13-i?@~G``7HML_yGF|W%^Nq#Wn8!YUHq4*lB|&VBd+r)RFQJ$88Y<`dO_yA)+c#T zfv5@kLox(EtDH2Fvt39y(;#sKnBJsaR`EiD9U$B|?xD=2 zS3=*r3i-q8U1*l8C_}YLaA*g&{L55t(dY1&s*lg%Tc3Rh=nyx;nQ2rJk&nU?aUfv@ zsGY=Pq&Jk9$ZH-B!3w;?tx6^CwIpj`B89wpKYkuHKH}*hf$vl5SQzTl+YQ_d3OGYH zk*;+?mTw1x3Q@~Qor7X7>Oyz3nr867)4ITXc}7VesL^79Xq-hy2(1(nWOV?zt=6!c z-NH;|@_TgCfgidYIsFdH+|0CS3y3fc;lEVlCraK2Ewv`AI>YBipS2MGHuD1%SJc9O zv6ntPYO^TgD?5#ts3GL(FJr4A%);mP?qYpp`&qHR!Mm!s?9mzZsVHyKY?jWcd4PjX zekb8Vs9Kk{K~+DBCw*4~8*VCUmJ;{utTf}XoTUz8V&2ZjttRy%P=w3)lR6ATc6%?x z_~urf%4M2zzO7|nJ;E*ed||2-Qjd#rgo>C=Y|aubWeM-Pt1@xk0z^$=gDmcJt3LWh zYMm+hnOl4J!)=gw4J zX^jUUSjqb{S;=d8*&b5*^SJjYnPJ=VQS9U+Zac2<_6_j}91bi7+1w#4M( z<5EnOnru4hsj2;?g`%=H^-d2Dt-Mci8@H0y%cpbWnlgk%I1E{XGUa8qGikUk(3Yq= zuwG~nR4=DpBiFt_C3j2``j88~9m?v!uA&P);hYa@A%g}cj|Zcy6}XWTMfBM+q4g&= zMiMo1vmGj(JtPU4awTS;y+M9qw_5JbVqeRJ0gtA3QBtj@VS+ZnL zF$QCZnPDthvS+6xNwyNnF8i7-Yj)XF_Gm#Qg!tcCZXfyP|NA}9?>tX)&UxMUcHZyz zdEaYp&zuoAistJ2pIMF5jh0ehW=G1~g4CQv&H2duv!`2_BPyB)d5Xnk*ff**TP*FJ zlNZ%1T573Y##*0OjwXbXA6a{e)-OEC&@csrKmR2S+;Va zHM$8?P04(#xdE&=! zMC8#em)2epJ1z>NkwNrma9+ck37;_vNt4*yR4w1g5dsleF$HpWm44a=Ce?$RPdXS4GZe4m9rScdX@XJiJWg&!wQB zImf&3{Wu2a|E$wlU%+?c_&{!lmauoRyWtGe>Zx-1u5SJd@u(z$_>rOT<*Sv-F;+=i zE|=+uSa0T9Xp9KZlblYJD_=~xz`(iEE-R^$ys6^eab0X$;+((_nQ2k|Zr2q>W(%T- zmueT9qMO|0r(UZu%ZhyukouiTIx9J@(DnHxIa>HwEcd)ad!F9Ca}?1(eO^yi#3=Li zunua@ewVEr;yyi^TP?Z1vYu`EBG>3>_oO1LeyP898oRbH>S|ATQNabLlVV~qg{y(C zNwUjs@WQ9Lffv7s!-Gq#wHdfGhz_URoa0G7?s@4MN6?1u$C5PBKGS1vmQodoE?-?9 zpFHfhWGYdi*H|m!iEo zwpS5b(%T%Llu73bGuAz;-Z@D$?TC5lF1=s>MFjlLLRekHf6v=IfvzKujNfCX#Aq8| zwo|#Db~s(=)_O1}EGN{N&&2Aq7H{xfu3R@3NOaEcjmsY(Dr!@9{b{s~Q7W%`9y@A^ zuPjaRc;r7peS29dQ{8gzsmzO}88-3BchwzX?UE__Zq44_YDj)o#!9NzPj7xVcdbpP zb{bcI@zgCrZ#B*hdV8+_EWN+R=Kagwu%e{bo7MS+M$%-C@aNB3mnIk5W~pvB*VVL* zeIN7O8Jp-&{}jG+<7MyT%BDWem$_oMU%kk+f5UOPLF-4w#*c1>#vRXMFLh@HwxJ#8 ztb)g9E>CED7^y6A@5uVrnc&@LhK_h-FlfIGWkLe zUB4Y!{_cf}ZASa~ocC`zMh(tfy3$kq(PXxA{Ag)i!qGV5np7|#BeH;)G`v1%D5rXwCZ$NxjipMLW21N|%ky(v_(MaB zc)q!fvCf5P{3b*1@cvLsrxol*FSszOKSe(G?MTz4(H%K@wZ$YibW29^4P9JVd$jKJ zB`>Ae(q0h-OYNX!0#2` zl71~z-rROB{Aj+mbv5ktk5-q0(^L&)OU@4i+Or~;oo21#?QXM_zrQ*l>}Hf(8XcgY z88(?6KJ&W$z4*F|0j<1BP80 zmoG=%^4N!MS$(>Nb2D|;0`fw>H^|DJ1`edptr>hN5M$(ajq6AtH- z9`EOLdZxlJ&Wh1fGI;8z*|88^m7~oM=sh0CMbE|Gaj{cLuZu-G_fYu98nTyvW<{y^` zGJZuB^3Y6Fj%j+7V=l@QoP6V))8XHf({lxkL+A)JKoeB+zQ*HrTpKKkP{ z^$wpfxqQ>fXR^x_d9>wVk6E-PQ!2b#Me`Kwm>A@|m`}YdCYlgx)Rz{R@O2F#uGm02 zw<`y(e-r&lBWw5c)y49IB=ml&#?*1Qj;GhG8-t;Zbr_(;r=opn)9RYamhgc3%gf^toH4O$g}6w zh?8vJkgNx*O}r)Tm~>WiqPy6g%q&;qdI^s9(G+%nVSmhs_wq#Ogu*F!)*EZf<5$MIc0u7qI6n#g@ zwIg5dJUeS;hM?}v?|bwxK>DlSuS3*KIwR<0Et2n+r_L5=B8VmoA1kSIU#6lBQA^l< z?!J7U)-8^b>|&l#1@&`n2_>#ay1I{93~W^&A?HHrd`Lf2Iu~^%9%_k-{obkEhgj-h z4+%WZ>PH(&mh|nlN`NkeS4FXlA?2r~q-AFZsxa&*hC|&p7X!m1YZ6NDg`Az%rWATh^^tu;{o9Y+Z~jhSX6o4QxfRJ!XMFQKTZd9xZg!HHkt_4oGYs0|?HqkTbHPPc1fjFp^!6SdX;#nJ9p4~n zbKw7NFQ2Ebd(6itJA!!MeUR_@;iStC+=&fZb+A?z1$F>of=STR%OkWDb z+;}#ISzG67ZWSxnjQ$nPzBN;v8>&87LD6tP)O-L@^O(;dUc}PluHLs}vR@PHnJhEf z5GP&=o;6oci{#2GIbqrRs*!wrLwl|^lz4-6n(r5B;5hlJ286xZJGf!MEM6-go~z9)Yy*Ms-+9{8fJBv z3z)`w%~lVW8qSMy|8lm_kRzvV5>gamwaKyFUMkIt;u~#nwFqP8r_m!#ROnzV)fI}X z@}Y0t+&)0BcTz!yXu5=6Es9iD3H=Pgp1G7eWo}!0JEE#+HtV!i{&0@L_*|=zCeM-5 z2<}5it{pzlUO*BcBrJRKg-OuVF^4OpWa1TTdTd7QdV# zcr$V_`p#XeoP+8j&Bj5AvBA_VW#{VOctA$x3$rZACh1adB~J_uSx4AkiGmYb*y^7w zMr&M``~InQDpc|T{Z(ZFLq<<-Fdp>Q3SO&Y(TJILL_bUC*)Hb|09 zaw2epEOaZKUuJv4OM#V$|3`;r!i7mIXxI^Wt-|#vU5Z$9f~WC%;IB zI>t5%1=5I2Auss63{?>5WNMW6El(yF&h~Agh^!)-<2)!ip_;CJjsJGrWEK5nOL?p6 z8v)nC5XWLmS)`3cQ>d@tE`4%`xpBxXkimyRY=V4O3iH zFB|HQ_IR&J-pil{H!Wkx&@kg!KOa3=a-Y-TMY=?vk-!npIm0+OiOS>!sFo~U7%De1 zScTDxe0cVXb{I^Iv8nO2Cn9>3h%;d@tZiuZjZ%}y9n;^|j*d&;eG!tJj5_%x1)fw& z@oA6ViFkJz4W9~UBl-nvjiHTzW%1wpU?`y_=6%F`nCkk6-m{!y_A8MXTQE7CpkD*9RB4-zuU>$-L3sz+*>g#bg{G^s4MWB^4J1m7JV({&$WkyAuJ& z5{gPqSNt8`3dwtM8p|FobFulO!1C8}%DYa_nl#1(%7$4U^fi{y zy^@Ye-2TzW+U+>bex__ev4tvtlgr_9$?TkddZ^sf9!4n}+3m@T)~R>miF7G18!1b) z)4k{6JiZYcjg)~9(>1sD%U*7{E@g4Z?#K^XnYd69qdG@dnbohY?@px{o(ywmP4kmG ztt;f)v62~fuslFa;hBG6%ni4=+~r$TwZ|EhmgpyxW1>Di@1?T5FY2P-Y0>A!$(~7` z(E9vG+U!iT=_Bs0z9%kBFC~P;Q^nt-O1`QJ*CcB82v?ION>+dwKp;w7I3gfjH-sjRpw(~uXRU+aQC{9@ne?+~5 ziX6Y+FsJuff5zYOnXXm6O~fL{`rl<`tG-=&9^L*L7P`3F&}(4iW(S`$Bave6u3b>9jmnk#R8+CibY zoD}nZCPMeQ`NV=@5=KVlaPyT>j-hC+!z3MMFT2)%nSLTE46G}YjAwp6>ay&~Z)ASg zcxk7wR8)BNU})BpmgxK0_2ryY;#Cec7<6X@%m?ar~I2&Q4Je~Bwv0O^rw7dXRS?> zH}Si>VpKkRzIsv6Ba4rcNY&=v&(0?|nB$oY*8HklP#d8aSMME6PH}WuP$xxUalNd@MH5_~pQ6z3Gm{!>QK{C1Uqa4$#x5=m0 zD?+ctdTBb!*cG~;S=%7Tv~*>rj6Ae|t7T#Jv|MIRoS*0}q|?s>ee2qt8;Xcyml)+$ zAEsL-dd>d`b{75ZG#NXla*pcWs7^y+KgUW-(Cm@O*`|_6tM4pEA+$pQ4~5E=C!v$W z>T{h&ev@asPfQ>t2TwPRk#*A;E^tw?H%O}$urF#?$sq#96dDd5Zq24vd=PwL;xqE1 z>r5(Bw8D@vG&yYehrsbQ%UWcLNXFA}lE@X^M^#^_1N$Q)5iui+mR~(;#+kNUxMlAo zH8F^M9Q-9=K0a%*ogKcrI7EA`31IlnykOOAb}~Ld#t&o ztJf?lzf37_G2ZS}5&iF5kptVVBN009QT{^YGePX#IwNZDK8j`Zeq1FAZb;K$jN*M< zy!HEp_3(xe^4#>0biNkwqZew2q%VF8yi+`qLE7N|fZ=wo`gG+a)8o1>dTt3RGKZInzmq$ZcAgo0 zHP??`Gw@#FX4^jhB%tT{j)o+ih*!FnX5_$|?vpR1tGM0`s^?C>7)l;+*&B)-J_iZ`33ap<~_=-|qpy*U|=aiW*91kX=kV#P~ zCQ?0jmg5;CDkQomHP)r6B7*`cUwdR}Xl-sGZf@E_w&rHhDM`f5xaNp!>f2Uw%v?(A z46xcO9=a^WR~Jn~e`Gmg6gp_GmmgR53C6t2IQ_j)eO7m5Q8s=vq2&5IF>fOA7i44q zg@f*l>qw%}yzax{V_gqt10(Np5zDt6jU?wq2gYs_C4L_CDm>M>PGn#Cbc9Ok9g|g! zohOrh_dS=!_VEICr0{sCdfI?eQDtx(r{MekMA#Yg#0}cYG6y1>D-Qi~pBG0rFKH#Q zFSul~b(YsSE-WT^ES9fbO0F0(6JlDX__||ZL6JdXb5vb4AzbCgu+cPSh}47O!?nXL zj?9diHq~W;KUP-^DNi>T1ev2u8NxXTQZn5cd&?W z_pH-JOu_-y`?WboP=hv3m!r~p?54SiC)MbkwaePs6V5X;F2#|zM~d=Aa>Wjs_zNy) ze0Mb(X=-|N6xMEX_*~$yPmw?;!yA6$?7Qz-E=DFkpzI2?$*OmR2?+*5qgwg(!vzI66Nf3mz^ z=h7%q#q7N>R?oM!h9`AS-EdBDs=w3Q+7S`w*6mpz;mR{=2>eQD&GfA!l#xt>83`P- z6g)`xD-+pa)6Z?8G_6KG{pL}IVRHHYzsDEOBy+qRsmqNyvC{qh8P7tU&;rwoi3%Do z;Z6$HS>>gh=Y^B_7aY~!UuUCzZ1HrlJ*3UoZrYS;%Y)B%9<4fl#V@V=Dr3iE6#+Zb zsS`g{1a_oUrMjwKAHUI?txnF>5m;6FAmJRBTeW>Y_2->J>$Jn>Y1WaQAq+>52Ja&5y*(C@RHKk#E-o>DTCv z(#FR=bnSI+4In>PUR&&McqlJWvzRRU-D8*W>H;Fe-p2dBR+MEVCg~k=W@lqQw%S&` zF3XE;q+AT0D(;~$lSnPKBt3mzXqz)jSyVqU-0WpyiY9~ld}!gd*;Kkp(zjmUiZdgQ zz0LQYZ~vm(4c}_MscKbfQu>QByUd{M(r3+UJyc=lTJBMIpsvrZy>2xVj&FDBR-HEk&Ix^5uz;KE>b z-?VFX-^#!z*Q(s#>4KzXI>7HvUDWYTGo_jniOtwrBk9}P9{Ff|c+!uZ3ZLk;{_)YoB0E^Qgm zm=@WK8Q)H(q-2D&=I2QZsaVM}ezo`Ty3e~obe8dF%(q%Dk}cyixAb%$wbFmRK9i+3 z+MDRGnpuz)%E&GHE_3D#gH%9U#m)X|xnYJ9OHY{6q3Tzx1tAA!s$l@{2>M^N>LqZFQE1#k_hI@N-vhNhF_%L2^JN)TeYgdeyR>`9JQ`$ie zbdBNWG%So5MdaFd)PY`1!o~c4UG|8Fw=j`v3dh3Tds6Tx1!fewF|Q4#iv~AZ;vQn& zV%q%To!bhonzk{Zn&ziPf30_@X1{mu3pJm7SW|5EtT5cUGm~{2*2bu~62J}bfe#cj zh-Rj5Rf~5nT^iRn70A;qIl^LfbqF=`DmA{OvO>h)ZCb!8<(B2*%kJdUc7w?5V{voG zzcPIf{jI>#vf-;r9z9UopPoj>xP(M_$d+Gvb=hg!4mq;g5}4y@`IXs4 z?2zr??RT$Nk4TAaCQSJr)VCNgWi0c$Y2V#>qsDXS-fz~Du@Z}ZdR_D+e@Cm}pG z9}Sico#QJ!y`Ft!^Fl{l+I5ZC{weMHZcO+s;m-$pKK34RJk*;vbhEAsl1?<*0Ld%J z)PW~y4<;x8e)8oFwEE1lh8* z)2K(7zEK{Sr%a;YBaco)3Mf7IOQ1W}d}jPkwt4meXkMjUZ|qI$e~3 zQy$)PHQ2VUQtrirI=^EjwFlN19F9p8DadZ!^=RAVqtHJVlz5iyl*YgXvs27z)~A#C zX5RwQ%M_SUxvs?&CNO`mFsYzUSlat?pW=|&lln&e&f=sz#ozqb95N5&lnboGA|JlB zaxLJ|p%yIqNbjo(kPdnktIkv3_!>fyiR9MNZxzM#|7k_Ca zP{cm&crG{e5FYP5d>A z#~qtz(@BEvJ!G+P!|=PylUMOZ68(S|_A(1uJYj!6D@YHqcy3r3bkSD#=@B%eW@eYu zNHnsJ&rL1OfOqWSgO8UbPR*`Fhm^*a_e4_ZZof(>)FR<=X&ok3rz=hG@^SU{PI@pm zF5DY>x3YkfJN(&Y^wzzGgr#%BiD~+d3t~}@r8K5D#zj@-e@Hs8c&RhvrYEgfn-1Ia)ck>hJb;GlS}h_m|C)pu5$pAAYpvJgb?#@iWBY z=1=E!*yrzS>xa6h*f`7@ygTlP3~s$6lb&BZ0$Dt=CGl#NPA$Y~G$=xHfn{mJur(On z(6y#UEt;tqp|}$3)9j_$m%cf7X)1oHXKH#gh3$E>jLPJbnuA&w&}7>PudJrDzLZEJO9!0a4|TE0prJzpNc*7hxC_MZ9nIZ_e--A}P_ z*AbH_b#<0&#{*^FvT$BiPPkDeB=OlwXEusyM{UhyH7J$OTJEfZXr#OEwfD@bho8&q z(g@R6P}4NY>zWKLWb&#+^I9L1WS+X4)Zv!2=+X71ijOn&8r6ryixHz^(cv|&AJbUX zWI_%Y%??Pck5UGiERbFq3bp51y6pSALDf&FkkL)RTKZa#%=f!*s!fQL9Ih)W zU83uuo#iGDjps^On;||6{1>6f#~)RBRSIb*katPzeSKIalx6i-;eFAvauU}mpQ4@Z# zKCein^~yvaA1&I6{;q!c+WACdl>nmEq&kZ>@?$0S_N}>0rZ0GU@7}-vCZxo+Ms%y^ zR@XSitdpzzGdgM8c;?I}#pGX}_2`#1CgujG=}u7Q~CeS}9*I zJuN*y8!l;|s7iVWF_5fxJ1C0kWN0H)+KE?r2ZE8v2?u|~{~tZ}+yG+8($3yXFxL6;s8zrVTRNO;N^hl6e!^EW02#7b0+XtA&^_Z04wL! z9yu;JdU^cTLFR!Ti$C+h1LOD(@(bv(xQ{O$ct*gf0K0H<2=w7-oT~EY92COkPynX|;x43y2i_9n`$PZ- z&(t80;<^GH{cZ$5ezOlgvJXBF;Oze^266;Ac;jDsSpghtC$%!3NfY45HUR?uN((<{ z!FLeZedHJu=*_O+3EP1=wmIN%{CM}LFM-~kAfK6V@iBn^%g&U2@Pd8hH|&Ft;czO* zcY*e`_P}q(c@`$f6DEH8}1_qu@AjF4hQzB5?=ZsLCJ%C=ri__U%C%{2Y|EhHk>dX z-G_c*AN`hsA33G_;9WQzh>INFVO>C; zVcX?8l)K6uJL^2_(3Z`%j|xR0ELeegr1|IVvZ`{1HDoC>17$IsgP&|4GeeF*i9 zhu}}IeduEW{9kc-u@8O4KJ;Dt;Nt+!POxEjw}F!nJO>iib&hb68aVjtU-s| z33&p>T^YbRcMB$rVL1B#z2HEQ<3p(Dc?6P>edr(WgJCpZS`goIkyp;2&02o!3Gh9d0H<}f>`r4t(C2!%Pj zLM+fodpo!j+!8pL>z@=*D;tyz6o$dT+@Nrj6UGfAA-0u2}k)pN6l{{a=@yFgnd3E*Kyf!0|$mf1z-KzCS2bSw~Jo396*22!%p$OT(_( z5e>D5p)Bp-5UApHO*su!1poz(EQ2bk5ExVxbpS|DLjh#Ha#c%S?kZGESy@*}52`08 ze^m((h;;yNUHFAUZ)0Hg_HYbD+fC8N!U?JicT#nNBXylHHYfz(M>t&e3UK_H0#q0{ z7)=z%sDMUU*&tK_IjSfiekhpTA3qVCCueC1fvW0h080j=4A_N@u^!AESc0~jk_!-G z9pFcT&=|O$H3kl|gs9+_r{V01b1wvDX$g##?O+H!vPK0##952L}T0xF*Z*4IU$tt&Ip8?oSnTj3Bb{BZz?~GVol&-chaH_@7Pe3eYg?!l%*O7IcP?Np*2BP1j`lDN zV2Rrv)0JE;pgPVdCmSRjzd*byz~2O4V~te?{Ef8%pf!NmITI-VP9GHfHhy8wt_pzT zoZx?=u*VBP5cVXsCj9muVlXEWa3>%$tk5_PZ6FbxF>qC+JsRVrb47kPh_i5ySVcH? zdjfW2a{`LnP^p7(Lb_32(1%0i7&pWIRV5LAd;L}Xo4WIK+ ze29f{A^<*u1Ot4{*(><3_-eb!VGvMl7{(E<=L{53D0Zjl;j*oi>aIa}aeu&eB8 z**gKX%<=zsbMKA@-kv{21iK6@FTqT(QV^;HutBh@{@NISM+O6TgyU@j(%;4sNN&6c zoYi_5=iOHS?Ft|e7@RxsB?zL5gdue+fa*3DjsHBG?is?`&gdiK|M4O#0&ktSF#l;7k5L3;y3x1}y^Xxtt@u z1cKFk*OLD$(|>Xd3bk;BVegAThPeOl-RZAA0NZ`vMF8900$0Sb3V=`%>IZK2-(3QO zO<*vZz|!y=lE4DYm9ftj*!zGzaEo-Z!rlq~Y zE#c$S;HKyA%fTkBAf_75gsQzr2rx-8ermI3{cE} z>Y&z^z-*UF+@=Eo>;}XN#`Odu7;rztJ|hX5I|3gdC)&aec=G!Xz@QKW05IE$U?SiM zh#>IjhXkJJAc9!8Ake_T3A=|tNicJB4BQ33T>L{FL=Y4X8;%Mx&~10IL}YS=$xcJt2>_`#m*FKX;}p?^2*-;-FGpnht? z-@9NRO}GI3`HO3yeozjOkALx}69_^6T09&6>}CQj0m6081Ps(~4g6h*Z6H5{a6m5> z23&>Hg}r_p`vJ5$;NNcht*LPEAO0w;b9ObXjNJ|Uwd!vE4F>#GP=76f7+gPSC)nri z;jd-_Ye}Aiw<{2JmlJu$SG#A9>+#evl5- z2hPEs54eC`6KMalJ^W_>2mPvh^n>qdK>KfkjwToY>ILmV@6ivw9{~9&Kte*l#~j?= z#o7<%6T}Qp2=dDk_9KD)PyE37YhbXOAAGL>@`LAagYBF@CiLuk=EA@nYYWH^zOMoK z*$IIG^9!^a%mc+e_Ji+fK>pZ2fyFBZ`N1Aw|4To_2Tup`mw_7}4@1}q{hw}+e(?Pu z$j|$S5I+Fz24Qi4A8UgU2oQRZfA6~nEG@Qy{r6pC+y%miEWx1~yFp;QSAR5sfwFd! zV&5xZTZjn02S4}HV&A9j#jvyt*cYZi8`$Ijy|hLE&0Y-4_l@wLz#e$Tw!7`6#qKXG zw%30*mGE2)drpZ5`N6(zAAXDhp8q~bh@bwk6@(7~18__r!F5E~g#k^RaR0>5{+E_v zAO4FlJV)am;d`dQH;%h%7pMf=Ti_?b1pjdZ(-XiyFz>;#ioIQedk@cn{|rXq`wftR YaB;7GHUR$@zu#>b%7 diff --git a/.flatpak-builder/cache/objects/9b/c1b3561572c59203dd638917634bb0f0cd8008e0db056510fb9f46fda05cbc.file b/.flatpak-builder/cache/objects/9b/c1b3561572c59203dd638917634bb0f0cd8008e0db056510fb9f46fda05cbc.file deleted file mode 100644 index b89a6da..0000000 --- a/.flatpak-builder/cache/objects/9b/c1b3561572c59203dd638917634bb0f0cd8008e0db056510fb9f46fda05cbc.file +++ /dev/null @@ -1,548 +0,0 @@ -""" -Module for using pyOpenSSL as a TLS backend. This module was relevant before -the standard library ``ssl`` module supported SNI, but now that we've dropped -support for Python 2.7 all relevant Python versions support SNI so -**this module is no longer recommended**. - -This needs the following packages installed: - -* `pyOpenSSL`_ (tested with 16.0.0) -* `cryptography`_ (minimum 1.3.4, from pyopenssl) -* `idna`_ (minimum 2.0) - -However, pyOpenSSL depends on cryptography, so while we use all three directly here we -end up having relatively few packages required. - -You can install them with the following command: - -.. code-block:: bash - - $ python -m pip install pyopenssl cryptography idna - -To activate certificate checking, call -:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code -before you begin making HTTP requests. This can be done in a ``sitecustomize`` -module, or at any other time before your application begins using ``urllib3``, -like this: - -.. code-block:: python - - try: - import urllib3.contrib.pyopenssl - urllib3.contrib.pyopenssl.inject_into_urllib3() - except ImportError: - pass - -.. _pyopenssl: https://www.pyopenssl.org -.. _cryptography: https://cryptography.io -.. _idna: https://github.com/kjd/idna -""" - -from __future__ import annotations - -import OpenSSL.SSL # type: ignore[import-untyped] -from cryptography import x509 - -try: - from cryptography.x509 import UnsupportedExtension # type: ignore[attr-defined] -except ImportError: - # UnsupportedExtension is gone in cryptography >= 2.1.0 - class UnsupportedExtension(Exception): # type: ignore[no-redef] - pass - - -import logging -import ssl -import typing -from io import BytesIO -from socket import socket as socket_cls -from socket import timeout - -from .. import util - -if typing.TYPE_CHECKING: - from OpenSSL.crypto import X509 # type: ignore[import-untyped] - - -__all__ = ["inject_into_urllib3", "extract_from_urllib3"] - -# Map from urllib3 to PyOpenSSL compatible parameter-values. -_openssl_versions: dict[int, int] = { - util.ssl_.PROTOCOL_TLS: OpenSSL.SSL.SSLv23_METHOD, # type: ignore[attr-defined] - util.ssl_.PROTOCOL_TLS_CLIENT: OpenSSL.SSL.SSLv23_METHOD, # type: ignore[attr-defined] - ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, -} - -if hasattr(ssl, "PROTOCOL_TLSv1_1") and hasattr(OpenSSL.SSL, "TLSv1_1_METHOD"): - _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD - -if hasattr(ssl, "PROTOCOL_TLSv1_2") and hasattr(OpenSSL.SSL, "TLSv1_2_METHOD"): - _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD - - -_stdlib_to_openssl_verify = { - ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, - ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, - ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER - + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, -} -_openssl_to_stdlib_verify = {v: k for k, v in _stdlib_to_openssl_verify.items()} - -# The SSLvX values are the most likely to be missing in the future -# but we check them all just to be sure. -_OP_NO_SSLv2_OR_SSLv3: int = getattr(OpenSSL.SSL, "OP_NO_SSLv2", 0) | getattr( - OpenSSL.SSL, "OP_NO_SSLv3", 0 -) -_OP_NO_TLSv1: int = getattr(OpenSSL.SSL, "OP_NO_TLSv1", 0) -_OP_NO_TLSv1_1: int = getattr(OpenSSL.SSL, "OP_NO_TLSv1_1", 0) -_OP_NO_TLSv1_2: int = getattr(OpenSSL.SSL, "OP_NO_TLSv1_2", 0) -_OP_NO_TLSv1_3: int = getattr(OpenSSL.SSL, "OP_NO_TLSv1_3", 0) - -_openssl_to_ssl_minimum_version: dict[int, int] = { - ssl.TLSVersion.MINIMUM_SUPPORTED: _OP_NO_SSLv2_OR_SSLv3, - ssl.TLSVersion.TLSv1: _OP_NO_SSLv2_OR_SSLv3, - ssl.TLSVersion.TLSv1_1: _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1, - ssl.TLSVersion.TLSv1_2: _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1 | _OP_NO_TLSv1_1, - ssl.TLSVersion.TLSv1_3: ( - _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1 | _OP_NO_TLSv1_1 | _OP_NO_TLSv1_2 - ), - ssl.TLSVersion.MAXIMUM_SUPPORTED: ( - _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1 | _OP_NO_TLSv1_1 | _OP_NO_TLSv1_2 - ), -} -_openssl_to_ssl_maximum_version: dict[int, int] = { - ssl.TLSVersion.MINIMUM_SUPPORTED: ( - _OP_NO_SSLv2_OR_SSLv3 - | _OP_NO_TLSv1 - | _OP_NO_TLSv1_1 - | _OP_NO_TLSv1_2 - | _OP_NO_TLSv1_3 - ), - ssl.TLSVersion.TLSv1: ( - _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1_1 | _OP_NO_TLSv1_2 | _OP_NO_TLSv1_3 - ), - ssl.TLSVersion.TLSv1_1: _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1_2 | _OP_NO_TLSv1_3, - ssl.TLSVersion.TLSv1_2: _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1_3, - ssl.TLSVersion.TLSv1_3: _OP_NO_SSLv2_OR_SSLv3, - ssl.TLSVersion.MAXIMUM_SUPPORTED: _OP_NO_SSLv2_OR_SSLv3, -} - -# OpenSSL will only write 16K at a time -SSL_WRITE_BLOCKSIZE = 16384 - -orig_util_SSLContext = util.ssl_.SSLContext - - -log = logging.getLogger(__name__) - - -def inject_into_urllib3() -> None: - "Monkey-patch urllib3 with PyOpenSSL-backed SSL-support." - - _validate_dependencies_met() - - util.SSLContext = PyOpenSSLContext # type: ignore[assignment] - util.ssl_.SSLContext = PyOpenSSLContext # type: ignore[assignment] - util.IS_PYOPENSSL = True - util.ssl_.IS_PYOPENSSL = True - - -def extract_from_urllib3() -> None: - "Undo monkey-patching by :func:`inject_into_urllib3`." - - util.SSLContext = orig_util_SSLContext - util.ssl_.SSLContext = orig_util_SSLContext - util.IS_PYOPENSSL = False - util.ssl_.IS_PYOPENSSL = False - - -def _validate_dependencies_met() -> None: - """ - Verifies that PyOpenSSL's package-level dependencies have been met. - Throws `ImportError` if they are not met. - """ - # Method added in `cryptography==1.1`; not available in older versions - from cryptography.x509.extensions import Extensions - - if getattr(Extensions, "get_extension_for_class", None) is None: - raise ImportError( - "'cryptography' module missing required functionality. " - "Try upgrading to v1.3.4 or newer." - ) - - # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 - # attribute is only present on those versions. - from OpenSSL.crypto import X509 - - x509 = X509() - if getattr(x509, "_x509", None) is None: - raise ImportError( - "'pyOpenSSL' module missing required functionality. " - "Try upgrading to v0.14 or newer." - ) - - -def _dnsname_to_stdlib(name: str) -> str | None: - """ - Converts a dNSName SubjectAlternativeName field to the form used by the - standard library on the given Python version. - - Cryptography produces a dNSName as a unicode string that was idna-decoded - from ASCII bytes. We need to idna-encode that string to get it back, and - then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib - uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). - - If the name cannot be idna-encoded then we return None signalling that - the name given should be skipped. - """ - - def idna_encode(name: str) -> bytes | None: - """ - Borrowed wholesale from the Python Cryptography Project. It turns out - that we can't just safely call `idna.encode`: it can explode for - wildcard names. This avoids that problem. - """ - import idna - - try: - for prefix in ["*.", "."]: - if name.startswith(prefix): - name = name[len(prefix) :] - return prefix.encode("ascii") + idna.encode(name) - return idna.encode(name) - except idna.core.IDNAError: - return None - - # Don't send IPv6 addresses through the IDNA encoder. - if ":" in name: - return name - - encoded_name = idna_encode(name) - if encoded_name is None: - return None - return encoded_name.decode("utf-8") - - -def get_subj_alt_name(peer_cert: X509) -> list[tuple[str, str]]: - """ - Given an PyOpenSSL certificate, provides all the subject alternative names. - """ - cert = peer_cert.to_cryptography() - - # We want to find the SAN extension. Ask Cryptography to locate it (it's - # faster than looping in Python) - try: - ext = cert.extensions.get_extension_for_class(x509.SubjectAlternativeName).value - except x509.ExtensionNotFound: - # No such extension, return the empty list. - return [] - except ( - x509.DuplicateExtension, - UnsupportedExtension, - x509.UnsupportedGeneralNameType, - UnicodeError, - ) as e: - # A problem has been found with the quality of the certificate. Assume - # no SAN field is present. - log.warning( - "A problem was encountered with the certificate that prevented " - "urllib3 from finding the SubjectAlternativeName field. This can " - "affect certificate validation. The error was %s", - e, - ) - return [] - - # We want to return dNSName and iPAddress fields. We need to cast the IPs - # back to strings because the match_hostname function wants them as - # strings. - # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 - # decoded. This is pretty frustrating, but that's what the standard library - # does with certificates, and so we need to attempt to do the same. - # We also want to skip over names which cannot be idna encoded. - names = [ - ("DNS", name) - for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) - if name is not None - ] - names.extend( - ("IP Address", str(name)) for name in ext.get_values_for_type(x509.IPAddress) - ) - - return names - - -class WrappedSocket: - """API-compatibility wrapper for Python OpenSSL's Connection-class.""" - - def __init__( - self, - connection: OpenSSL.SSL.Connection, - socket: socket_cls, - suppress_ragged_eofs: bool = True, - ) -> None: - self.connection = connection - self.socket = socket - self.suppress_ragged_eofs = suppress_ragged_eofs - self._io_refs = 0 - self._closed = False - - def fileno(self) -> int: - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self) -> None: - if self._io_refs > 0: - self._io_refs -= 1 - if self._closed: - self.close() - - def recv(self, *args: typing.Any, **kwargs: typing.Any) -> bytes: - try: - data = self.connection.recv(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): - return b"" - else: - raise OSError(e.args[0], str(e)) from e - except OpenSSL.SSL.ZeroReturnError: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return b"" - else: - raise - except OpenSSL.SSL.WantReadError as e: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout("The read operation timed out") from e - else: - return self.recv(*args, **kwargs) - - # TLS 1.3 post-handshake authentication - except OpenSSL.SSL.Error as e: - raise ssl.SSLError(f"read error: {e!r}") from e - else: - return data # type: ignore[no-any-return] - - def recv_into(self, *args: typing.Any, **kwargs: typing.Any) -> int: - try: - return self.connection.recv_into(*args, **kwargs) # type: ignore[no-any-return] - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): - return 0 - else: - raise OSError(e.args[0], str(e)) from e - except OpenSSL.SSL.ZeroReturnError: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return 0 - else: - raise - except OpenSSL.SSL.WantReadError as e: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout("The read operation timed out") from e - else: - return self.recv_into(*args, **kwargs) - - # TLS 1.3 post-handshake authentication - except OpenSSL.SSL.Error as e: - raise ssl.SSLError(f"read error: {e!r}") from e - - def settimeout(self, timeout: float) -> None: - return self.socket.settimeout(timeout) - - def _send_until_done(self, data: bytes) -> int: - while True: - try: - return self.connection.send(data) # type: ignore[no-any-return] - except OpenSSL.SSL.WantWriteError as e: - if not util.wait_for_write(self.socket, self.socket.gettimeout()): - raise timeout() from e - continue - except OpenSSL.SSL.SysCallError as e: - raise OSError(e.args[0], str(e)) from e - - def sendall(self, data: bytes) -> None: - total_sent = 0 - while total_sent < len(data): - sent = self._send_until_done( - data[total_sent : total_sent + SSL_WRITE_BLOCKSIZE] - ) - total_sent += sent - - def shutdown(self) -> None: - # FIXME rethrow compatible exceptions should we ever use this - self.connection.shutdown() - - def close(self) -> None: - self._closed = True - if self._io_refs <= 0: - self._real_close() - - def _real_close(self) -> None: - try: - return self.connection.close() # type: ignore[no-any-return] - except OpenSSL.SSL.Error: - return - - def getpeercert( - self, binary_form: bool = False - ) -> dict[str, list[typing.Any]] | None: - x509 = self.connection.get_peer_certificate() - - if not x509: - return x509 # type: ignore[no-any-return] - - if binary_form: - return OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, x509) # type: ignore[no-any-return] - - return { - "subject": ((("commonName", x509.get_subject().CN),),), # type: ignore[dict-item] - "subjectAltName": get_subj_alt_name(x509), - } - - def version(self) -> str: - return self.connection.get_protocol_version_name() # type: ignore[no-any-return] - - -WrappedSocket.makefile = socket_cls.makefile # type: ignore[attr-defined] - - -class PyOpenSSLContext: - """ - I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible - for translating the interface of the standard library ``SSLContext`` object - to calls into PyOpenSSL. - """ - - def __init__(self, protocol: int) -> None: - self.protocol = _openssl_versions[protocol] - self._ctx = OpenSSL.SSL.Context(self.protocol) - self._options = 0 - self.check_hostname = False - self._minimum_version: int = ssl.TLSVersion.MINIMUM_SUPPORTED - self._maximum_version: int = ssl.TLSVersion.MAXIMUM_SUPPORTED - - @property - def options(self) -> int: - return self._options - - @options.setter - def options(self, value: int) -> None: - self._options = value - self._set_ctx_options() - - @property - def verify_mode(self) -> int: - return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] - - @verify_mode.setter - def verify_mode(self, value: ssl.VerifyMode) -> None: - self._ctx.set_verify(_stdlib_to_openssl_verify[value], _verify_callback) - - def set_default_verify_paths(self) -> None: - self._ctx.set_default_verify_paths() - - def set_ciphers(self, ciphers: bytes | str) -> None: - if isinstance(ciphers, str): - ciphers = ciphers.encode("utf-8") - self._ctx.set_cipher_list(ciphers) - - def load_verify_locations( - self, - cafile: str | None = None, - capath: str | None = None, - cadata: bytes | None = None, - ) -> None: - if cafile is not None: - cafile = cafile.encode("utf-8") # type: ignore[assignment] - if capath is not None: - capath = capath.encode("utf-8") # type: ignore[assignment] - try: - self._ctx.load_verify_locations(cafile, capath) - if cadata is not None: - self._ctx.load_verify_locations(BytesIO(cadata)) - except OpenSSL.SSL.Error as e: - raise ssl.SSLError(f"unable to load trusted certificates: {e!r}") from e - - def load_cert_chain( - self, - certfile: str, - keyfile: str | None = None, - password: str | None = None, - ) -> None: - try: - self._ctx.use_certificate_chain_file(certfile) - if password is not None: - if not isinstance(password, bytes): - password = password.encode("utf-8") # type: ignore[assignment] - self._ctx.set_passwd_cb(lambda *_: password) - self._ctx.use_privatekey_file(keyfile or certfile) - except OpenSSL.SSL.Error as e: - raise ssl.SSLError(f"Unable to load certificate chain: {e!r}") from e - - def set_alpn_protocols(self, protocols: list[bytes | str]) -> None: - protocols = [util.util.to_bytes(p, "ascii") for p in protocols] - return self._ctx.set_alpn_protos(protocols) # type: ignore[no-any-return] - - def wrap_socket( - self, - sock: socket_cls, - server_side: bool = False, - do_handshake_on_connect: bool = True, - suppress_ragged_eofs: bool = True, - server_hostname: bytes | str | None = None, - ) -> WrappedSocket: - cnx = OpenSSL.SSL.Connection(self._ctx, sock) - - # If server_hostname is an IP, don't use it for SNI, per RFC6066 Section 3 - if server_hostname and not util.ssl_.is_ipaddress(server_hostname): - if isinstance(server_hostname, str): - server_hostname = server_hostname.encode("utf-8") - cnx.set_tlsext_host_name(server_hostname) - - cnx.set_connect_state() - - while True: - try: - cnx.do_handshake() - except OpenSSL.SSL.WantReadError as e: - if not util.wait_for_read(sock, sock.gettimeout()): - raise timeout("select timed out") from e - continue - except OpenSSL.SSL.Error as e: - raise ssl.SSLError(f"bad handshake: {e!r}") from e - break - - return WrappedSocket(cnx, sock) - - def _set_ctx_options(self) -> None: - self._ctx.set_options( - self._options - | _openssl_to_ssl_minimum_version[self._minimum_version] - | _openssl_to_ssl_maximum_version[self._maximum_version] - ) - - @property - def minimum_version(self) -> int: - return self._minimum_version - - @minimum_version.setter - def minimum_version(self, minimum_version: int) -> None: - self._minimum_version = minimum_version - self._set_ctx_options() - - @property - def maximum_version(self) -> int: - return self._maximum_version - - @maximum_version.setter - def maximum_version(self, maximum_version: int) -> None: - self._maximum_version = maximum_version - self._set_ctx_options() - - -def _verify_callback( - cnx: OpenSSL.SSL.Connection, - x509: X509, - err_no: int, - err_depth: int, - return_code: int, -) -> bool: - return err_no == 0 diff --git a/.flatpak-builder/cache/objects/9b/d3923da5fda855a006a5a2dd3a26cc5405a82527219ad7ee5ba81d3ccf902b.file b/.flatpak-builder/cache/objects/9b/d3923da5fda855a006a5a2dd3a26cc5405a82527219ad7ee5ba81d3ccf902b.file deleted file mode 100644 index 063e29e7a3e05057cd70acc9c3ffb6a8a8bbf385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684 zcmY*WO^eh(5bb=7ySDC8VfIv)WgQt4mc5D~q9Cku&^_(J*psfzG@EqCPRBJKWCRZ* zcoh5xE8;&8@i#1f(e-q% zmCf1u^_4_7^hJx|)UNK?V;Oj!w>(F^a7o;8nRuHgr2p^xEx0g$_9f__1pTk!`PuFH a)_m*L_Ur8zqnD#u`z!+zZrab9TEyQ8FwzJB diff --git a/.flatpak-builder/cache/objects/9c/317d6ce157ddd7e5a6cbdf8fcadbf719d21c63badeb5c005a94b3e2f4f3b6c.file b/.flatpak-builder/cache/objects/9c/317d6ce157ddd7e5a6cbdf8fcadbf719d21c63badeb5c005a94b3e2f4f3b6c.file deleted file mode 100644 index 61b252c3bf0bc578c3ee5c8f7154c31258555d8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101507 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 diff --git a/.flatpak-builder/cache/objects/9e/45a0ac263a712d7fa9398dda6ff0e104c82896412349001e77e7957cddedf9.file b/.flatpak-builder/cache/objects/9e/45a0ac263a712d7fa9398dda6ff0e104c82896412349001e77e7957cddedf9.file deleted file mode 100644 index 740d7bde48aeec0ff0cec0b84fa59b3e631918ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34745 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. -# -# SPDX-License-Identifier: GPL-3.0-or-later - -import os -import sys -import signal -import locale -import gettext - -VERSION = '0.4.0' -pkgdatadir = '/app/share/Alpaca' -localedir = '/app/share/locale' - -sys.path.insert(1, pkgdatadir) -signal.signal(signal.SIGINT, signal.SIG_DFL) -locale.bindtextdomain('alpaca', localedir) -locale.textdomain('alpaca') -gettext.install('alpaca', localedir) - -if __name__ == '__main__': - import gi - - from gi.repository import Gio - resource = Gio.Resource.load(os.path.join(pkgdatadir, 'alpaca.gresource')) - resource._register() - - from alpaca import main - sys.exit(main.main(VERSION)) diff --git a/.flatpak-builder/cache/objects/9f/6256fd41ffd57371b6febb6fbdf717c05a0aede813712859bc5cc45f9fd8a8.dirtree b/.flatpak-builder/cache/objects/9f/6256fd41ffd57371b6febb6fbdf717c05a0aede813712859bc5cc45f9fd8a8.dirtree deleted file mode 100644 index 627610e4c7da6aa63be8007fd2be49b2de5ea62e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmc~y&d<{=$wRGcU2`z~ z^ET$Et;gTJ+gAE(iO|(I#oshLUUTP!bZBrCCnx44Cgr3u=+$%lo7*dYa^s{RwIV70 zw^QCZe~Qhx_+*})S8b}qbS6SZX>t}<<|gImWF|A*p0CC4@QJs4V<5ka<4n`34f373 ZyBD;Tu`El-JAP)~Bf>^`O?_a@001_jgZ=;j diff --git a/.flatpak-builder/cache/objects/9f/b25e6e14e089cddb47fecfcc15a0e02dd3a8bb55f73f26eb6a15b3440c50aa.file b/.flatpak-builder/cache/objects/9f/b25e6e14e089cddb47fecfcc15a0e02dd3a8bb55f73f26eb6a15b3440c50aa.file deleted file mode 100644 index 1b59773c2a64935b26281d73e39a22d97a71ad18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2151 zcmeHIL2DaF6rS1DYFAR$QsmgOt=3+r$E^u#1a#GsawwJjji*gvKVsT;nVGCuww)~4`VDFp z$f{ZR_{L6!__)@MIE)&uvAV;E<7>n&l&zw@-VOJrvt^t3K|*PnI)0E6R;9MDh~UDL z#q%$rAUt5>BMtM7Fp&M`A|~~9gbqMIJhrLiqTK1|!1JP=S*D)&EX+bDmWvMHn}^5W z-BkL%Z_#~e(6@(O>`1OelP=olD}SoFxPmQ+04YBR46Zqcp7+)P8B&GV{qEoaTX4(ZpBQWL55aEY-sjl%7 z_yPXDujTW$xkd7Ms0^jsm-5pQxg1^_!!Wv+(q^TSE)`ePl^wQGwio9Y7Sc|U zk&6|;fVobbbd{FCznHGFVo8Yk%8swGa$Z!KCLj~f>wE=b7yTYYTKvxR*Y7peWJ^tU zkgQzA?P#p7J<=2R@cqT6KGo8vItau3qoIU1_U4b)!-dBBgZ0+@6|kT;hn8DI%bvE} zR--)dEqv!vZ-hj*Yqx6mG;i#c{mjGb-fP!?+Njr>(M&6v@w7}ka_08Zt)(w6e|gyp zj2yv=5RHNOAB+4b{@PAsk?P=0sWb|MI5Gh+dX}4UE`~w)L5pxa(Gf8E7^0)X1AqW9 z(j*u>^b{O&O?AAbjz0y5*PHruOP~Hv;6TUtLM2w|PVj5;;Z@Ti*J=e);q3PjaGW4B z^*wxapFv7{_$A=|&oDgFHmb=Vpl#g1*_7n#`8?}0H{AQ7?IPPanMuj?1xQIJ zxiCNs)=s5_nnj1um%%l~-OC_$Q70T!;_XPR6`9;$^&%Ibx8sRl;^%*kpWmm=_*^SK z=bf2r4-MBNe>{$zt1E5&Y+b5{dOt^lEPKWb`Yw1uPD$BpO6$=Or_>%7@d!akRA^yt za$@^;k^E-U* e4(`YyJla9e5EK94pG3xNM~&ck2mPH8YyT5p-O)?{ diff --git a/.flatpak-builder/cache/objects/a0/5ce66a86a4e4f62178a7442877c8cce4e7886e82c3b3f31f93ad8128178921.file b/.flatpak-builder/cache/objects/a0/5ce66a86a4e4f62178a7442877c8cce4e7886e82c3b3f31f93ad8128178921.file deleted file mode 100644 index 0a86ce31b971cc84a813355a13ba94c7b04ea814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4478 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 LAyZUXJo+L4r7m#! diff --git a/.flatpak-builder/cache/objects/a0/aac3800a55b071b711cb92dceec9554d936475767cedc038339bb8c20f4149.file b/.flatpak-builder/cache/objects/a0/aac3800a55b071b711cb92dceec9554d936475767cedc038339bb8c20f4149.file deleted file mode 100644 index ca287414be8b407c9e72857b8788a6e54a2805ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42204 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 diff --git a/.flatpak-builder/cache/objects/a1/627eb90640296ad20064f2726614bee3bd6c526e1ad2d9c2508c35f9f72d06.file b/.flatpak-builder/cache/objects/a1/627eb90640296ad20064f2726614bee3bd6c526e1ad2d9c2508c35f9f72d06.file deleted file mode 100644 index 4dec013933406ffd940068bb0a694ff200961d3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7110 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 tJI^q=PQtV(x8|fqVaI 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 J{Z%Iq`ky;9w-5jT diff --git a/.flatpak-builder/cache/objects/a4/d56f53b8d2abb2affc1ed8410348c3f12bc3e1caee8e05e3f6fd02dc82c9d3.dirtree b/.flatpak-builder/cache/objects/a4/d56f53b8d2abb2affc1ed8410348c3f12bc3e1caee8e05e3f6fd02dc82c9d3.dirtree deleted file mode 100644 index 34ada8e37a5565aa38d973d8788c6397638f8cdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmVm0Bm&C?T93vyl?TQQy7v3@ioMy$OBqR?vu`l!@5X+!3s@9 zR6#^RR6zjEJd+FRYmUYXn;z0*jx#>52d95)5CA!cQI@#X5PQ@KQbj{gQbYhhGu18E z%JIUn(T(hoBaYg&*ty9IjrR|JBWzK4ecGJ|S4c%gOaO!^uVmqsIS=bI2`4Kw?F~5n zN;^Sr#3*JbCpAJVyAK8{RehvvX=7z>b7gY?v>w#cakwVey8DB!M^xsgdt{!)INjW` vcPA0RDg+;BL~0K48+^fM^R@%!g~#shwsrcX64mT;_9=+#3v5(~DG5uc*Pm|L diff --git a/.flatpak-builder/cache/objects/a5/82585b49b87c76e44f09b2a51aa0c458aab36d8e98a043ca4fddc9ed72b12f.file b/.flatpak-builder/cache/objects/a5/82585b49b87c76e44f09b2a51aa0c458aab36d8e98a043ca4fddc9ed72b12f.file deleted file mode 100644 index 7a50a0a..0000000 --- a/.flatpak-builder/cache/objects/a5/82585b49b87c76e44f09b2a51aa0c458aab36d8e98a043ca4fddc9ed72b12f.file +++ /dev/null @@ -1,23 +0,0 @@ -[Application] -name=com.jeffser.Alpaca -runtime=org.gnome.Platform/x86_64/46 -sdk=org.gnome.Sdk/x86_64/46 -command=alpaca - -[Context] -shared=network;ipc; -sockets=x11;wayland;fallback-x11; -devices=dri; - -[Extension com.jeffser.Alpaca.Locale] -directory=share/runtime/locale -autodelete=true -locale-subset=true - -[Extension com.jeffser.Alpaca.Debug] -directory=lib/debug -autodelete=true -no-autodownload=true - -[Build] -built-extensions=com.jeffser.Alpaca.Locale;com.jeffser.Alpaca.Debug; \ No newline at end of file diff --git a/.flatpak-builder/cache/objects/a7/0e40e7b83fde4c39516017cc925c35c12a23c3b5cbb0c87326d03c261de19e.file b/.flatpak-builder/cache/objects/a7/0e40e7b83fde4c39516017cc925c35c12a23c3b5cbb0c87326d03c261de19e.file deleted file mode 100644 index a0017375f61c4f322a38a5ddfec9eff8d87e87d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53561 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�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 diff --git a/.flatpak-builder/cache/objects/a8/19748c70201b6cfde066215a52324806182c99e095b8fb13f0d4d76db1cc3f.dirtree b/.flatpak-builder/cache/objects/a8/19748c70201b6cfde066215a52324806182c99e095b8fb13f0d4d76db1cc3f.dirtree deleted file mode 100644 index 7bfee4333d7ec632478874c38408f54d904b71a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72 zcmV-O0Jr~8NlXAE6{xtO(XD1+vg+xKq^AkakvymT-qZG9qU6#p?ii6oY7X%me8Fe) ewgcsb$L{X7b^4?d)$DWjDTwO}Y*dIO1V#XuWG1ix diff --git a/.flatpak-builder/cache/objects/a8/4b43506b1941a2f27c7c63f2610dc7efca1deab8befba1ded2840f2c7c698b.dirtree b/.flatpak-builder/cache/objects/a8/4b43506b1941a2f27c7c63f2610dc7efca1deab8befba1ded2840f2c7c698b.dirtree deleted file mode 100644 index 3816e76de171bed8ed5511f39fa7bdb8de9e6e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmV-S0JHySX=86}Z*l+-nz`OD!qWH}OwIWXx6@e9y(T3hD^0zwx@vzNqn9B>Y7X%m ie8Fe)wgcsb$L{X7b^4?d)$DWjDTwO}Y*dIS2uc8=b|sPk diff --git a/.flatpak-builder/cache/objects/a9/1c4babf6cb266ffc56f1f52cd445946511b4f2ce54ec2a857e593b2b712ec6.file b/.flatpak-builder/cache/objects/a9/1c4babf6cb266ffc56f1f52cd445946511b4f2ce54ec2a857e593b2b712ec6.file deleted file mode 100644 index fa9f2b3..0000000 --- a/.flatpak-builder/cache/objects/a9/1c4babf6cb266ffc56f1f52cd445946511b4f2ce54ec2a857e593b2b712ec6.file +++ /dev/null @@ -1,280 +0,0 @@ -from __future__ import annotations - -import io -import socket -import ssl -import typing - -from ..exceptions import ProxySchemeUnsupported - -if typing.TYPE_CHECKING: - from typing import Literal - - from .ssl_ import _TYPE_PEER_CERT_RET, _TYPE_PEER_CERT_RET_DICT - - -_SelfT = typing.TypeVar("_SelfT", bound="SSLTransport") -_WriteBuffer = typing.Union[bytearray, memoryview] -_ReturnValue = typing.TypeVar("_ReturnValue") - -SSL_BLOCKSIZE = 16384 - - -class SSLTransport: - """ - The SSLTransport wraps an existing socket and establishes an SSL connection. - - Contrary to Python's implementation of SSLSocket, it allows you to chain - multiple TLS connections together. It's particularly useful if you need to - implement TLS within TLS. - - The class supports most of the socket API operations. - """ - - @staticmethod - def _validate_ssl_context_for_tls_in_tls(ssl_context: ssl.SSLContext) -> None: - """ - Raises a ProxySchemeUnsupported if the provided ssl_context can't be used - for TLS in TLS. - - The only requirement is that the ssl_context provides the 'wrap_bio' - methods. - """ - - if not hasattr(ssl_context, "wrap_bio"): - raise ProxySchemeUnsupported( - "TLS in TLS requires SSLContext.wrap_bio() which isn't " - "available on non-native SSLContext" - ) - - def __init__( - self, - socket: socket.socket, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - suppress_ragged_eofs: bool = True, - ) -> None: - """ - Create an SSLTransport around socket using the provided ssl_context. - """ - self.incoming = ssl.MemoryBIO() - self.outgoing = ssl.MemoryBIO() - - self.suppress_ragged_eofs = suppress_ragged_eofs - self.socket = socket - - self.sslobj = ssl_context.wrap_bio( - self.incoming, self.outgoing, server_hostname=server_hostname - ) - - # Perform initial handshake. - self._ssl_io_loop(self.sslobj.do_handshake) - - def __enter__(self: _SelfT) -> _SelfT: - return self - - def __exit__(self, *_: typing.Any) -> None: - self.close() - - def fileno(self) -> int: - return self.socket.fileno() - - def read(self, len: int = 1024, buffer: typing.Any | None = None) -> int | bytes: - return self._wrap_ssl_read(len, buffer) - - def recv(self, buflen: int = 1024, flags: int = 0) -> int | bytes: - if flags != 0: - raise ValueError("non-zero flags not allowed in calls to recv") - return self._wrap_ssl_read(buflen) - - def recv_into( - self, - buffer: _WriteBuffer, - nbytes: int | None = None, - flags: int = 0, - ) -> None | int | bytes: - if flags != 0: - raise ValueError("non-zero flags not allowed in calls to recv_into") - if nbytes is None: - nbytes = len(buffer) - return self.read(nbytes, buffer) - - def sendall(self, data: bytes, flags: int = 0) -> None: - if flags != 0: - raise ValueError("non-zero flags not allowed in calls to sendall") - count = 0 - with memoryview(data) as view, view.cast("B") as byte_view: - amount = len(byte_view) - while count < amount: - v = self.send(byte_view[count:]) - count += v - - def send(self, data: bytes, flags: int = 0) -> int: - if flags != 0: - raise ValueError("non-zero flags not allowed in calls to send") - return self._ssl_io_loop(self.sslobj.write, data) - - def makefile( - self, - mode: str, - buffering: int | None = None, - *, - encoding: str | None = None, - errors: str | None = None, - newline: str | None = None, - ) -> typing.BinaryIO | typing.TextIO | socket.SocketIO: - """ - Python's httpclient uses makefile and buffered io when reading HTTP - messages and we need to support it. - - This is unfortunately a copy and paste of socket.py makefile with small - changes to point to the socket directly. - """ - if not set(mode) <= {"r", "w", "b"}: - raise ValueError(f"invalid mode {mode!r} (only r, w, b allowed)") - - writing = "w" in mode - reading = "r" in mode or not writing - assert reading or writing - binary = "b" in mode - rawmode = "" - if reading: - rawmode += "r" - if writing: - rawmode += "w" - raw = socket.SocketIO(self, rawmode) # type: ignore[arg-type] - self.socket._io_refs += 1 # type: ignore[attr-defined] - if buffering is None: - buffering = -1 - if buffering < 0: - buffering = io.DEFAULT_BUFFER_SIZE - if buffering == 0: - if not binary: - raise ValueError("unbuffered streams must be binary") - return raw - buffer: typing.BinaryIO - if reading and writing: - buffer = io.BufferedRWPair(raw, raw, buffering) # type: ignore[assignment] - elif reading: - buffer = io.BufferedReader(raw, buffering) - else: - assert writing - buffer = io.BufferedWriter(raw, buffering) - if binary: - return buffer - text = io.TextIOWrapper(buffer, encoding, errors, newline) - text.mode = mode # type: ignore[misc] - return text - - def unwrap(self) -> None: - self._ssl_io_loop(self.sslobj.unwrap) - - def close(self) -> None: - self.socket.close() - - @typing.overload - def getpeercert( - self, binary_form: Literal[False] = ... - ) -> _TYPE_PEER_CERT_RET_DICT | None: - ... - - @typing.overload - def getpeercert(self, binary_form: Literal[True]) -> bytes | None: - ... - - def getpeercert(self, binary_form: bool = False) -> _TYPE_PEER_CERT_RET: - return self.sslobj.getpeercert(binary_form) # type: ignore[return-value] - - def version(self) -> str | None: - return self.sslobj.version() - - def cipher(self) -> tuple[str, str, int] | None: - return self.sslobj.cipher() - - def selected_alpn_protocol(self) -> str | None: - return self.sslobj.selected_alpn_protocol() - - def selected_npn_protocol(self) -> str | None: - return self.sslobj.selected_npn_protocol() - - def shared_ciphers(self) -> list[tuple[str, str, int]] | None: - return self.sslobj.shared_ciphers() - - def compression(self) -> str | None: - return self.sslobj.compression() - - def settimeout(self, value: float | None) -> None: - self.socket.settimeout(value) - - def gettimeout(self) -> float | None: - return self.socket.gettimeout() - - def _decref_socketios(self) -> None: - self.socket._decref_socketios() # type: ignore[attr-defined] - - def _wrap_ssl_read(self, len: int, buffer: bytearray | None = None) -> int | bytes: - try: - return self._ssl_io_loop(self.sslobj.read, len, buffer) - except ssl.SSLError as e: - if e.errno == ssl.SSL_ERROR_EOF and self.suppress_ragged_eofs: - return 0 # eof, return 0. - else: - raise - - # func is sslobj.do_handshake or sslobj.unwrap - @typing.overload - def _ssl_io_loop(self, func: typing.Callable[[], None]) -> None: - ... - - # func is sslobj.write, arg1 is data - @typing.overload - def _ssl_io_loop(self, func: typing.Callable[[bytes], int], arg1: bytes) -> int: - ... - - # func is sslobj.read, arg1 is len, arg2 is buffer - @typing.overload - def _ssl_io_loop( - self, - func: typing.Callable[[int, bytearray | None], bytes], - arg1: int, - arg2: bytearray | None, - ) -> bytes: - ... - - def _ssl_io_loop( - self, - func: typing.Callable[..., _ReturnValue], - arg1: None | bytes | int = None, - arg2: bytearray | None = None, - ) -> _ReturnValue: - """Performs an I/O loop between incoming/outgoing and the socket.""" - should_loop = True - ret = None - - while should_loop: - errno = None - try: - if arg1 is None and arg2 is None: - ret = func() - elif arg2 is None: - ret = func(arg1) - else: - ret = func(arg1, arg2) - except ssl.SSLError as e: - if e.errno not in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): - # WANT_READ, and WANT_WRITE are expected, others are not. - raise e - errno = e.errno - - buf = self.outgoing.read() - self.socket.sendall(buf) - - if errno is None: - should_loop = False - elif errno == ssl.SSL_ERROR_WANT_READ: - buf = self.socket.recv(SSL_BLOCKSIZE) - if buf: - self.incoming.write(buf) - else: - self.incoming.write_eof() - return typing.cast(_ReturnValue, ret) diff --git a/.flatpak-builder/cache/objects/a9/2eeb5468084a7d6bb9b011ce3e0c30ea7eefb56e9363490e563be60b7d3a48.file b/.flatpak-builder/cache/objects/a9/2eeb5468084a7d6bb9b011ce3e0c30ea7eefb56e9363490e563be60b7d3a48.file deleted file mode 100644 index 09e0f0fe0ea2ec7b7854dd95300281b653931ef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmZ3^%ge>gz`(Fz*@hP1PL=$}KsFqJBtYP^1(2A|kirnfkirKA90r0NzVCTAz6rxxocXCxLCrB#!_9 diff --git a/.flatpak-builder/cache/objects/a9/f4c0d4808bd21d39db033d468450162953f323def0a4daa9ae0165eaeb8ced.file b/.flatpak-builder/cache/objects/a9/f4c0d4808bd21d39db033d468450162953f323def0a4daa9ae0165eaeb8ced.file deleted file mode 100644 index da8e172806dbeabbd1c9ae182f1e05454bb12ad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43685 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%0AIo*ldolQ`~qbX?UmYLbE`bw=q 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
KQdyAQvP2J58o{yps`b5b%NanY?p( zzJ)jY7v8LU7&QSITfxid5D;%V@=oRXrY!YOS*jmqbOeYkIpa)*Z}uwx>{WU*qZSKv z7o)p@xJw>7cgUBr!Jo20zlYJiK)fxAJQL}gvBE!Ng?=BSO=E&xR)`T?qF02M2ClGcAnemTXc(m z(JguvBNd3ga6FfBKEs!qvRSu`RhFjpB!^!6;`sQZxyOgQ-^GPXyPcsS?Be3o z9y<)H+P8RvfAIzmR-ZfUTfEV~c;ofkMrKXJfw&1X8CO=)yAJxNr-(wujhc|F?;abs z95HZo;q)tWad)KZ^mK%TWYEzUC`qZ^OFoWpUW|ynZVyii`?CTE;`-RJlOPC37f$O0 zeVQ^msVnbd#Msun>tVJrtMDfU$E+HN9)C3AXvxu%&N-b^pPu83pXZOC$1{g7I>{fM z)a~*`r(chXut)w`fpa}PayH6dG$_gL- z=#e{ZX<;8njO&kC?Tc9rR}U94zlj*%AG_KYyBe-;7ctkxHs;vjqnaK?K@7?V-A5br1PbEv&iIhNQz;Jjb`ZDS7qcC%KAqxlWoLxkOp3#89mK8l#jJ#@&!#wB z)Ir>0U(8~-`do^`9i0(!^C)gU#ogqKxv4+qCOt{S=?akrqewEvEgTiMh~gHHic6um zB@|cYiz(}mDbtry9B$!^KUQL34ZmbX!S2j$^_AnDy9pd`qGkozG zaB<6lQixj)h%NEOm%!C)IaXY7Kx~dLJ_oK|&#~feL)`JjoilV7M~E8@ak?^YB2zCgQlR^{rv!;zWWtkpRAFNf=%_1B( z?Zo2#2}vKv%{qGT_1cknP^G8r3 zgBSiu!Vg0i{siHNl?(q=;fHk#|8(JpRSW-2;TLz$kmqdS7gl_1w?0?+VZD=%7wGeZ zA66@5l7xSO5;y(hn8_cnjNLPYRu)>nMcAtzzw5Y0} zqi?arp#TLAM#Lo;@Md8&O*&a)93K}dQ&#!#H&YWo<`V&lDC82L#T| zM8riIk!XTI69j_eu@MuO2u!RtjF|XRbv&eFMLKbFQ#e&zn)s3lwJ}?mSlhdM!5oVIuZ9xT&oqMMtnt2U8X bool: - """Ask a yes/no question via input() and return their answer. - - "question" is a string that is presented to the user. - "default" is the presumed answer if the user just hits . - It must be "yes" (the default), "no" or None (meaning - an answer is required of the user). - - The "answer" return value is True for "yes" or False for "no". - - Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input - """ - valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} - if default is None: - prompt = " [y/n] " - elif default == "yes": - prompt = " [Y/n] " - elif default == "no": - prompt = " [y/N] " - else: - raise ValueError("invalid default answer: '%s'" % default) - - while True: - sys.stdout.write(question + prompt) - choice = input().lower() - if default is not None and choice == "": - return valid[default] - elif choice in valid: - return valid[choice] - else: - sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") - - -def cli_detect(argv: Optional[List[str]] = None) -> int: - """ - CLI assistant using ARGV and ArgumentParser - :param argv: - :return: 0 if everything is fine, anything else equal trouble - """ - parser = argparse.ArgumentParser( - description="The Real First Universal Charset Detector. " - "Discover originating encoding used on text file. " - "Normalize text to unicode." - ) - - parser.add_argument( - "files", type=argparse.FileType("rb"), nargs="+", help="File(s) to be analysed" - ) - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - dest="verbose", - help="Display complementary information about file if any. " - "Stdout will contain logs about the detection process.", - ) - parser.add_argument( - "-a", - "--with-alternative", - action="store_true", - default=False, - dest="alternatives", - help="Output complementary possibilities if any. Top-level JSON WILL be a list.", - ) - parser.add_argument( - "-n", - "--normalize", - action="store_true", - default=False, - dest="normalize", - help="Permit to normalize input file. If not set, program does not write anything.", - ) - parser.add_argument( - "-m", - "--minimal", - action="store_true", - default=False, - dest="minimal", - help="Only output the charset detected to STDOUT. Disabling JSON output.", - ) - parser.add_argument( - "-r", - "--replace", - action="store_true", - default=False, - dest="replace", - help="Replace file when trying to normalize it instead of creating a new one.", - ) - parser.add_argument( - "-f", - "--force", - action="store_true", - default=False, - dest="force", - help="Replace file without asking if you are sure, use this flag with caution.", - ) - parser.add_argument( - "-t", - "--threshold", - action="store", - default=0.2, - type=float, - dest="threshold", - help="Define a custom maximum amount of chaos allowed in decoded content. 0. <= chaos <= 1.", - ) - parser.add_argument( - "--version", - action="version", - version="Charset-Normalizer {} - Python {} - Unicode {} - SpeedUp {}".format( - __version__, - python_version(), - unidata_version, - "OFF" if md_module.__file__.lower().endswith(".py") else "ON", - ), - help="Show version information and exit.", - ) - - args = parser.parse_args(argv) - - if args.replace is True and args.normalize is False: - print("Use --replace in addition of --normalize only.", file=sys.stderr) - return 1 - - if args.force is True and args.replace is False: - print("Use --force in addition of --replace only.", file=sys.stderr) - return 1 - - if args.threshold < 0.0 or args.threshold > 1.0: - print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) - return 1 - - x_ = [] - - for my_file in args.files: - matches = from_fp(my_file, threshold=args.threshold, explain=args.verbose) - - best_guess = matches.best() - - if best_guess is None: - print( - 'Unable to identify originating encoding for "{}". {}'.format( - my_file.name, - "Maybe try increasing maximum amount of chaos." - if args.threshold < 1.0 - else "", - ), - file=sys.stderr, - ) - x_.append( - CliDetectionResult( - abspath(my_file.name), - None, - [], - [], - "Unknown", - [], - False, - 1.0, - 0.0, - None, - True, - ) - ) - else: - x_.append( - CliDetectionResult( - abspath(my_file.name), - best_guess.encoding, - best_guess.encoding_aliases, - [ - cp - for cp in best_guess.could_be_from_charset - if cp != best_guess.encoding - ], - best_guess.language, - best_guess.alphabets, - best_guess.bom, - best_guess.percent_chaos, - best_guess.percent_coherence, - None, - True, - ) - ) - - if len(matches) > 1 and args.alternatives: - for el in matches: - if el != best_guess: - x_.append( - CliDetectionResult( - abspath(my_file.name), - el.encoding, - el.encoding_aliases, - [ - cp - for cp in el.could_be_from_charset - if cp != el.encoding - ], - el.language, - el.alphabets, - el.bom, - el.percent_chaos, - el.percent_coherence, - None, - False, - ) - ) - - if args.normalize is True: - if best_guess.encoding.startswith("utf") is True: - print( - '"{}" file does not need to be normalized, as it already came from unicode.'.format( - my_file.name - ), - file=sys.stderr, - ) - if my_file.closed is False: - my_file.close() - continue - - dir_path = dirname(realpath(my_file.name)) - file_name = basename(realpath(my_file.name)) - - o_: List[str] = file_name.split(".") - - if args.replace is False: - o_.insert(-1, best_guess.encoding) - if my_file.closed is False: - my_file.close() - elif ( - args.force is False - and query_yes_no( - 'Are you sure to normalize "{}" by replacing it ?'.format( - my_file.name - ), - "no", - ) - is False - ): - if my_file.closed is False: - my_file.close() - continue - - try: - x_[0].unicode_path = join(dir_path, ".".join(o_)) - - with open(x_[0].unicode_path, "w", encoding="utf-8") as fp: - fp.write(str(best_guess)) - except IOError as e: - print(str(e), file=sys.stderr) - if my_file.closed is False: - my_file.close() - return 2 - - if my_file.closed is False: - my_file.close() - - if args.minimal is False: - print( - dumps( - [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, - ensure_ascii=True, - indent=4, - ) - ) - else: - for my_file in args.files: - print( - ", ".join( - [ - el.encoding or "undefined" - for el in x_ - if el.path == abspath(my_file.name) - ] - ) - ) - - return 0 - - -if __name__ == "__main__": - cli_detect() diff --git a/.flatpak-builder/cache/objects/ab/276664e67110ca50abb082ae076aa06fea7bd60feba29b0cf53376920273a7.file b/.flatpak-builder/cache/objects/ab/276664e67110ca50abb082ae076aa06fea7bd60feba29b0cf53376920273a7.file deleted file mode 100644 index 43e1c51..0000000 --- a/.flatpak-builder/cache/objects/ab/276664e67110ca50abb082ae076aa06fea7bd60feba29b0cf53376920273a7.file +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=Alpaca -Exec=alpaca -Icon=com.jeffser.Alpaca -Terminal=false -Type=Application -Categories=Utility;Development;Chat; -StartupNotify=true diff --git a/.flatpak-builder/cache/objects/ab/464fa5d34cd6ca1b93c4cbdbd37dcfedc68a895425cb39c145fa68d2d51ea0.file b/.flatpak-builder/cache/objects/ab/464fa5d34cd6ca1b93c4cbdbd37dcfedc68a895425cb39c145fa68d2d51ea0.file deleted file mode 100644 index f810680..0000000 --- a/.flatpak-builder/cache/objects/ab/464fa5d34cd6ca1b93c4cbdbd37dcfedc68a895425cb39c145fa68d2d51ea0.file +++ /dev/null @@ -1,74 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# GRIB stub adapter -# -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler): - """ - Install application-specific GRIB image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix): - return prefix[:4] == b"GRIB" and prefix[7] == 1 - - -class GribStubImageFile(ImageFile.StubImageFile): - format = "GRIB" - format_description = "GRIB" - - def _open(self): - offset = self.fp.tell() - - if not _accept(self.fp.read(8)): - msg = "Not a GRIB file" - raise SyntaxError(msg) - - self.fp.seek(offset) - - # make something up - self._mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - msg = "GRIB save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) -Image.register_save(GribStubImageFile.format, _save) - -Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/.flatpak-builder/cache/objects/ab/8dd3bd141de591fdd12785a52c9868e788e19667e7b9cd45d8ade1dc7b11f6.file b/.flatpak-builder/cache/objects/ab/8dd3bd141de591fdd12785a52c9868e788e19667e7b9cd45d8ade1dc7b11f6.file deleted file mode 100644 index 401a83f..0000000 --- a/.flatpak-builder/cache/objects/ab/8dd3bd141de591fdd12785a52c9868e788e19667e7b9cd45d8ade1dc7b11f6.file +++ /dev/null @@ -1,263 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TGA file handling -# -# History: -# 95-09-01 fl created (reads 24-bit files only) -# 97-01-04 fl support more TGA versions, including compressed images -# 98-07-04 fl fixed orientation and alpha layer bugs -# 98-09-11 fl fixed orientation for runlength decoder -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import warnings -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -# -# -------------------------------------------------------------------- -# Read RGA file - - -MODES = { - # map imagetype/depth to rawmode - (1, 8): "P", - (3, 1): "1", - (3, 8): "L", - (3, 16): "LA", - (2, 16): "BGR;5", - (2, 24): "BGR", - (2, 32): "BGRA", -} - - -## -# Image plugin for Targa files. - - -class TgaImageFile(ImageFile.ImageFile): - format = "TGA" - format_description = "Targa" - - def _open(self) -> None: - # process header - assert self.fp is not None - - s = self.fp.read(18) - - id_len = s[0] - - colormaptype = s[1] - imagetype = s[2] - - depth = s[16] - - flags = s[17] - - self._size = i16(s, 12), i16(s, 14) - - # validate header fields - if ( - colormaptype not in (0, 1) - or self.size[0] <= 0 - or self.size[1] <= 0 - or depth not in (1, 8, 16, 24, 32) - ): - msg = "not a TGA file" - raise SyntaxError(msg) - - # image mode - if imagetype in (3, 11): - self._mode = "L" - if depth == 1: - self._mode = "1" # ??? - elif depth == 16: - self._mode = "LA" - elif imagetype in (1, 9): - self._mode = "P" if colormaptype else "L" - elif imagetype in (2, 10): - self._mode = "RGB" - if depth == 32: - self._mode = "RGBA" - else: - msg = "unknown TGA mode" - raise SyntaxError(msg) - - # orientation - orientation = flags & 0x30 - self._flip_horizontally = orientation in [0x10, 0x30] - if orientation in [0x20, 0x30]: - orientation = 1 - elif orientation in [0, 0x10]: - orientation = -1 - else: - msg = "unknown TGA orientation" - raise SyntaxError(msg) - - self.info["orientation"] = orientation - - if imagetype & 8: - self.info["compression"] = "tga_rle" - - if id_len: - self.info["id_section"] = self.fp.read(id_len) - - if colormaptype: - # read palette - start, size, mapdepth = i16(s, 3), i16(s, 5), s[7] - if mapdepth == 16: - self.palette = ImagePalette.raw( - "BGR;15", b"\0" * 2 * start + self.fp.read(2 * size) - ) - elif mapdepth == 24: - self.palette = ImagePalette.raw( - "BGR", b"\0" * 3 * start + self.fp.read(3 * size) - ) - elif mapdepth == 32: - self.palette = ImagePalette.raw( - "BGRA", b"\0" * 4 * start + self.fp.read(4 * size) - ) - else: - msg = "unknown TGA map depth" - raise SyntaxError(msg) - - # setup tile descriptor - try: - rawmode = MODES[(imagetype & 7, depth)] - if imagetype & 8: - # compressed - self.tile = [ - ( - "tga_rle", - (0, 0) + self.size, - self.fp.tell(), - (rawmode, orientation, depth), - ) - ] - else: - self.tile = [ - ( - "raw", - (0, 0) + self.size, - self.fp.tell(), - (rawmode, 0, orientation), - ) - ] - except KeyError: - pass # cannot decode - - def load_end(self) -> None: - if self._flip_horizontally: - assert self.im is not None - self.im = self.im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -# -# -------------------------------------------------------------------- -# Write TGA file - - -SAVE = { - "1": ("1", 1, 0, 3), - "L": ("L", 8, 0, 3), - "LA": ("LA", 16, 0, 3), - "P": ("P", 8, 1, 1), - "RGB": ("BGR", 24, 0, 2), - "RGBA": ("BGRA", 32, 0, 2), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None: - try: - rawmode, bits, colormaptype, imagetype = SAVE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as TGA" - raise OSError(msg) from e - - if "rle" in im.encoderinfo: - rle = im.encoderinfo["rle"] - else: - compression = im.encoderinfo.get("compression", im.info.get("compression")) - rle = compression == "tga_rle" - if rle: - imagetype += 8 - - id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) - id_len = len(id_section) - if id_len > 255: - id_len = 255 - id_section = id_section[:255] - warnings.warn("id_section has been trimmed to 255 characters") - - if colormaptype: - assert im.im is not None - palette = im.im.getpalette("RGB", "BGR") - colormaplength, colormapentry = len(palette) // 3, 24 - else: - colormaplength, colormapentry = 0, 0 - - if im.mode in ("LA", "RGBA"): - flags = 8 - else: - flags = 0 - - orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1)) - if orientation > 0: - flags = flags | 0x20 - - fp.write( - o8(id_len) - + o8(colormaptype) - + o8(imagetype) - + o16(0) # colormapfirst - + o16(colormaplength) - + o8(colormapentry) - + o16(0) - + o16(0) - + o16(im.size[0]) - + o16(im.size[1]) - + o8(bits) - + o8(flags) - ) - - if id_section: - fp.write(id_section) - - if colormaptype: - fp.write(palette) - - if rle: - ImageFile._save( - im, fp, [("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))] - ) - else: - ImageFile._save( - im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))] - ) - - # write targa version 2 footer - fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(TgaImageFile.format, TgaImageFile) -Image.register_save(TgaImageFile.format, _save) - -Image.register_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"]) - -Image.register_mime(TgaImageFile.format, "image/x-tga") diff --git a/.flatpak-builder/cache/objects/ab/ed75e49eb5e290914bd400235c8ac0a6aa0743968626906d3b9a04f54161fb.file b/.flatpak-builder/cache/objects/ab/ed75e49eb5e290914bd400235c8ac0a6aa0743968626906d3b9a04f54161fb.file deleted file mode 100644 index be000c3..0000000 --- a/.flatpak-builder/cache/objects/ab/ed75e49eb5e290914bd400235c8ac0a6aa0743968626906d3b9a04f54161fb.file +++ /dev/null @@ -1,403 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# JPEG2000 file handling -# -# History: -# 2014-03-12 ajh Created -# 2021-06-30 rogermb Extract dpi information from the 'resc' header box -# -# Copyright (c) 2014 Coriolis Systems Limited -# Copyright (c) 2014 Alastair Houghton -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import struct - -from . import Image, ImageFile, ImagePalette, _binary - - -class BoxReader: - """ - A small helper class to read fields stored in JPEG2000 header boxes - and to easily step into and read sub-boxes. - """ - - def __init__(self, fp, length=-1): - self.fp = fp - self.has_length = length >= 0 - self.length = length - self.remaining_in_box = -1 - - def _can_read(self, num_bytes): - if self.has_length and self.fp.tell() + num_bytes > self.length: - # Outside box: ensure we don't read past the known file length - return False - if self.remaining_in_box >= 0: - # Inside box contents: ensure read does not go past box boundaries - return num_bytes <= self.remaining_in_box - else: - return True # No length known, just read - - def _read_bytes(self, num_bytes): - if not self._can_read(num_bytes): - msg = "Not enough data in header" - raise SyntaxError(msg) - - data = self.fp.read(num_bytes) - if len(data) < num_bytes: - msg = f"Expected to read {num_bytes} bytes but only got {len(data)}." - raise OSError(msg) - - if self.remaining_in_box > 0: - self.remaining_in_box -= num_bytes - return data - - def read_fields(self, field_format): - size = struct.calcsize(field_format) - data = self._read_bytes(size) - return struct.unpack(field_format, data) - - def read_boxes(self): - size = self.remaining_in_box - data = self._read_bytes(size) - return BoxReader(io.BytesIO(data), size) - - def has_next_box(self): - if self.has_length: - return self.fp.tell() + self.remaining_in_box < self.length - else: - return True - - def next_box_type(self): - # Skip the rest of the box if it has not been read - if self.remaining_in_box > 0: - self.fp.seek(self.remaining_in_box, os.SEEK_CUR) - self.remaining_in_box = -1 - - # Read the length and type of the next box - lbox, tbox = self.read_fields(">I4s") - if lbox == 1: - lbox = self.read_fields(">Q")[0] - hlen = 16 - else: - hlen = 8 - - if lbox < hlen or not self._can_read(lbox - hlen): - msg = "Invalid header length" - raise SyntaxError(msg) - - self.remaining_in_box = lbox - hlen - return tbox - - -def _parse_codestream(fp): - """Parse the JPEG 2000 codestream to extract the size and component - count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" - - hdr = fp.read(2) - lsiz = _binary.i16be(hdr) - siz = hdr + fp.read(lsiz - 2) - lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from( - ">HHIIIIIIIIH", siz - ) - - size = (xsiz - xosiz, ysiz - yosiz) - if csiz == 1: - ssiz = struct.unpack_from(">B", siz, 38) - if (ssiz[0] & 0x7F) + 1 > 8: - mode = "I;16" - else: - mode = "L" - elif csiz == 2: - mode = "LA" - elif csiz == 3: - mode = "RGB" - elif csiz == 4: - mode = "RGBA" - else: - mode = None - - return size, mode - - -def _res_to_dpi(num, denom, exp): - """Convert JPEG2000's (numerator, denominator, exponent-base-10) resolution, - calculated as (num / denom) * 10^exp and stored in dots per meter, - to floating-point dots per inch.""" - if denom != 0: - return (254 * num * (10**exp)) / (10000 * denom) - - -def _parse_jp2_header(fp): - """Parse the JP2 header box to extract size, component count, - color space information, and optionally DPI information, - returning a (size, mode, mimetype, dpi) tuple.""" - - # Find the JP2 header box - reader = BoxReader(fp) - header = None - mimetype = None - while reader.has_next_box(): - tbox = reader.next_box_type() - - if tbox == b"jp2h": - header = reader.read_boxes() - break - elif tbox == b"ftyp": - if reader.read_fields(">4s")[0] == b"jpx ": - mimetype = "image/jpx" - - size = None - mode = None - bpc = None - nc = None - dpi = None # 2-tuple of DPI info, or None - palette = None - - while header.has_next_box(): - tbox = header.next_box_type() - - if tbox == b"ihdr": - height, width, nc, bpc = header.read_fields(">IIHB") - size = (width, height) - if nc == 1 and (bpc & 0x7F) > 8: - mode = "I;16" - elif nc == 1: - mode = "L" - elif nc == 2: - mode = "LA" - elif nc == 3: - mode = "RGB" - elif nc == 4: - mode = "RGBA" - elif tbox == b"pclr" and mode in ("L", "LA"): - ne, npc = header.read_fields(">HB") - bitdepths = header.read_fields(">" + ("B" * npc)) - if max(bitdepths) <= 8: - palette = ImagePalette.ImagePalette() - for i in range(ne): - palette.getcolor(header.read_fields(">" + ("B" * npc))) - mode = "P" if mode == "L" else "PA" - elif tbox == b"res ": - res = header.read_boxes() - while res.has_next_box(): - tres = res.next_box_type() - if tres == b"resc": - vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB") - hres = _res_to_dpi(hrcn, hrcd, hrce) - vres = _res_to_dpi(vrcn, vrcd, vrce) - if hres is not None and vres is not None: - dpi = (hres, vres) - break - - if size is None or mode is None: - msg = "Malformed JP2 header" - raise SyntaxError(msg) - - return size, mode, mimetype, dpi, palette - - -## -# Image plugin for JPEG2000 images. - - -class Jpeg2KImageFile(ImageFile.ImageFile): - format = "JPEG2000" - format_description = "JPEG 2000 (ISO 15444)" - - def _open(self): - sig = self.fp.read(4) - if sig == b"\xff\x4f\xff\x51": - self.codec = "j2k" - self._size, self._mode = _parse_codestream(self.fp) - else: - sig = sig + self.fp.read(8) - - if sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a": - self.codec = "jp2" - header = _parse_jp2_header(self.fp) - self._size, self._mode, self.custom_mimetype, dpi, self.palette = header - if dpi is not None: - self.info["dpi"] = dpi - if self.fp.read(12).endswith(b"jp2c\xff\x4f\xff\x51"): - self._parse_comment() - else: - msg = "not a JPEG 2000 file" - raise SyntaxError(msg) - - if self.size is None or self.mode is None: - msg = "unable to determine size/mode" - raise SyntaxError(msg) - - self._reduce = 0 - self.layers = 0 - - fd = -1 - length = -1 - - try: - fd = self.fp.fileno() - length = os.fstat(fd).st_size - except Exception: - fd = -1 - try: - pos = self.fp.tell() - self.fp.seek(0, io.SEEK_END) - length = self.fp.tell() - self.fp.seek(pos) - except Exception: - length = -1 - - self.tile = [ - ( - "jpeg2k", - (0, 0) + self.size, - 0, - (self.codec, self._reduce, self.layers, fd, length), - ) - ] - - def _parse_comment(self): - hdr = self.fp.read(2) - length = _binary.i16be(hdr) - self.fp.seek(length - 2, os.SEEK_CUR) - - while True: - marker = self.fp.read(2) - if not marker: - break - typ = marker[1] - if typ in (0x90, 0xD9): - # Start of tile or end of codestream - break - hdr = self.fp.read(2) - length = _binary.i16be(hdr) - if typ == 0x64: - # Comment - self.info["comment"] = self.fp.read(length - 2)[2:] - break - else: - self.fp.seek(length - 2, os.SEEK_CUR) - - @property - def reduce(self): - # https://github.com/python-pillow/Pillow/issues/4343 found that the - # new Image 'reduce' method was shadowed by this plugin's 'reduce' - # property. This attempts to allow for both scenarios - return self._reduce or super().reduce - - @reduce.setter - def reduce(self, value): - self._reduce = value - - def load(self): - if self.tile and self._reduce: - power = 1 << self._reduce - adjust = power >> 1 - self._size = ( - int((self.size[0] + adjust) / power), - int((self.size[1] + adjust) / power), - ) - - # Update the reduce and layers settings - t = self.tile[0] - t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4]) - self.tile = [(t[0], (0, 0) + self.size, t[2], t3)] - - return ImageFile.ImageFile.load(self) - - -def _accept(prefix): - return ( - prefix[:4] == b"\xff\x4f\xff\x51" - or prefix[:12] == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" - ) - - -# ------------------------------------------------------------ -# Save support - - -def _save(im, fp, filename): - # Get the keyword arguments - info = im.encoderinfo - - if filename.endswith(".j2k") or info.get("no_jp2", False): - kind = "j2k" - else: - kind = "jp2" - - offset = info.get("offset", None) - tile_offset = info.get("tile_offset", None) - tile_size = info.get("tile_size", None) - quality_mode = info.get("quality_mode", "rates") - quality_layers = info.get("quality_layers", None) - if quality_layers is not None and not ( - isinstance(quality_layers, (list, tuple)) - and all( - isinstance(quality_layer, (int, float)) for quality_layer in quality_layers - ) - ): - msg = "quality_layers must be a sequence of numbers" - raise ValueError(msg) - - num_resolutions = info.get("num_resolutions", 0) - cblk_size = info.get("codeblock_size", None) - precinct_size = info.get("precinct_size", None) - irreversible = info.get("irreversible", False) - progression = info.get("progression", "LRCP") - cinema_mode = info.get("cinema_mode", "no") - mct = info.get("mct", 0) - signed = info.get("signed", False) - comment = info.get("comment") - if isinstance(comment, str): - comment = comment.encode() - plt = info.get("plt", False) - - fd = -1 - if hasattr(fp, "fileno"): - try: - fd = fp.fileno() - except Exception: - fd = -1 - - im.encoderconfig = ( - offset, - tile_offset, - tile_size, - quality_mode, - quality_layers, - num_resolutions, - cblk_size, - precinct_size, - irreversible, - progression, - cinema_mode, - mct, - signed, - fd, - comment, - plt, - ) - - ImageFile._save(im, fp, [("jpeg2k", (0, 0) + im.size, 0, kind)]) - - -# ------------------------------------------------------------ -# Registry stuff - - -Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) -Image.register_save(Jpeg2KImageFile.format, _save) - -Image.register_extensions( - Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"] -) - -Image.register_mime(Jpeg2KImageFile.format, "image/jp2") diff --git a/.flatpak-builder/cache/objects/ab/f7862668fc603befed88624e176b31ee50c1bc6e98010cd71acd3bc8ef97a0.file b/.flatpak-builder/cache/objects/ab/f7862668fc603befed88624e176b31ee50c1bc6e98010cd71acd3bc8ef97a0.file deleted file mode 100644 index 1ef24d79c579575c34284301b54b95573d299435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmY+9KT88K7{=e+U3;Zk!Buc^tI(cByNQd7N)gemONb^{Pwy@v$q98T_#yNY_y_wr zbUndAZYnr+6N*bG6N^IMJPE%%ym@%@P^(p40Jtf?mR>dvzCR8Bmp3Cc=@_^L3KYeV zpe{m|o!IF*)TLhRCSKP=-~jVzi8&Xgzl19^EZ-x5XR~KzUOFdG_s8~HN5uk3Q?7}Q zc&ZM^w#}Hnh~g*>`E{kykW6r?jk&BcVUbZBa+wgV>gA$}ahT~$GK{7DM&YWyDk>o( z)>P6?Qg}r6uAX3G7^ba&2oc25X(0OgoTr=3Rx41EW(`5kE=iB6;Ap=SV4RRB#keW@ z)5> bytes: - if isinstance(x, bytes): - return x - elif not isinstance(x, str): - raise TypeError(f"not expecting type {type(x).__name__}") - if encoding or errors: - return x.encode(encoding or "utf-8", errors=errors or "strict") - return x.encode() - - -def to_str( - x: str | bytes, encoding: str | None = None, errors: str | None = None -) -> str: - if isinstance(x, str): - return x - elif not isinstance(x, bytes): - raise TypeError(f"not expecting type {type(x).__name__}") - if encoding or errors: - return x.decode(encoding or "utf-8", errors=errors or "strict") - return x.decode() - - -def reraise( - tp: type[BaseException] | None, - value: BaseException, - tb: TracebackType | None = None, -) -> typing.NoReturn: - try: - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - finally: - value = None # type: ignore[assignment] - tb = None diff --git a/.flatpak-builder/cache/objects/ac/99fab8bbe5c459afe1934f879ef0005a67821ec30e213c4d3e63b6ea260a13.dirtree b/.flatpak-builder/cache/objects/ac/99fab8bbe5c459afe1934f879ef0005a67821ec30e213c4d3e63b6ea260a13.dirtree deleted file mode 100644 index 238bfa37d7ee7924f308f0ddfad218b2cfbdddfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmYew%wt&j!Cl~ZJ-^F0{{vUTSo;-zm;`0miN25G3663%5PUq(C5!K)bj`u^&)b-v zwjO`?Zd>WEB|=x<6o1p~c+H&?(xJkVlbOU|SA2b6&)2puof3uJiGJGae}9{BUWS=x znfkv*_sx>ao)I>sI3uwrm7%;mli@&HO18Wu MWR4n}ThA2+0M{mLy#N3J diff --git a/.flatpak-builder/cache/objects/ac/d138de111fde5cce8239de4558b71abd2aed8e149c72cae1855c54133d4a83.file b/.flatpak-builder/cache/objects/ac/d138de111fde5cce8239de4558b71abd2aed8e149c72cae1855c54133d4a83.file deleted file mode 100644 index 4bb1be1..0000000 --- a/.flatpak-builder/cache/objects/ac/d138de111fde5cce8239de4558b71abd2aed8e149c72cae1855c54133d4a83.file +++ /dev/null @@ -1,275 +0,0 @@ -from __future__ import annotations - -import time -import typing -from enum import Enum -from socket import getdefaulttimeout - -from ..exceptions import TimeoutStateError - -if typing.TYPE_CHECKING: - from typing import Final - - -class _TYPE_DEFAULT(Enum): - # This value should never be passed to socket.settimeout() so for safety we use a -1. - # socket.settimout() raises a ValueError for negative values. - token = -1 - - -_DEFAULT_TIMEOUT: Final[_TYPE_DEFAULT] = _TYPE_DEFAULT.token - -_TYPE_TIMEOUT = typing.Optional[typing.Union[float, _TYPE_DEFAULT]] - - -class Timeout: - """Timeout configuration. - - Timeouts can be defined as a default for a pool: - - .. code-block:: python - - import urllib3 - - timeout = urllib3.util.Timeout(connect=2.0, read=7.0) - - http = urllib3.PoolManager(timeout=timeout) - - resp = http.request("GET", "https://example.com/") - - print(resp.status) - - Or per-request (which overrides the default for the pool): - - .. code-block:: python - - response = http.request("GET", "https://example.com/", timeout=Timeout(10)) - - Timeouts can be disabled by setting all the parameters to ``None``: - - .. code-block:: python - - no_timeout = Timeout(connect=None, read=None) - response = http.request("GET", "https://example.com/", timeout=no_timeout) - - - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: int, float, or None - - :param connect: - The maximum amount of time (in seconds) to wait for a connection - attempt to a server to succeed. Omitting the parameter will default the - connect timeout to the system default, probably `the global default - timeout in socket.py - `_. - None will set an infinite timeout for connection attempts. - - :type connect: int, float, or None - - :param read: - The maximum amount of time (in seconds) to wait between consecutive - read operations for a response from the server. Omitting the parameter - will default the read timeout to the system default, probably `the - global default timeout in socket.py - `_. - None will set an infinite timeout. - - :type read: int, float, or None - - .. note:: - - Many factors can affect the total amount of time for urllib3 to return - an HTTP response. - - For example, Python's DNS resolver does not obey the timeout specified - on the socket. Other factors that can affect total request time include - high CPU load, high swap, the program running at a low priority level, - or other behaviors. - - In addition, the read and total timeouts only measure the time between - read operations on the socket connecting the client and the server, - not the total amount of time for the request to return a complete - response. For most requests, the timeout is raised because the server - has not sent the first byte in the specified time. This is not always - the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not trigger, even though the request will take - several minutes to complete. - """ - - #: A sentinel object representing the default timeout value - DEFAULT_TIMEOUT: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT - - def __init__( - self, - total: _TYPE_TIMEOUT = None, - connect: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, - read: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, - ) -> None: - self._connect = self._validate_timeout(connect, "connect") - self._read = self._validate_timeout(read, "read") - self.total = self._validate_timeout(total, "total") - self._start_connect: float | None = None - - def __repr__(self) -> str: - return f"{type(self).__name__}(connect={self._connect!r}, read={self._read!r}, total={self.total!r})" - - # __str__ provided for backwards compatibility - __str__ = __repr__ - - @staticmethod - def resolve_default_timeout(timeout: _TYPE_TIMEOUT) -> float | None: - return getdefaulttimeout() if timeout is _DEFAULT_TIMEOUT else timeout - - @classmethod - def _validate_timeout(cls, value: _TYPE_TIMEOUT, name: str) -> _TYPE_TIMEOUT: - """Check that a timeout attribute is valid. - - :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is - used to specify in error messages. - :return: The validated and casted version of the given value. - :raises ValueError: If it is a numeric value less than or equal to - zero, or the type is not an integer, float, or None. - """ - if value is None or value is _DEFAULT_TIMEOUT: - return value - - if isinstance(value, bool): - raise ValueError( - "Timeout cannot be a boolean value. It must " - "be an int, float or None." - ) - try: - float(value) - except (TypeError, ValueError): - raise ValueError( - "Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value) - ) from None - - try: - if value <= 0: - raise ValueError( - "Attempted to set %s timeout to %s, but the " - "timeout cannot be set to a value less " - "than or equal to 0." % (name, value) - ) - except TypeError: - raise ValueError( - "Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value) - ) from None - - return value - - @classmethod - def from_float(cls, timeout: _TYPE_TIMEOUT) -> Timeout: - """Create a new Timeout from a legacy timeout value. - - The timeout value used by httplib.py sets the same timeout on the - connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value - passed to this function. - - :param timeout: The legacy timeout value. - :type timeout: integer, float, :attr:`urllib3.util.Timeout.DEFAULT_TIMEOUT`, or None - :return: Timeout object - :rtype: :class:`Timeout` - """ - return Timeout(read=timeout, connect=timeout) - - def clone(self) -> Timeout: - """Create a copy of the timeout object - - Timeout properties are stored per-pool but each request needs a fresh - Timeout object to ensure each one has its own start/stop configured. - - :return: a copy of the timeout object - :rtype: :class:`Timeout` - """ - # We can't use copy.deepcopy because that will also create a new object - # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to - # detect the user default. - return Timeout(connect=self._connect, read=self._read, total=self.total) - - def start_connect(self) -> float: - """Start the timeout clock, used during a connect() attempt - - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to start a timer that has been started already. - """ - if self._start_connect is not None: - raise TimeoutStateError("Timeout timer has already been started.") - self._start_connect = time.monotonic() - return self._start_connect - - def get_connect_duration(self) -> float: - """Gets the time elapsed since the call to :meth:`start_connect`. - - :return: Elapsed time in seconds. - :rtype: float - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to get duration for a timer that hasn't been started. - """ - if self._start_connect is None: - raise TimeoutStateError( - "Can't get connect duration for timer that has not started." - ) - return time.monotonic() - self._start_connect - - @property - def connect_timeout(self) -> _TYPE_TIMEOUT: - """Get the value to use when setting a connection timeout. - - This will be a positive float or integer, the value None - (never timeout), or the default system timeout. - - :return: Connect timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - """ - if self.total is None: - return self._connect - - if self._connect is None or self._connect is _DEFAULT_TIMEOUT: - return self.total - - return min(self._connect, self.total) # type: ignore[type-var] - - @property - def read_timeout(self) -> float | None: - """Get the value for the read timeout. - - This assumes some time has elapsed in the connection timeout and - computes the read timeout appropriately. - - If self.total is set, the read timeout is dependent on the amount of - time taken by the connect timeout. If the connection time has not been - established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be - raised. - - :return: Value to use for the read timeout. - :rtype: int, float or None - :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` - has not yet been called on this object. - """ - if ( - self.total is not None - and self.total is not _DEFAULT_TIMEOUT - and self._read is not None - and self._read is not _DEFAULT_TIMEOUT - ): - # In case the connect timeout has not yet been established. - if self._start_connect is None: - return self._read - return max(0, min(self.total - self.get_connect_duration(), self._read)) - elif self.total is not None and self.total is not _DEFAULT_TIMEOUT: - return max(0, self.total - self.get_connect_duration()) - else: - return self.resolve_default_timeout(self._read) diff --git a/.flatpak-builder/cache/objects/ac/fe083af11ed93315b4ed20ae59c496aa48c25c7a309bb106306406c38fe414.dirtree b/.flatpak-builder/cache/objects/ac/fe083af11ed93315b4ed20ae59c496aa48c25c7a309bb106306406c38fe414.dirtree deleted file mode 100644 index a8c50aa3c08e062a51719f9feff8d437d10def54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79 zcmV-V0I>gXd30!RZZj@1F#un+w(OPEiDiZ8vc!V!;ZA6@PlLXy5!iR+Y=OO>c85f2 l4)Gg&!DsWf1LcLs?(VjA`lJ%o>~r=hi0cb%RER4JO#pZ#DRBS* diff --git a/.flatpak-builder/cache/objects/ad/4824b7554c910b65b78154056439972ca2434265a78bd0b2810ea566a83e32.file b/.flatpak-builder/cache/objects/ad/4824b7554c910b65b78154056439972ca2434265a78bd0b2810ea566a83e32.file deleted file mode 100644 index 2c18502..0000000 --- a/.flatpak-builder/cache/objects/ad/4824b7554c910b65b78154056439972ca2434265a78bd0b2810ea566a83e32.file +++ /dev/null @@ -1,86 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# sequence support classes -# -# history: -# 1997-02-20 fl Created -# -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1997 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -## -from __future__ import annotations - -from typing import Callable - -from . import Image - - -class Iterator: - """ - This class implements an iterator object that can be used to loop - over an image sequence. - - You can use the ``[]`` operator to access elements by index. This operator - will raise an :py:exc:`IndexError` if you try to access a nonexistent - frame. - - :param im: An image object. - """ - - def __init__(self, im: Image.Image): - if not hasattr(im, "seek"): - msg = "im must have seek method" - raise AttributeError(msg) - self.im = im - self.position = getattr(self.im, "_min_frame", 0) - - def __getitem__(self, ix: int) -> Image.Image: - try: - self.im.seek(ix) - return self.im - except EOFError as e: - msg = "end of sequence" - raise IndexError(msg) from e - - def __iter__(self) -> Iterator: - return self - - def __next__(self) -> Image.Image: - try: - self.im.seek(self.position) - self.position += 1 - return self.im - except EOFError as e: - msg = "end of sequence" - raise StopIteration(msg) from e - - -def all_frames( - im: Image.Image | list[Image.Image], - func: Callable[[Image.Image], Image.Image] | None = None, -) -> list[Image.Image]: - """ - Applies a given function to all frames in an image or a list of images. - The frames are returned as a list of separate images. - - :param im: An image, or a list of images. - :param func: The function to apply to all of the image frames. - :returns: A list of images. - """ - if not isinstance(im, list): - im = [im] - - ims = [] - for imSequence in im: - current = imSequence.tell() - - ims += [im_frame.copy() for im_frame in Iterator(imSequence)] - - imSequence.seek(current) - return [func(im) for im in ims] if func else ims diff --git a/.flatpak-builder/cache/objects/ad/79de6985cfe65ae76b2be3e2fa0e5120817e8f8fb22da97ed9d07f44e6bd6a.file b/.flatpak-builder/cache/objects/ad/79de6985cfe65ae76b2be3e2fa0e5120817e8f8fb22da97ed9d07f44e6bd6a.file deleted file mode 100644 index 33db8fa..0000000 --- a/.flatpak-builder/cache/objects/ad/79de6985cfe65ae76b2be3e2fa0e5120817e8f8fb22da97ed9d07f44e6bd6a.file +++ /dev/null @@ -1,724 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard image operations -# -# History: -# 2001-10-20 fl Created -# 2001-10-23 fl Added autocontrast operator -# 2001-12-18 fl Added Kevin's fit operator -# 2004-03-14 fl Fixed potential division by zero in equalize -# 2005-05-05 fl Fixed equalize for low number of values -# -# Copyright (c) 2001-2004 by Secret Labs AB -# Copyright (c) 2001-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import functools -import operator -import re -from typing import Protocol, Sequence, cast - -from . import ExifTags, Image, ImagePalette - -# -# helpers - - -def _border(border: int | tuple[int, ...]) -> tuple[int, int, int, int]: - if isinstance(border, tuple): - if len(border) == 2: - left, top = right, bottom = border - elif len(border) == 4: - left, top, right, bottom = border - else: - left = top = right = bottom = border - return left, top, right, bottom - - -def _color(color: str | int | tuple[int, ...], mode: str) -> int | tuple[int, ...]: - if isinstance(color, str): - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - return color - - -def _lut(image: Image.Image, lut: list[int]) -> Image.Image: - if image.mode == "P": - # FIXME: apply to lookup table, not image data - msg = "mode P support coming soon" - raise NotImplementedError(msg) - elif image.mode in ("L", "RGB"): - if image.mode == "RGB" and len(lut) == 256: - lut = lut + lut + lut - return image.point(lut) - else: - msg = f"not supported for mode {image.mode}" - raise OSError(msg) - - -# -# actions - - -def autocontrast( - image: Image.Image, - cutoff: float | tuple[float, float] = 0, - ignore: int | Sequence[int] | None = None, - mask: Image.Image | None = None, - preserve_tone: bool = False, -) -> Image.Image: - """ - Maximize (normalize) image contrast. This function calculates a - histogram of the input image (or mask region), removes ``cutoff`` percent of the - lightest and darkest pixels from the histogram, and remaps the image - so that the darkest pixel becomes black (0), and the lightest - becomes white (255). - - :param image: The image to process. - :param cutoff: The percent to cut off from the histogram on the low and - high ends. Either a tuple of (low, high), or a single - number for both. - :param ignore: The background pixel value (use None for no background). - :param mask: Histogram used in contrast operation is computed using pixels - within the mask. If no mask is given the entire image is used - for histogram computation. - :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. - - .. versionadded:: 8.2.0 - - :return: An image. - """ - if preserve_tone: - histogram = image.convert("L").histogram(mask) - else: - histogram = image.histogram(mask) - - lut = [] - for layer in range(0, len(histogram), 256): - h = histogram[layer : layer + 256] - if ignore is not None: - # get rid of outliers - if isinstance(ignore, int): - h[ignore] = 0 - else: - for ix in ignore: - h[ix] = 0 - if cutoff: - # cut off pixels from both ends of the histogram - if not isinstance(cutoff, tuple): - cutoff = (cutoff, cutoff) - # get number of pixels - n = 0 - for ix in range(256): - n = n + h[ix] - # remove cutoff% pixels from the low end - cut = int(n * cutoff[0] // 100) - for lo in range(256): - if cut > h[lo]: - cut = cut - h[lo] - h[lo] = 0 - else: - h[lo] -= cut - cut = 0 - if cut <= 0: - break - # remove cutoff% samples from the high end - cut = int(n * cutoff[1] // 100) - for hi in range(255, -1, -1): - if cut > h[hi]: - cut = cut - h[hi] - h[hi] = 0 - else: - h[hi] -= cut - cut = 0 - if cut <= 0: - break - # find lowest/highest samples after preprocessing - for lo in range(256): - if h[lo]: - break - for hi in range(255, -1, -1): - if h[hi]: - break - if hi <= lo: - # don't bother - lut.extend(list(range(256))) - else: - scale = 255.0 / (hi - lo) - offset = -lo * scale - for ix in range(256): - ix = int(ix * scale + offset) - if ix < 0: - ix = 0 - elif ix > 255: - ix = 255 - lut.append(ix) - return _lut(image, lut) - - -def colorize( - image: Image.Image, - black: str | tuple[int, ...], - white: str | tuple[int, ...], - mid: str | int | tuple[int, ...] | None = None, - blackpoint: int = 0, - whitepoint: int = 255, - midpoint: int = 127, -) -> Image.Image: - """ - Colorize grayscale image. - This function calculates a color wedge which maps all black pixels in - the source image to the first color and all white pixels to the - second color. If ``mid`` is specified, it uses three-color mapping. - The ``black`` and ``white`` arguments should be RGB tuples or color names; - optionally you can use three-color mapping by also specifying ``mid``. - Mapping positions for any of the colors can be specified - (e.g. ``blackpoint``), where these parameters are the integer - value corresponding to where the corresponding color should be mapped. - These parameters must have logical order, such that - ``blackpoint <= midpoint <= whitepoint`` (if ``mid`` is specified). - - :param image: The image to colorize. - :param black: The color to use for black input pixels. - :param white: The color to use for white input pixels. - :param mid: The color to use for midtone input pixels. - :param blackpoint: an int value [0, 255] for the black mapping. - :param whitepoint: an int value [0, 255] for the white mapping. - :param midpoint: an int value [0, 255] for the midtone mapping. - :return: An image. - """ - - # Initial asserts - assert image.mode == "L" - if mid is None: - assert 0 <= blackpoint <= whitepoint <= 255 - else: - assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 - - # Define colors from arguments - rgb_black = cast(Sequence[int], _color(black, "RGB")) - rgb_white = cast(Sequence[int], _color(white, "RGB")) - rgb_mid = cast(Sequence[int], _color(mid, "RGB")) if mid is not None else None - - # Empty lists for the mapping - red = [] - green = [] - blue = [] - - # Create the low-end values - for i in range(0, blackpoint): - red.append(rgb_black[0]) - green.append(rgb_black[1]) - blue.append(rgb_black[2]) - - # Create the mapping (2-color) - if rgb_mid is None: - range_map = range(0, whitepoint - blackpoint) - - for i in range_map: - red.append( - rgb_black[0] + i * (rgb_white[0] - rgb_black[0]) // len(range_map) - ) - green.append( - rgb_black[1] + i * (rgb_white[1] - rgb_black[1]) // len(range_map) - ) - blue.append( - rgb_black[2] + i * (rgb_white[2] - rgb_black[2]) // len(range_map) - ) - - # Create the mapping (3-color) - else: - range_map1 = range(0, midpoint - blackpoint) - range_map2 = range(0, whitepoint - midpoint) - - for i in range_map1: - red.append( - rgb_black[0] + i * (rgb_mid[0] - rgb_black[0]) // len(range_map1) - ) - green.append( - rgb_black[1] + i * (rgb_mid[1] - rgb_black[1]) // len(range_map1) - ) - blue.append( - rgb_black[2] + i * (rgb_mid[2] - rgb_black[2]) // len(range_map1) - ) - for i in range_map2: - red.append(rgb_mid[0] + i * (rgb_white[0] - rgb_mid[0]) // len(range_map2)) - green.append( - rgb_mid[1] + i * (rgb_white[1] - rgb_mid[1]) // len(range_map2) - ) - blue.append(rgb_mid[2] + i * (rgb_white[2] - rgb_mid[2]) // len(range_map2)) - - # Create the high-end values - for i in range(0, 256 - whitepoint): - red.append(rgb_white[0]) - green.append(rgb_white[1]) - blue.append(rgb_white[2]) - - # Return converted image - image = image.convert("RGB") - return _lut(image, red + green + blue) - - -def contain( - image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a resized version of the image, set to the maximum width and height - within the requested size, while maintaining the original aspect ratio. - - :param image: The image to resize. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :return: An image. - """ - - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio != dest_ratio: - if im_ratio > dest_ratio: - new_height = round(image.height / image.width * size[0]) - if new_height != size[1]: - size = (size[0], new_height) - else: - new_width = round(image.width / image.height * size[1]) - if new_width != size[0]: - size = (new_width, size[1]) - return image.resize(size, resample=method) - - -def cover( - image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a resized version of the image, so that the requested size is - covered, while maintaining the original aspect ratio. - - :param image: The image to resize. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :return: An image. - """ - - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio != dest_ratio: - if im_ratio < dest_ratio: - new_height = round(image.height / image.width * size[0]) - if new_height != size[1]: - size = (size[0], new_height) - else: - new_width = round(image.width / image.height * size[1]) - if new_width != size[0]: - size = (new_width, size[1]) - return image.resize(size, resample=method) - - -def pad( - image: Image.Image, - size: tuple[int, int], - method: int = Image.Resampling.BICUBIC, - color: str | int | tuple[int, ...] | None = None, - centering: tuple[float, float] = (0.5, 0.5), -) -> Image.Image: - """ - Returns a resized and padded version of the image, expanded to fill the - requested aspect ratio and size. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :param color: The background color of the padded image. - :param centering: Control the position of the original image within the - padded version. - - (0.5, 0.5) will keep the image centered - (0, 0) will keep the image aligned to the top left - (1, 1) will keep the image aligned to the bottom - right - :return: An image. - """ - - resized = contain(image, size, method) - if resized.size == size: - out = resized - else: - out = Image.new(image.mode, size, color) - if resized.palette: - out.putpalette(resized.getpalette()) - if resized.width != size[0]: - x = round((size[0] - resized.width) * max(0, min(centering[0], 1))) - out.paste(resized, (x, 0)) - else: - y = round((size[1] - resized.height) * max(0, min(centering[1], 1))) - out.paste(resized, (0, y)) - return out - - -def crop(image: Image.Image, border: int = 0) -> Image.Image: - """ - Remove border from image. The same amount of pixels are removed - from all four sides. This function works on all image modes. - - .. seealso:: :py:meth:`~PIL.Image.Image.crop` - - :param image: The image to crop. - :param border: The number of pixels to remove. - :return: An image. - """ - left, top, right, bottom = _border(border) - return image.crop((left, top, image.size[0] - right, image.size[1] - bottom)) - - -def scale( - image: Image.Image, factor: float, resample: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a rescaled image by a specific factor given in parameter. - A factor greater than 1 expands the image, between 0 and 1 contracts the - image. - - :param image: The image to rescale. - :param factor: The expansion factor, as a float. - :param resample: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - if factor == 1: - return image.copy() - elif factor <= 0: - msg = "the factor must be greater than 0" - raise ValueError(msg) - else: - size = (round(factor * image.width), round(factor * image.height)) - return image.resize(size, resample) - - -class SupportsGetMesh(Protocol): - """ - An object that supports the ``getmesh`` method, taking an image as an - argument, and returning a list of tuples. Each tuple contains two tuples, - the source box as a tuple of 4 integers, and a tuple of 8 integers for the - final quadrilateral, in order of top left, bottom left, bottom right, top - right. - """ - - def getmesh( - self, image: Image.Image - ) -> list[ - tuple[tuple[int, int, int, int], tuple[int, int, int, int, int, int, int, int]] - ]: ... - - -def deform( - image: Image.Image, - deformer: SupportsGetMesh, - resample: int = Image.Resampling.BILINEAR, -) -> Image.Image: - """ - Deform the image. - - :param image: The image to deform. - :param deformer: A deformer object. Any object that implements a - ``getmesh`` method can be used. - :param resample: An optional resampling filter. Same values possible as - in the PIL.Image.transform function. - :return: An image. - """ - return image.transform( - image.size, Image.Transform.MESH, deformer.getmesh(image), resample - ) - - -def equalize(image: Image.Image, mask: Image.Image | None = None) -> Image.Image: - """ - Equalize the image histogram. This function applies a non-linear - mapping to the input image, in order to create a uniform - distribution of grayscale values in the output image. - - :param image: The image to equalize. - :param mask: An optional mask. If given, only the pixels selected by - the mask are included in the analysis. - :return: An image. - """ - if image.mode == "P": - image = image.convert("RGB") - h = image.histogram(mask) - lut = [] - for b in range(0, len(h), 256): - histo = [_f for _f in h[b : b + 256] if _f] - if len(histo) <= 1: - lut.extend(list(range(256))) - else: - step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 - if not step: - lut.extend(list(range(256))) - else: - n = step // 2 - for i in range(256): - lut.append(n // step) - n = n + h[i + b] - return _lut(image, lut) - - -def expand( - image: Image.Image, - border: int | tuple[int, ...] = 0, - fill: str | int | tuple[int, ...] = 0, -) -> Image.Image: - """ - Add border to the image - - :param image: The image to expand. - :param border: Border width, in pixels. - :param fill: Pixel fill value (a color value). Default is 0 (black). - :return: An image. - """ - left, top, right, bottom = _border(border) - width = left + image.size[0] + right - height = top + image.size[1] + bottom - color = _color(fill, image.mode) - if image.palette: - palette = ImagePalette.ImagePalette(palette=image.getpalette()) - if isinstance(color, tuple): - color = palette.getcolor(color) - else: - palette = None - out = Image.new(image.mode, (width, height), color) - if palette: - out.putpalette(palette.palette) - out.paste(image, (left, top)) - return out - - -def fit( - image: Image.Image, - size: tuple[int, int], - method: int = Image.Resampling.BICUBIC, - bleed: float = 0.0, - centering: tuple[float, float] = (0.5, 0.5), -) -> Image.Image: - """ - Returns a resized and cropped version of the image, cropped to the - requested aspect ratio and size. - - This function was contributed by Kevin Cazabon. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :param bleed: Remove a border around the outside of the image from all - four edges. The value is a decimal percentage (use 0.01 for - one percent). The default value is 0 (no border). - Cannot be greater than or equal to 0.5. - :param centering: Control the cropping position. Use (0.5, 0.5) for - center cropping (e.g. if cropping the width, take 50% off - of the left side, and therefore 50% off the right side). - (0.0, 0.0) will crop from the top left corner (i.e. if - cropping the width, take all of the crop off of the right - side, and if cropping the height, take all of it off the - bottom). (1.0, 0.0) will crop from the bottom left - corner, etc. (i.e. if cropping the width, take all of the - crop off the left side, and if cropping the height take - none from the top, and therefore all off the bottom). - :return: An image. - """ - - # by Kevin Cazabon, Feb 17/2000 - # kevin@cazabon.com - # https://www.cazabon.com - - centering_x, centering_y = centering - - if not 0.0 <= centering_x <= 1.0: - centering_x = 0.5 - if not 0.0 <= centering_y <= 1.0: - centering_y = 0.5 - - if not 0.0 <= bleed < 0.5: - bleed = 0.0 - - # calculate the area to use for resizing and cropping, subtracting - # the 'bleed' around the edges - - # number of pixels to trim off on Top and Bottom, Left and Right - bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) - - live_size = ( - image.size[0] - bleed_pixels[0] * 2, - image.size[1] - bleed_pixels[1] * 2, - ) - - # calculate the aspect ratio of the live_size - live_size_ratio = live_size[0] / live_size[1] - - # calculate the aspect ratio of the output image - output_ratio = size[0] / size[1] - - # figure out if the sides or top/bottom will be cropped off - if live_size_ratio == output_ratio: - # live_size is already the needed ratio - crop_width = live_size[0] - crop_height = live_size[1] - elif live_size_ratio >= output_ratio: - # live_size is wider than what's needed, crop the sides - crop_width = output_ratio * live_size[1] - crop_height = live_size[1] - else: - # live_size is taller than what's needed, crop the top and bottom - crop_width = live_size[0] - crop_height = live_size[0] / output_ratio - - # make the crop - crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering_x - crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering_y - - crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) - - # resize the image and return it - return image.resize(size, method, box=crop) - - -def flip(image: Image.Image) -> Image.Image: - """ - Flip the image vertically (top to bottom). - - :param image: The image to flip. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_TOP_BOTTOM) - - -def grayscale(image: Image.Image) -> Image.Image: - """ - Convert the image to grayscale. - - :param image: The image to convert. - :return: An image. - """ - return image.convert("L") - - -def invert(image: Image.Image) -> Image.Image: - """ - Invert (negate) the image. - - :param image: The image to invert. - :return: An image. - """ - lut = list(range(255, -1, -1)) - return image.point(lut) if image.mode == "1" else _lut(image, lut) - - -def mirror(image: Image.Image) -> Image.Image: - """ - Flip image horizontally (left to right). - - :param image: The image to mirror. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -def posterize(image: Image.Image, bits: int) -> Image.Image: - """ - Reduce the number of bits for each color channel. - - :param image: The image to posterize. - :param bits: The number of bits to keep for each channel (1-8). - :return: An image. - """ - mask = ~(2 ** (8 - bits) - 1) - lut = [i & mask for i in range(256)] - return _lut(image, lut) - - -def solarize(image: Image.Image, threshold: int = 128) -> Image.Image: - """ - Invert all pixel values above a threshold. - - :param image: The image to solarize. - :param threshold: All pixels above this grayscale level are inverted. - :return: An image. - """ - lut = [] - for i in range(256): - if i < threshold: - lut.append(i) - else: - lut.append(255 - i) - return _lut(image, lut) - - -def exif_transpose(image: Image.Image, *, in_place: bool = False) -> Image.Image | None: - """ - If an image has an EXIF Orientation tag, other than 1, transpose the image - accordingly, and remove the orientation data. - - :param image: The image to transpose. - :param in_place: Boolean. Keyword-only argument. - If ``True``, the original image is modified in-place, and ``None`` is returned. - If ``False`` (default), a new :py:class:`~PIL.Image.Image` object is returned - with the transposition applied. If there is no transposition, a copy of the - image will be returned. - """ - image.load() - image_exif = image.getexif() - orientation = image_exif.get(ExifTags.Base.Orientation, 1) - method = { - 2: Image.Transpose.FLIP_LEFT_RIGHT, - 3: Image.Transpose.ROTATE_180, - 4: Image.Transpose.FLIP_TOP_BOTTOM, - 5: Image.Transpose.TRANSPOSE, - 6: Image.Transpose.ROTATE_270, - 7: Image.Transpose.TRANSVERSE, - 8: Image.Transpose.ROTATE_90, - }.get(orientation) - if method is not None: - transposed_image = image.transpose(method) - if in_place: - image.im = transposed_image.im - image.pyaccess = None - image._size = transposed_image._size - exif_image = image if in_place else transposed_image - - exif = exif_image.getexif() - if ExifTags.Base.Orientation in exif: - del exif[ExifTags.Base.Orientation] - if "exif" in exif_image.info: - exif_image.info["exif"] = exif.tobytes() - elif "Raw profile type exif" in exif_image.info: - exif_image.info["Raw profile type exif"] = exif.tobytes().hex() - elif "XML:com.adobe.xmp" in exif_image.info: - for pattern in ( - r'tiff:Orientation="([0-9])"', - r"([0-9])", - ): - exif_image.info["XML:com.adobe.xmp"] = re.sub( - pattern, "", exif_image.info["XML:com.adobe.xmp"] - ) - if not in_place: - return transposed_image - elif not in_place: - return image.copy() - return None diff --git a/.flatpak-builder/cache/objects/ad/d930e71ffc6638a7232b039d4f87df1f191db000881a77a8447710b5fb4f7d.file b/.flatpak-builder/cache/objects/ad/d930e71ffc6638a7232b039d4f87df1f191db000881a77a8447710b5fb4f7d.file deleted file mode 100644 index 6722fa2..0000000 --- a/.flatpak-builder/cache/objects/ad/d930e71ffc6638a7232b039d4f87df1f191db000881a77a8447710b5fb4f7d.file +++ /dev/null @@ -1,103 +0,0 @@ -# -# The Python Imaging Library -# -# load a GIMP brush file -# -# History: -# 96-03-14 fl Created -# 16-01-08 es Version 2 -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# Copyright (c) Eric Soroos 2016. -# -# See the README file for information on usage and redistribution. -# -# -# See https://github.com/GNOME/gimp/blob/mainline/devel-docs/gbr.txt for -# format documentation. -# -# This code Interprets version 1 and 2 .gbr files. -# Version 1 files are obsolete, and should not be used for new -# brushes. -# Version 2 files are saved by GIMP v2.8 (at least) -# Version 3 files have a format specifier of 18 for 16bit floats in -# the color depth field. This is currently unsupported by Pillow. -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i32be as i32 - - -def _accept(prefix): - return len(prefix) >= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) - - -## -# Image plugin for the GIMP brush format. - - -class GbrImageFile(ImageFile.ImageFile): - format = "GBR" - format_description = "GIMP brush file" - - def _open(self): - header_size = i32(self.fp.read(4)) - if header_size < 20: - msg = "not a GIMP brush" - raise SyntaxError(msg) - version = i32(self.fp.read(4)) - if version not in (1, 2): - msg = f"Unsupported GIMP brush version: {version}" - raise SyntaxError(msg) - - width = i32(self.fp.read(4)) - height = i32(self.fp.read(4)) - color_depth = i32(self.fp.read(4)) - if width <= 0 or height <= 0: - msg = "not a GIMP brush" - raise SyntaxError(msg) - if color_depth not in (1, 4): - msg = f"Unsupported GIMP brush color depth: {color_depth}" - raise SyntaxError(msg) - - if version == 1: - comment_length = header_size - 20 - else: - comment_length = header_size - 28 - magic_number = self.fp.read(4) - if magic_number != b"GIMP": - msg = "not a GIMP brush, bad magic number" - raise SyntaxError(msg) - self.info["spacing"] = i32(self.fp.read(4)) - - comment = self.fp.read(comment_length)[:-1] - - if color_depth == 1: - self._mode = "L" - else: - self._mode = "RGBA" - - self._size = width, height - - self.info["comment"] = comment - - # Image might not be small - Image._decompression_bomb_check(self.size) - - # Data is an uncompressed block of w * h * bytes/pixel - self._data_size = width * height * color_depth - - def load(self): - if not self.im: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self._data_size)) - return Image.Image.load(self) - - -# -# registry - - -Image.register_open(GbrImageFile.format, GbrImageFile, _accept) -Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/.flatpak-builder/cache/objects/ae/44de01fdb474fb1809ca26d05ea4c50ef51b207849e25594fdb62df28d4a33.file b/.flatpak-builder/cache/objects/ae/44de01fdb474fb1809ca26d05ea4c50ef51b207849e25594fdb62df28d4a33.file deleted file mode 100644 index b4488e6..0000000 --- a/.flatpak-builder/cache/objects/ae/44de01fdb474fb1809ca26d05ea4c50ef51b207849e25594fdb62df28d4a33.file +++ /dev/null @@ -1,115 +0,0 @@ -""" -A Pillow loader for .ftc and .ftu files (FTEX) -Jerome Leclanche - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ - -Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 - -The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a -packed custom format called FTEX. This file format uses file extensions FTC -and FTU. -* FTC files are compressed textures (using standard texture compression). -* FTU files are not compressed. -Texture File Format -The FTC and FTU texture files both use the same format. This -has the following structure: -{header} -{format_directory} -{data} -Where: -{header} = { - u32:magic, - u32:version, - u32:width, - u32:height, - u32:mipmap_count, - u32:format_count -} - -* The "magic" number is "FTEX". -* "width" and "height" are the dimensions of the texture. -* "mipmap_count" is the number of mipmaps in the texture. -* "format_count" is the number of texture formats (different versions of the -same texture) in this file. - -{format_directory} = format_count * { u32:format, u32:where } - -The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB -uncompressed textures. -The texture data for a format starts at the position "where" in the file. - -Each set of texture data in the file has the following structure: -{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } -* "mipmap_size" is the number of bytes in that mip level. For compressed -textures this is the size of the texture data compressed with DXT1. For 24 bit -uncompressed textures, this is 3 * width * height. Following this are the image -bytes for that mipmap level. - -Note: All data is stored in little-Endian (Intel) byte order. -""" - -from __future__ import annotations - -import struct -from enum import IntEnum -from io import BytesIO - -from . import Image, ImageFile - -MAGIC = b"FTEX" - - -class Format(IntEnum): - DXT1 = 0 - UNCOMPRESSED = 1 - - -class FtexImageFile(ImageFile.ImageFile): - format = "FTEX" - format_description = "Texture File Format (IW2:EOC)" - - def _open(self): - if not _accept(self.fp.read(4)): - msg = "not an FTEX file" - raise SyntaxError(msg) - struct.unpack("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 str | None: - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self) -> str: - """Absolute path including the query string.""" - uri = self.path or "/" - - if self.query is not None: - uri += "?" + self.query - - return uri - - @property - def authority(self) -> str | None: - """ - Authority component as defined in RFC 3986 3.2. - This includes userinfo (auth), host and port. - - i.e. - userinfo@host:port - """ - userinfo = self.auth - netloc = self.netloc - if netloc is None or userinfo is None: - return netloc - else: - return f"{userinfo}@{netloc}" - - @property - def netloc(self) -> str | None: - """ - Network location including host and port. - - If you need the equivalent of urllib.parse's ``netloc``, - use the ``authority`` property instead. - """ - if self.host is None: - return None - if self.port: - return f"{self.host}:{self.port}" - return self.host - - @property - def url(self) -> str: - """ - Convert self into a url - - This function should more or less round-trip with :func:`.parse_url`. The - returned url may not be exactly the same as the url inputted to - :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls - with a blank port will have : removed). - - Example: - - .. code-block:: python - - import urllib3 - - U = urllib3.util.parse_url("https://google.com/mail/") - - print(U.url) - # "https://google.com/mail/" - - print( urllib3.util.Url("https", "username:password", - "host.com", 80, "/path", "query", "fragment" - ).url - ) - # "https://username:password@host.com:80/path?query#fragment" - """ - scheme, auth, host, port, path, query, fragment = self - url = "" - - # We use "is not None" we want things to happen with empty strings (or 0 port) - if scheme is not None: - url += scheme + "://" - if auth is not None: - url += auth + "@" - if host is not None: - url += host - if port is not None: - url += ":" + str(port) - if path is not None: - url += path - if query is not None: - url += "?" + query - if fragment is not None: - url += "#" + fragment - - return url - - def __str__(self) -> str: - return self.url - - -@typing.overload -def _encode_invalid_chars( - component: str, allowed_chars: typing.Container[str] -) -> str: # Abstract - ... - - -@typing.overload -def _encode_invalid_chars( - component: None, allowed_chars: typing.Container[str] -) -> None: # Abstract - ... - - -def _encode_invalid_chars( - component: str | None, allowed_chars: typing.Container[str] -) -> str | None: - """Percent-encodes a URI component without reapplying - onto an already percent-encoded component. - """ - if component is None: - return component - - component = to_str(component) - - # Normalize existing percent-encoded bytes. - # Try to see if the component we're encoding is already percent-encoded - # so we can skip all '%' characters but still encode all others. - component, percent_encodings = _PERCENT_RE.subn( - lambda match: match.group(0).upper(), component - ) - - uri_bytes = component.encode("utf-8", "surrogatepass") - is_percent_encoded = percent_encodings == uri_bytes.count(b"%") - encoded_component = bytearray() - - for i in range(0, len(uri_bytes)): - # Will return a single character bytestring - byte = uri_bytes[i : i + 1] - byte_ord = ord(byte) - if (is_percent_encoded and byte == b"%") or ( - byte_ord < 128 and byte.decode() in allowed_chars - ): - encoded_component += byte - continue - encoded_component.extend(b"%" + (hex(byte_ord)[2:].encode().zfill(2).upper())) - - return encoded_component.decode() - - -def _remove_path_dot_segments(path: str) -> str: - # See http://tools.ietf.org/html/rfc3986#section-5.2.4 for pseudo-code - segments = path.split("/") # Turn the path into a list of segments - output = [] # Initialize the variable to use to store output - - for segment in segments: - # '.' is the current directory, so ignore it, it is superfluous - if segment == ".": - continue - # Anything other than '..', should be appended to the output - if segment != "..": - output.append(segment) - # In this case segment == '..', if we can, we should pop the last - # element - elif output: - output.pop() - - # If the path starts with '/' and the output is empty or the first string - # is non-empty - if path.startswith("/") and (not output or output[0]): - output.insert(0, "") - - # If the path starts with '/.' or '/..' ensure we add one more empty - # string to add a trailing '/' - if path.endswith(("/.", "/..")): - output.append("") - - return "/".join(output) - - -@typing.overload -def _normalize_host(host: None, scheme: str | None) -> None: - ... - - -@typing.overload -def _normalize_host(host: str, scheme: str | None) -> str: - ... - - -def _normalize_host(host: str | None, scheme: str | None) -> str | None: - if host: - if scheme in _NORMALIZABLE_SCHEMES: - is_ipv6 = _IPV6_ADDRZ_RE.match(host) - if is_ipv6: - # IPv6 hosts of the form 'a::b%zone' are encoded in a URL as - # such per RFC 6874: 'a::b%25zone'. Unquote the ZoneID - # separator as necessary to return a valid RFC 4007 scoped IP. - match = _ZONE_ID_RE.search(host) - if match: - start, end = match.span(1) - zone_id = host[start:end] - - if zone_id.startswith("%25") and zone_id != "%25": - zone_id = zone_id[3:] - else: - zone_id = zone_id[1:] - zone_id = _encode_invalid_chars(zone_id, _UNRESERVED_CHARS) - return f"{host[:start].lower()}%{zone_id}{host[end:]}" - else: - return host.lower() - elif not _IPV4_RE.match(host): - return to_str( - b".".join([_idna_encode(label) for label in host.split(".")]), - "ascii", - ) - return host - - -def _idna_encode(name: str) -> bytes: - if not name.isascii(): - try: - import idna - except ImportError: - raise LocationParseError( - "Unable to parse URL without the 'idna' module" - ) from None - - try: - return idna.encode(name.lower(), strict=True, std3_rules=True) - except idna.IDNAError: - raise LocationParseError( - f"Name '{name}' is not a valid IDNA label" - ) from None - - return name.lower().encode("ascii") - - -def _encode_target(target: str) -> str: - """Percent-encodes a request target so that there are no invalid characters - - Pre-condition for this function is that 'target' must start with '/'. - If that is the case then _TARGET_RE will always produce a match. - """ - match = _TARGET_RE.match(target) - if not match: # Defensive: - raise LocationParseError(f"{target!r} is not a valid request URI") - - path, query = match.groups() - encoded_target = _encode_invalid_chars(path, _PATH_CHARS) - if query is not None: - query = _encode_invalid_chars(query, _QUERY_CHARS) - encoded_target += "?" + query - return encoded_target - - -def parse_url(url: str) -> Url: - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - This parser is RFC 3986 and RFC 6874 compliant. - - The parser logic and helper functions are based heavily on - work done in the ``rfc3986`` module. - - :param str url: URL to parse into a :class:`.Url` namedtuple. - - Partly backwards-compatible with :mod:`urllib.parse`. - - Example: - - .. code-block:: python - - import urllib3 - - print( urllib3.util.parse_url('http://google.com/mail/')) - # Url(scheme='http', host='google.com', port=None, path='/mail/', ...) - - print( urllib3.util.parse_url('google.com:80')) - # Url(scheme=None, host='google.com', port=80, path=None, ...) - - print( urllib3.util.parse_url('/foo?bar')) - # Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - if not url: - # Empty - return Url() - - source_url = url - if not _SCHEME_RE.search(url): - url = "//" + url - - scheme: str | None - authority: str | None - auth: str | None - host: str | None - port: str | None - port_int: int | None - path: str | None - query: str | None - fragment: str | None - - try: - scheme, authority, path, query, fragment = _URI_RE.match(url).groups() # type: ignore[union-attr] - normalize_uri = scheme is None or scheme.lower() in _NORMALIZABLE_SCHEMES - - if scheme: - scheme = scheme.lower() - - if authority: - auth, _, host_port = authority.rpartition("@") - auth = auth or None - host, port = _HOST_PORT_RE.match(host_port).groups() # type: ignore[union-attr] - if auth and normalize_uri: - auth = _encode_invalid_chars(auth, _USERINFO_CHARS) - if port == "": - port = None - else: - auth, host, port = None, None, None - - if port is not None: - port_int = int(port) - if not (0 <= port_int <= 65535): - raise LocationParseError(url) - else: - port_int = None - - host = _normalize_host(host, scheme) - - if normalize_uri and path: - path = _remove_path_dot_segments(path) - path = _encode_invalid_chars(path, _PATH_CHARS) - if normalize_uri and query: - query = _encode_invalid_chars(query, _QUERY_CHARS) - if normalize_uri and fragment: - fragment = _encode_invalid_chars(fragment, _FRAGMENT_CHARS) - - except (ValueError, AttributeError) as e: - raise LocationParseError(source_url) from e - - # For the sake of backwards compatibility we put empty - # string values for path if there are any defined values - # beyond the path in the URL. - # TODO: Remove this when we break backwards compatibility. - if not path: - if query is not None or fragment is not None: - path = "" - else: - path = None - - return Url( - scheme=scheme, - auth=auth, - host=host, - port=port_int, - path=path, - query=query, - fragment=fragment, - ) diff --git a/.flatpak-builder/cache/objects/af/684b7b3ceb2fb94fdf1e9635286932a5943285b4a96cb0007e00a8cbc4b866.file b/.flatpak-builder/cache/objects/af/684b7b3ceb2fb94fdf1e9635286932a5943285b4a96cb0007e00a8cbc4b866.file deleted file mode 100644 index 8927b21444a9a0b4c339bc0fdeb4099daaf1bfe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6201 zcmaJ^X>c6Jb)MM^*u~-^zyp*(j(7+JMFJo}MiQyOlEniu#X}-RNjx+dZ1(~!?9Qxa zW=R49Y$#!3P@!U3v`px-V3#e+mR$BC}no{+xgz>^S#%vyMNf+oQWHT@$Am=YhADO4*d(>Yfqx`c1xOuaou2sV=$A& z3T82OCT1GKU~!hXX0jwp0UKB&FwHW+CYA*@vld`0YXi2kRlp9`30%$A0N1j0z%I5P zco(}H*v&QoH!=%&58DLX%(h%J(a%;&)$_9XBmI|Y1-od!P5o&i3~&H&G{bHMZLIiSr(fDRi4<`@HVmIscp@k&pE zJr6#?3cwcB183M*fnQ^@z?ayc0sov`2L1*6 zOW@bp9PkQzS@m=#9y551{ndw8--8!Fz>l6Y3HHim<4h9TFL)R6nsWkfUEqFzX~PQn3~W;|uj6ye zDX3zs&pHGHaWch@s<-;QiII_IcKnE9=qgk3CiKoET#808IN#?%$-_X%N%fx7L$@%K zzRZ#epI$S{JnnfD<yt)Q3cS z+#OpQtB7*rJU3DDgc~kRDN!uSmVIG|o@W<4cP#3xIMA+_F8!S<+7QLOi725a6s0g9 z8?2H3A<=JRp2w!*a7hNMmYq3Yarffv=Vdrus)xG>D>& zmCD2p_!(|)tJTkqdjbv?NaBg(lSCH0>epki6q3+ViZpm;h+-6qg8jV;;405 zrpFYeYXY&SQmr=f+TxGe;Roa;I2UOQt25+LibUd7RVx-XjXDhFbzX_$AmW>qp_ScA zfJ|WquTkl?k~3L^ZFCLf7Z$;lS|YAdwKP)Xs9=n{;#*WFtxTbh5wD$P7w%MfR*lalqeaat zq~eFvPO9MLCSa2HscJh7$Y#96T?A-uGRiE!iyzfG@O;J*+elZ10%n82iqd7bA{9TT za&6_(nC~!NbA8lMk%$ke#Oiu?*NXYak(b0zDnn8`0n&|1TeP)Dja8BODV13}j=aWw z8=0iQg5~&#+CD20zn~geMrcoMeF2XWNa&8Ot73 zYL|Hz0~=Wy_O0Y?A6s42euqf>it2YGU0gtzYp);&*abd@n#jokh7mQdpyHOQWJarV z1%V#yT){(zuG&ESo6;tt)z~(<@1m7}`#3Pz-1j{{%GR@~c)xe9vi)5bpHQ={DrMlv zRNyLCApriJA zhLlqfMG@NkQjT++!=rRfBmRdP(t8lUgl!sn@xMwKk2bnIyy*E8UzjtM$C6twqvNl~uNz@aWf&^`-1)3LvL7(c zpFfAw`iwDSPMcs)&BVgwa;-46{5~CwXwPFy;UxWDF+5|X)OWSp0+BlyWox`7&+W!>J_k1Je%L5%j7CUMGe2m5yI z>JMLIu*GF<+Y4UdZp)u}aAM=N%w&LITLX+g@jPw`QL3__z}3o% zlKR?NnU((yREpvl#MG)g2d2U!*bA67K5FZ{o_;M&9sVT$vr``y@P4Cf|4m@q{+n(4 z=aL__cFmt!*gJppMr-e4W3T^B)VytGKHnXEP`+-~9MU>t#*8bm>CY^rifh_*n3>1? ztEkl*_g}%E|1AaI1_Ww_TGp(djQ=Xg)Vj}1re;_bxxsyaPb-$)G`zTJ_-CC9gZPBs zeenAaf_~teEKpJNAo{!tszLT6Uzx(2wFTOGJ_RRb2M%&=cw!y`=!B1s_YAzE?ZkI+C zK4~$s9g9sHK8YLYwpX`YX_@bQx9iQWdYk=n&975G-|&kKklolcd=uC;e6wr#M&s~e z zJ+eWwMzFb!GObC5NRuX6U2d0b)~rRdVcDu#n<{v>Y}aI!BHgk>lTKakfLyKF8l~DO z*J`p(t2WCn&DLwyBk$7eZq1I$Zp}7mwn1*x%mPDa_h_=EqS~t2y_)sQ9?cAm+f?!O zvR9Msy1+(xpJqEWTQ7HN)~5ZoCUv)bjQCfG_sJu~A18jdJWBi+@e}em@e{;*-5_gH;BR%3J;=APw#C^r*?veq~kkmV5nfL|beexplOT@RyN#aw) zcgq)vPZQrRXNcF^=BuQ8Kz@yM5695;V%n0A#K@~v{wVPS#1F}X#19eQFAozRCcard zM*MN&kI19Mj}h;d$BCaH-X)(P{v`2!d6M|4YWb&#pC*34e46+(#J9?4iJu|9NuDK+ z!=IYZZh4;gbHvw6oA?Ov)6yZXZ8Mva`IwRJn9Iz!EH?JsXzaP!*fX1ysWvkujT+o* Sn5o(1OAVJBX7xv>s{aE$yGqdj diff --git a/.flatpak-builder/cache/objects/af/a72ded747db83a85f6fbf0175a50fec7926eff8523de4608663767f56e057d.file b/.flatpak-builder/cache/objects/af/a72ded747db83a85f6fbf0175a50fec7926eff8523de4608663767f56e057d.file deleted file mode 100644 index 2c83191..0000000 --- a/.flatpak-builder/cache/objects/af/a72ded747db83a85f6fbf0175a50fec7926eff8523de4608663767f56e057d.file +++ /dev/null @@ -1,365 +0,0 @@ -# -# The Python Imaging Library -# Pillow fork -# -# Python implementation of the PixelAccess Object -# -# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-2009 by Fredrik Lundh. -# Copyright (c) 2013 Eric Soroos -# -# See the README file for information on usage and redistribution -# - -# Notes: -# -# * Implements the pixel access object following Access.c -# * Taking only the tuple form, which is used from python. -# * Fill.c uses the integer form, but it's still going to use the old -# Access.c implementation. -# -from __future__ import annotations - -import logging -import sys - -from ._deprecate import deprecate - -FFI: type -try: - from cffi import FFI - - defs = """ - struct Pixel_RGBA { - unsigned char r,g,b,a; - }; - struct Pixel_I16 { - unsigned char l,r; - }; - """ - ffi = FFI() - ffi.cdef(defs) -except ImportError as ex: - # Allow error import for doc purposes, but error out when accessing - # anything in core. - from ._util import DeferredError - - FFI = ffi = DeferredError.new(ex) - -logger = logging.getLogger(__name__) - - -class PyAccess: - def __init__(self, img, readonly=False): - deprecate("PyAccess", 11) - vals = dict(img.im.unsafe_ptrs) - self.readonly = readonly - self.image8 = ffi.cast("unsigned char **", vals["image8"]) - self.image32 = ffi.cast("int **", vals["image32"]) - self.image = ffi.cast("unsigned char **", vals["image"]) - self.xsize, self.ysize = img.im.size - self._img = img - - # Keep pointer to im object to prevent dereferencing. - self._im = img.im - if self._im.mode in ("P", "PA"): - self._palette = img.palette - - # Debugging is polluting test traces, only useful here - # when hacking on PyAccess - # logger.debug("%s", vals) - self._post_init() - - def _post_init(self): - pass - - def __setitem__(self, xy, color): - """ - Modifies the pixel at x,y. The color is given as a single - numerical value for single band images, and a tuple for - multi-band images - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :param color: The pixel value. - """ - if self.readonly: - msg = "Attempt to putpixel a read only image" - raise ValueError(msg) - (x, y) = xy - if x < 0: - x = self.xsize + x - if y < 0: - y = self.ysize + y - (x, y) = self.check_xy((x, y)) - - if ( - self._im.mode in ("P", "PA") - and isinstance(color, (list, tuple)) - and len(color) in [3, 4] - ): - # RGB or RGBA value for a P or PA image - if self._im.mode == "PA": - alpha = color[3] if len(color) == 4 else 255 - color = color[:3] - color = self._palette.getcolor(color, self._img) - if self._im.mode == "PA": - color = (color, alpha) - - return self.set_pixel(x, y, color) - - def __getitem__(self, xy): - """ - Returns the pixel at x,y. The pixel is returned as a single - value for single band images or a tuple for multiple band - images - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :returns: a pixel value for single band images, a tuple of - pixel values for multiband images. - """ - (x, y) = xy - if x < 0: - x = self.xsize + x - if y < 0: - y = self.ysize + y - (x, y) = self.check_xy((x, y)) - return self.get_pixel(x, y) - - putpixel = __setitem__ - getpixel = __getitem__ - - def check_xy(self, xy): - (x, y) = xy - if not (0 <= x < self.xsize and 0 <= y < self.ysize): - msg = "pixel location out of range" - raise ValueError(msg) - return xy - - -class _PyAccess32_2(PyAccess): - """PA, LA, stored in first and last bytes of a 32 bit word""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.r, pixel.a - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - # tuple - pixel.r = min(color[0], 255) - pixel.a = min(color[1], 255) - - -class _PyAccess32_3(PyAccess): - """RGB and friends, stored in the first three bytes of a 32 bit word""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.r, pixel.g, pixel.b - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - # tuple - pixel.r = min(color[0], 255) - pixel.g = min(color[1], 255) - pixel.b = min(color[2], 255) - pixel.a = 255 - - -class _PyAccess32_4(PyAccess): - """RGBA etc, all 4 bytes of a 32 bit word""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.r, pixel.g, pixel.b, pixel.a - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - # tuple - pixel.r = min(color[0], 255) - pixel.g = min(color[1], 255) - pixel.b = min(color[2], 255) - pixel.a = min(color[3], 255) - - -class _PyAccess8(PyAccess): - """1, L, P, 8 bit images stored as uint8""" - - def _post_init(self, *args, **kwargs): - self.pixels = self.image8 - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - try: - # integer - self.pixels[y][x] = min(color, 255) - except TypeError: - # tuple - self.pixels[y][x] = min(color[0], 255) - - -class _PyAccessI16_N(PyAccess): - """I;16 access, native bitendian without conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("unsigned short **", self.image) - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - try: - # integer - self.pixels[y][x] = min(color, 65535) - except TypeError: - # tuple - self.pixels[y][x] = min(color[0], 65535) - - -class _PyAccessI16_L(PyAccess): - """I;16L access, with conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_I16 **", self.image) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.l + pixel.r * 256 - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - try: - color = min(color, 65535) - except TypeError: - color = min(color[0], 65535) - - pixel.l = color & 0xFF - pixel.r = color >> 8 - - -class _PyAccessI16_B(PyAccess): - """I;16B access, with conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_I16 **", self.image) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.l * 256 + pixel.r - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - try: - color = min(color, 65535) - except Exception: - color = min(color[0], 65535) - - pixel.l = color >> 8 - pixel.r = color & 0xFF - - -class _PyAccessI32_N(PyAccess): - """Signed Int32 access, native endian""" - - def _post_init(self, *args, **kwargs): - self.pixels = self.image32 - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - self.pixels[y][x] = color - - -class _PyAccessI32_Swap(PyAccess): - """I;32L/B access, with byteswapping conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = self.image32 - - def reverse(self, i): - orig = ffi.new("int *", i) - chars = ffi.cast("unsigned char *", orig) - chars[0], chars[1], chars[2], chars[3] = chars[3], chars[2], chars[1], chars[0] - return ffi.cast("int *", chars)[0] - - def get_pixel(self, x, y): - return self.reverse(self.pixels[y][x]) - - def set_pixel(self, x, y, color): - self.pixels[y][x] = self.reverse(color) - - -class _PyAccessF(PyAccess): - """32 bit float access""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("float **", self.image32) - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - try: - # not a tuple - self.pixels[y][x] = color - except TypeError: - # tuple - self.pixels[y][x] = color[0] - - -mode_map = { - "1": _PyAccess8, - "L": _PyAccess8, - "P": _PyAccess8, - "I;16N": _PyAccessI16_N, - "LA": _PyAccess32_2, - "La": _PyAccess32_2, - "PA": _PyAccess32_2, - "RGB": _PyAccess32_3, - "LAB": _PyAccess32_3, - "HSV": _PyAccess32_3, - "YCbCr": _PyAccess32_3, - "RGBA": _PyAccess32_4, - "RGBa": _PyAccess32_4, - "RGBX": _PyAccess32_4, - "CMYK": _PyAccess32_4, - "F": _PyAccessF, - "I": _PyAccessI32_N, -} - -if sys.byteorder == "little": - mode_map["I;16"] = _PyAccessI16_N - mode_map["I;16L"] = _PyAccessI16_N - mode_map["I;16B"] = _PyAccessI16_B - - mode_map["I;32L"] = _PyAccessI32_N - mode_map["I;32B"] = _PyAccessI32_Swap -else: - mode_map["I;16"] = _PyAccessI16_L - mode_map["I;16L"] = _PyAccessI16_L - mode_map["I;16B"] = _PyAccessI16_N - - mode_map["I;32L"] = _PyAccessI32_Swap - mode_map["I;32B"] = _PyAccessI32_N - - -def new(img, readonly=False): - access_type = mode_map.get(img.mode, None) - if not access_type: - logger.debug("PyAccess Not Implemented: %s", img.mode) - return None - return access_type(img, readonly) diff --git a/.flatpak-builder/cache/objects/b0/5e2bea8f7c239e5ba6d9a6c04fa15502bfcf8c6df54302e6874cda3dd71e71.file b/.flatpak-builder/cache/objects/b0/5e2bea8f7c239e5ba6d9a6c04fa15502bfcf8c6df54302e6874cda3dd71e71.file deleted file mode 100644 index f9e4c73..0000000 --- a/.flatpak-builder/cache/objects/b0/5e2bea8f7c239e5ba6d9a6c04fa15502bfcf8c6df54302e6874cda3dd71e71.file +++ /dev/null @@ -1,174 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# FLI/FLC file handling. -# -# History: -# 95-09-01 fl Created -# 97-01-03 fl Fixed parser, setup decoder tile -# 98-07-15 fl Renamed offset attribute to avoid name clash -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 - -# -# decoder - - -def _accept(prefix): - return ( - len(prefix) >= 6 - and i16(prefix, 4) in [0xAF11, 0xAF12] - and i16(prefix, 14) in [0, 3] # flags - ) - - -## -# Image plugin for the FLI/FLC animation format. Use the seek -# method to load individual frames. - - -class FliImageFile(ImageFile.ImageFile): - format = "FLI" - format_description = "Autodesk FLI/FLC Animation" - _close_exclusive_fp_after_loading = False - - def _open(self): - # HEAD - s = self.fp.read(128) - if not (_accept(s) and s[20:22] == b"\x00\x00"): - msg = "not an FLI/FLC file" - raise SyntaxError(msg) - - # frames - self.n_frames = i16(s, 6) - self.is_animated = self.n_frames > 1 - - # image characteristics - self._mode = "P" - self._size = i16(s, 8), i16(s, 10) - - # animation speed - duration = i32(s, 16) - magic = i16(s, 4) - if magic == 0xAF11: - duration = (duration * 1000) // 70 - self.info["duration"] = duration - - # look for palette - palette = [(a, a, a) for a in range(256)] - - s = self.fp.read(16) - - self.__offset = 128 - - if i16(s, 4) == 0xF100: - # prefix chunk; ignore it - self.__offset = self.__offset + i32(s) - self.fp.seek(self.__offset) - s = self.fp.read(16) - - if i16(s, 4) == 0xF1FA: - # look for palette chunk - number_of_subchunks = i16(s, 6) - chunk_size = None - for _ in range(number_of_subchunks): - if chunk_size is not None: - self.fp.seek(chunk_size - 6, os.SEEK_CUR) - s = self.fp.read(6) - chunk_type = i16(s, 4) - if chunk_type in (4, 11): - self._palette(palette, 2 if chunk_type == 11 else 0) - break - chunk_size = i32(s) - if not chunk_size: - break - - palette = [o8(r) + o8(g) + o8(b) for (r, g, b) in palette] - self.palette = ImagePalette.raw("RGB", b"".join(palette)) - - # set things up to decode first frame - self.__frame = -1 - self._fp = self.fp - self.__rewind = self.fp.tell() - self.seek(0) - - def _palette(self, palette, shift): - # load palette - - i = 0 - for e in range(i16(self.fp.read(2))): - s = self.fp.read(2) - i = i + s[0] - n = s[1] - if n == 0: - n = 256 - s = self.fp.read(n * 3) - for n in range(0, len(s), 3): - r = s[n] << shift - g = s[n + 1] << shift - b = s[n + 2] << shift - palette[i] = (r, g, b) - i += 1 - - def seek(self, frame): - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0) - - for f in range(self.__frame + 1, frame + 1): - self._seek(f) - - def _seek(self, frame): - if frame == 0: - self.__frame = -1 - self._fp.seek(self.__rewind) - self.__offset = 128 - else: - # ensure that the previous frame was loaded - self.load() - - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - self.__frame = frame - - # move to next frame - self.fp = self._fp - self.fp.seek(self.__offset) - - s = self.fp.read(4) - if not s: - msg = "missing frame size" - raise EOFError(msg) - - framesize = i32(s) - - self.decodermaxblock = framesize - self.tile = [("fli", (0, 0) + self.size, self.__offset, None)] - - self.__offset += framesize - - def tell(self): - return self.__frame - - -# -# registry - -Image.register_open(FliImageFile.format, FliImageFile, _accept) - -Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/.flatpak-builder/cache/objects/b0/f0da604b3b2b1ad09a4dc63f6f4714cfb59d8f96c596aa3f2635c28e1844f1.file b/.flatpak-builder/cache/objects/b0/f0da604b3b2b1ad09a4dc63f6f4714cfb59d8f96c596aa3f2635c28e1844f1.file deleted file mode 100644 index 7bd84eb..0000000 --- a/.flatpak-builder/cache/objects/b0/f0da604b3b2b1ad09a4dc63f6f4714cfb59d8f96c596aa3f2635c28e1844f1.file +++ /dev/null @@ -1,237 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# SGI image file handling -# -# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. -# -# -# -# History: -# 2017-22-07 mb Add RLE decompression -# 2016-16-10 mb Add save method without compression -# 1995-09-10 fl Created -# -# Copyright (c) 2016 by Mickael Bonfill. -# Copyright (c) 2008 by Karsten Hiddemann. -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1995 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -import struct -from typing import IO - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 2 and i16(prefix) == 474 - - -MODES = { - (1, 1, 1): "L", - (1, 2, 1): "L", - (2, 1, 1): "L;16B", - (2, 2, 1): "L;16B", - (1, 3, 3): "RGB", - (2, 3, 3): "RGB;16B", - (1, 3, 4): "RGBA", - (2, 3, 4): "RGBA;16B", -} - - -## -# Image plugin for SGI images. -class SgiImageFile(ImageFile.ImageFile): - format = "SGI" - format_description = "SGI Image File Format" - - def _open(self) -> None: - # HEAD - assert self.fp is not None - - headlen = 512 - s = self.fp.read(headlen) - - if not _accept(s): - msg = "Not an SGI image file" - raise ValueError(msg) - - # compression : verbatim or RLE - compression = s[2] - - # bpc : 1 or 2 bytes (8bits or 16bits) - bpc = s[3] - - # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) - dimension = i16(s, 4) - - # xsize : width - xsize = i16(s, 6) - - # ysize : height - ysize = i16(s, 8) - - # zsize : channels count - zsize = i16(s, 10) - - # layout - layout = bpc, dimension, zsize - - # determine mode from bits/zsize - rawmode = "" - try: - rawmode = MODES[layout] - except KeyError: - pass - - if rawmode == "": - msg = "Unsupported SGI image mode" - raise ValueError(msg) - - self._size = xsize, ysize - self._mode = rawmode.split(";")[0] - if self.mode == "RGB": - self.custom_mimetype = "image/rgb" - - # orientation -1 : scanlines begins at the bottom-left corner - orientation = -1 - - # decoder info - if compression == 0: - pagesize = xsize * ysize * bpc - if bpc == 2: - self.tile = [ - ("SGI16", (0, 0) + self.size, headlen, (self.mode, 0, orientation)) - ] - else: - self.tile = [] - offset = headlen - for layer in self.mode: - self.tile.append( - ("raw", (0, 0) + self.size, offset, (layer, 0, orientation)) - ) - offset += pagesize - elif compression == 1: - self.tile = [ - ("sgi_rle", (0, 0) + self.size, headlen, (rawmode, orientation, bpc)) - ] - - -def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None: - if im.mode not in {"RGB", "RGBA", "L"}: - msg = "Unsupported SGI image mode" - raise ValueError(msg) - - # Get the keyword arguments - info = im.encoderinfo - - # Byte-per-pixel precision, 1 = 8bits per pixel - bpc = info.get("bpc", 1) - - if bpc not in (1, 2): - msg = "Unsupported number of bytes per pixel" - raise ValueError(msg) - - # Flip the image, since the origin of SGI file is the bottom-left corner - orientation = -1 - # Define the file as SGI File Format - magic_number = 474 - # Run-Length Encoding Compression - Unsupported at this time - rle = 0 - - # Number of dimensions (x,y,z) - dim = 3 - # X Dimension = width / Y Dimension = height - x, y = im.size - if im.mode == "L" and y == 1: - dim = 1 - elif im.mode == "L": - dim = 2 - # Z Dimension: Number of channels - z = len(im.mode) - - if dim in {1, 2}: - z = 1 - - # assert we've got the right number of bands. - if len(im.getbands()) != z: - msg = f"incorrect number of bands in SGI write: {z} vs {len(im.getbands())}" - raise ValueError(msg) - - # Minimum Byte value - pinmin = 0 - # Maximum Byte value (255 = 8bits per pixel) - pinmax = 255 - # Image name (79 characters max, truncated below in write) - filename = os.path.basename(filename) - img_name = os.path.splitext(filename)[0].encode("ascii", "ignore") - # Standard representation of pixel in the file - colormap = 0 - fp.write(struct.pack(">h", magic_number)) - fp.write(o8(rle)) - fp.write(o8(bpc)) - fp.write(struct.pack(">H", dim)) - fp.write(struct.pack(">H", x)) - fp.write(struct.pack(">H", y)) - fp.write(struct.pack(">H", z)) - fp.write(struct.pack(">l", pinmin)) - fp.write(struct.pack(">l", pinmax)) - fp.write(struct.pack("4s", b"")) # dummy - fp.write(struct.pack("79s", img_name)) # truncates to 79 chars - fp.write(struct.pack("s", b"")) # force null byte after img_name - fp.write(struct.pack(">l", colormap)) - fp.write(struct.pack("404s", b"")) # dummy - - rawmode = "L" - if bpc == 2: - rawmode = "L;16B" - - for channel in im.split(): - fp.write(channel.tobytes("raw", rawmode, 0, orientation)) - - if hasattr(fp, "flush"): - fp.flush() - - -class SGI16Decoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes) -> tuple[int, int]: - assert self.fd is not None - assert self.im is not None - - rawmode, stride, orientation = self.args - pagesize = self.state.xsize * self.state.ysize - zsize = len(self.mode) - self.fd.seek(512) - - for band in range(zsize): - channel = Image.new("L", (self.state.xsize, self.state.ysize)) - channel.frombytes( - self.fd.read(2 * pagesize), "raw", "L;16B", stride, orientation - ) - self.im.putband(channel.im, band) - - return -1, 0 - - -# -# registry - - -Image.register_decoder("SGI16", SGI16Decoder) -Image.register_open(SgiImageFile.format, SgiImageFile, _accept) -Image.register_save(SgiImageFile.format, _save) -Image.register_mime(SgiImageFile.format, "image/sgi") - -Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) - -# End of file diff --git a/.flatpak-builder/cache/objects/b1/8de6cdfe2a1b769811260060dd40221e1bcc561c3c802cc93d1c593b01ccfa.file b/.flatpak-builder/cache/objects/b1/8de6cdfe2a1b769811260060dd40221e1bcc561c3c802cc93d1c593b01ccfa.file deleted file mode 100644 index 28b8352fbb665bb747f5874522e129f800b38e5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2085 zcmZuy&u<$=6rQ!6#Bmb4ZKU>qghu63BeIr36^dIS<(G|%oh-G}MCPy=@66gm_7}6W zv_2r^fCT?RIdI|tLi{s5a6mqRIQ3>!PCfBv?X)`~YwKy=n>X+K=FQHxzie!j@(7{t zemwf?&Nrd)H;msrOY@QO>In>xy8Z_q_er}L65Y5wqm-h>Uf`M4!%SARqgQYJD zBSe>eG6u^z)IxOmTSQmb%Fh7wn*vLpL6H`FsJcpsfsn;LFMNvcHA8WZLl?_2!`4KO z!vME^GUCAqclb~cF{zeHi)0?BX|CWbpxy*q?GAR;`r!mWVy-LL1n-!5&m#~c0mV)j zNWq7R3`J~~Fg#-^qqtG4jkp{qL(>WUT9l%0MJb`$9IBSZR1l0}SA>2FSvTwE$0lR| z{DRW;%oVSuU{vsP+(`mDzJ}CZ7)=BpjU~S4RB?TKdt0sQF-I_oJ7gH+on62>j-fs6 zj%nLpGZFJJux+(<=m#)Zv}Z8`*$=j=rI)JbRb#qFf*_Pc!kYLcG+xDumsP6fw7ly@ zs^iS^5@-Pm@T!@_Ooue?aQoRX-Cr00*@j#$_8$# zz=xk{p{~=WM2GEiy-fE?nQ}MMc$K@cc2X6Kcsf(dp;^$fb>);Ss`c!K#h($qt5%@x zq-;f35MmwS^H4v=-bnLr_99N14$(^jjbwjBvVNt{U5#bsgbl51M)}0o63VATo#d%b z`qt@_{y6coFSL^i)WWDs0*~?P7TD*Ap@9KHn4`uZPjet(`RVQB0JafG?s7KY|A7#p zAn(J{RAwF%9)o1?05_sZ!)J2bI8)a*rEP{03(hciK@KoiR}VYsCB;LA)f}u;>h%@^ zuCx-bHmtzbVQaBSC=exyAOTF_e}H2qrIOADC6YAG=6Fr+F|%{Dvv2nwA0O`R^bhv! zc6X#H4;TNj}I5p{gGL(*J3W&Rz#e0XlGo5Ue|1!2VB~=2?Bc`)}^KkgZLdV7jJ&E z-11U!hLpL1mR2wJ#e>W2!|JNo21k)|6A9F9Td42Z6bbe5o33T_81@pS5*klej(X_} zF~@DFa%s(nFnV2lIN#?dVi#QXvc=znndJ?`nB_K%!VD?%E;8PGf$nDif1=wj^#81c sDtCS_-@RD-qp&_(uC3>0=+ayiXVh3VR%ht{=7*DiRP^6#rc$Q=0Ra20UH||9 diff --git a/.flatpak-builder/cache/objects/b2/182427b64cca34929b7c9677de30b202ee6ec8b1a0e8ea48a2782276325eb5.file b/.flatpak-builder/cache/objects/b2/182427b64cca34929b7c9677de30b202ee6ec8b1a0e8ea48a2782276325eb5.file deleted file mode 100644 index 6bc7628..0000000 --- a/.flatpak-builder/cache/objects/b2/182427b64cca34929b7c9677de30b202ee6ec8b1a0e8ea48a2782276325eb5.file +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -import os -from typing import Any, NoReturn - -from ._typing import StrOrBytesPath, TypeGuard - - -def is_path(f: Any) -> TypeGuard[StrOrBytesPath]: - return isinstance(f, (bytes, str, os.PathLike)) - - -def is_directory(f: Any) -> TypeGuard[StrOrBytesPath]: - """Checks if an object is a string, and that it points to a directory.""" - return is_path(f) and os.path.isdir(f) - - -class DeferredError: - def __init__(self, ex: BaseException): - self.ex = ex - - def __getattr__(self, elt: str) -> NoReturn: - raise self.ex - - @staticmethod - def new(ex: BaseException) -> Any: - """ - Creates an object that raises the wrapped exception ``ex`` when used, - and casts it to :py:obj:`~typing.Any` type. - """ - return DeferredError(ex) diff --git a/.flatpak-builder/cache/objects/b2/5c29ff8e575699f8ecd53fbcb9a8da2ff7b229ffaab9d8ca7c7ea78dcb9440.file b/.flatpak-builder/cache/objects/b2/5c29ff8e575699f8ecd53fbcb9a8da2ff7b229ffaab9d8ca7c7ea78dcb9440.file deleted file mode 100755 index b88405ca0b7fcb94189708643ee786878e1f2e11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14616 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 QL$KOyVppt0)a}0h3!jUbKmY&$ diff --git a/.flatpak-builder/cache/objects/b2/72e308a3dc9456d0f4a2e474024991365dbec54294ff89558b3e7e9ea0a0f5.file b/.flatpak-builder/cache/objects/b2/72e308a3dc9456d0f4a2e474024991365dbec54294ff89558b3e7e9ea0a0f5.file deleted file mode 100644 index 7a7d1019960406438366bd49c90211dc1f4bcd78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8424 zcmd5>OLH5?5nh0_NG(NK68*}<_J~RxLZKEUNX98tV#}5km0XUCDeI8v0uHeQV6DY2 zw7VdMoboSn@gbEXsjsOP0IPw%o

Cjv4`U-f*$`Ab$yxj^-5nIy&6Jn9fD%N;VHgQ{il;T?f zvMFG7dtzI+2Knx2;&B@N6DS0^hbDG!H=pRg+hBHF!u=xxxYu{!y0xxOXL|Sui;4P} zh^noYq5Ahj%0u8-sQ$fXDzDLc2>sgt5F$&prtvt}7wg{>*9y9JD_h8rtA%#QLPn2Q zLqXv1D3K ze~~^OoGxPzjgJR)k~$+g>Ld*AA&H`w|o zy&E5^g};CtJ~uLa;r!UB)mS@J=Ab02wf2HyPx!M_-7$u&Mg&IW5)?)|uQ#G)o%Y}S z>9199JGuB1TPt?8jPIqb_%KeUiKkYb*tP0=slXNj2?Ea$c$UB^0xtqsZP;VmarHb5 z9Ma6epBxOy!F(L~#t~y2aH7+A^AR_n4D*qy)mS?TsO_v1CUd zJI~ms#GV-TMX=Gv=8e_*BF|LS*brVncq(N{=8^Sn!5+m=3V+ur{hvT0Nuu#5h_zXb z%CcOMcAMV&Q>kT<|0=aa+amu}q8R7T!iQJyxvcST8<-n*jg zGrf03*=2g~)kaxPtV%(!-0*KXC8n$Hu*{-``EE@55+hbHtQ7R~s9sSP&2ac>A!1+R`B7le-{TK2AB0 zQBE7bMV8OVL~9sankRbC$V9M%kH=+vj}!#UJrC&Z!y2kvmd|qCVQ{&h>ORYLJ9see zJeLTA%jc=Yc`o7L8>LQlv2C@vLq-ID5G-GOKyM$`P*2BY1VsnI@*N_7Cy{UCLH$DiUrNVaSg_%TE| z{a__YIfp2xjY7_6D5oE+v{BAyD5s4=PJhEpjL7M0{VMY|46YQZ;;YPA2On2R)`MWB ziFg2Aa8TfZqxh)Dn_k&|4_?CH1mTpf)kCS3`9STRG8}Y4u>88I9(zEDhc)a#3uO+1 zl^%1?&;vp|tYKAIK0@sB10l{wh|e}E-YUav3xbs$WRsgc#Ka!AcJaChB%jU9R~X^*D1mr&l1Ifmz;_i!HPN2J*Qm+yDRo diff --git a/.flatpak-builder/cache/objects/cb/814a65507a4228ff4d8d3c286980dca7de5033beddf54850202957b0f41814.file b/.flatpak-builder/cache/objects/cb/814a65507a4228ff4d8d3c286980dca7de5033beddf54850202957b0f41814.file deleted file mode 100644 index 6a43b04..0000000 --- a/.flatpak-builder/cache/objects/cb/814a65507a4228ff4d8d3c286980dca7de5033beddf54850202957b0f41814.file +++ /dev/null @@ -1,54 +0,0 @@ -""" -Given a list of integers, made up of (hopefully) a small number of long runs -of consecutive integers, compute a representation of the form -((start1, end1), (start2, end2) ...). Then answer the question "was x present -in the original list?" in time O(log(# runs)). -""" - -import bisect -from typing import List, Tuple - -def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: - """Represent a list of integers as a sequence of ranges: - ((start_0, end_0), (start_1, end_1), ...), such that the original - integers are exactly those x such that start_i <= x < end_i for some i. - - Ranges are encoded as single integers (start << 32 | end), not as tuples. - """ - - sorted_list = sorted(list_) - ranges = [] - last_write = -1 - for i in range(len(sorted_list)): - if i+1 < len(sorted_list): - if sorted_list[i] == sorted_list[i+1]-1: - continue - current_range = sorted_list[last_write+1:i+1] - ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) - last_write = i - - return tuple(ranges) - -def _encode_range(start: int, end: int) -> int: - return (start << 32) | end - -def _decode_range(r: int) -> Tuple[int, int]: - return (r >> 32), (r & ((1 << 32) - 1)) - - -def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: - """Determine if `int_` falls into one of the ranges in `ranges`.""" - tuple_ = _encode_range(int_, 0) - pos = bisect.bisect_left(ranges, tuple_) - # we could be immediately ahead of a tuple (start, end) - # with start < int_ <= end - if pos > 0: - left, right = _decode_range(ranges[pos-1]) - if left <= int_ < right: - return True - # or we could be immediately behind a tuple (int_, end) - if pos < len(ranges): - left, _ = _decode_range(ranges[pos]) - if left == int_: - return True - return False diff --git a/.flatpak-builder/cache/objects/cb/d277d10e4b2dca8a9d81b4a5e1ccb06278e0517606520168ced99cf8c21410.file b/.flatpak-builder/cache/objects/cb/d277d10e4b2dca8a9d81b4a5e1ccb06278e0517606520168ced99cf8c21410.file deleted file mode 100644 index 026bfd9..0000000 --- a/.flatpak-builder/cache/objects/cb/d277d10e4b2dca8a9d81b4a5e1ccb06278e0517606520168ced99cf8c21410.file +++ /dev/null @@ -1,227 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PCX file handling -# -# This format was originally used by ZSoft's popular PaintBrush -# program for the IBM PC. It is also supported by many MS-DOS and -# Windows applications, including the Windows PaintBrush program in -# Windows 3. -# -# history: -# 1995-09-01 fl Created -# 1996-05-20 fl Fixed RGB support -# 1997-01-03 fl Fixed 2-bit and 4-bit support -# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) -# 1999-02-07 fl Added write support -# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust -# 2002-07-30 fl Seek from to current position, not beginning of file -# 2003-06-03 fl Extract DPI settings (info["dpi"]) -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import logging -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -logger = logging.getLogger(__name__) - - -def _accept(prefix: bytes) -> bool: - return prefix[0] == 10 and prefix[1] in [0, 2, 3, 5] - - -## -# Image plugin for Paintbrush images. - - -class PcxImageFile(ImageFile.ImageFile): - format = "PCX" - format_description = "Paintbrush" - - def _open(self) -> None: - # header - assert self.fp is not None - - s = self.fp.read(128) - if not _accept(s): - msg = "not a PCX file" - raise SyntaxError(msg) - - # image - bbox = i16(s, 4), i16(s, 6), i16(s, 8) + 1, i16(s, 10) + 1 - if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: - msg = "bad PCX image size" - raise SyntaxError(msg) - logger.debug("BBox: %s %s %s %s", *bbox) - - # format - version = s[1] - bits = s[3] - planes = s[65] - provided_stride = i16(s, 66) - logger.debug( - "PCX version %s, bits %s, planes %s, stride %s", - version, - bits, - planes, - provided_stride, - ) - - self.info["dpi"] = i16(s, 12), i16(s, 14) - - if bits == 1 and planes == 1: - mode = rawmode = "1" - - elif bits == 1 and planes in (2, 4): - mode = "P" - rawmode = "P;%dL" % planes - self.palette = ImagePalette.raw("RGB", s[16:64]) - - elif version == 5 and bits == 8 and planes == 1: - mode = rawmode = "L" - # FIXME: hey, this doesn't work with the incremental loader !!! - self.fp.seek(-769, io.SEEK_END) - s = self.fp.read(769) - if len(s) == 769 and s[0] == 12: - # check if the palette is linear grayscale - for i in range(256): - if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3: - mode = rawmode = "P" - break - if mode == "P": - self.palette = ImagePalette.raw("RGB", s[1:]) - self.fp.seek(128) - - elif version == 5 and bits == 8 and planes == 3: - mode = "RGB" - rawmode = "RGB;L" - - else: - msg = "unknown PCX mode" - raise OSError(msg) - - self._mode = mode - self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] - - # Don't trust the passed in stride. - # Calculate the approximate position for ourselves. - # CVE-2020-35653 - stride = (self._size[0] * bits + 7) // 8 - - # While the specification states that this must be even, - # not all images follow this - if provided_stride != stride: - stride += stride % 2 - - bbox = (0, 0) + self.size - logger.debug("size: %sx%s", *self.size) - - self.tile = [("pcx", bbox, self.fp.tell(), (rawmode, planes * stride))] - - -# -------------------------------------------------------------------- -# save PCX files - - -SAVE = { - # mode: (version, bits, planes, raw mode) - "1": (2, 1, 1, "1"), - "L": (5, 8, 1, "L"), - "P": (5, 8, 1, "P"), - "RGB": (5, 8, 3, "RGB;L"), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None: - try: - version, bits, planes, rawmode = SAVE[im.mode] - except KeyError as e: - msg = f"Cannot save {im.mode} images as PCX" - raise ValueError(msg) from e - - # bytes per plane - stride = (im.size[0] * bits + 7) // 8 - # stride should be even - stride += stride % 2 - # Stride needs to be kept in sync with the PcxEncode.c version. - # Ideally it should be passed in in the state, but the bytes value - # gets overwritten. - - logger.debug( - "PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", - im.size[0], - bits, - stride, - ) - - # under windows, we could determine the current screen size with - # "Image.core.display_mode()[1]", but I think that's overkill... - - screen = im.size - - dpi = 100, 100 - - # PCX header - fp.write( - o8(10) - + o8(version) - + o8(1) - + o8(bits) - + o16(0) - + o16(0) - + o16(im.size[0] - 1) - + o16(im.size[1] - 1) - + o16(dpi[0]) - + o16(dpi[1]) - + b"\0" * 24 - + b"\xFF" * 24 - + b"\0" - + o8(planes) - + o16(stride) - + o16(1) - + o16(screen[0]) - + o16(screen[1]) - + b"\0" * 54 - ) - - assert fp.tell() == 128 - - ImageFile._save(im, fp, [("pcx", (0, 0) + im.size, 0, (rawmode, bits * planes))]) - - if im.mode == "P": - # colour palette - assert im.im is not None - - fp.write(o8(12)) - palette = im.im.getpalette("RGB", "RGB") - palette += b"\x00" * (768 - len(palette)) - fp.write(palette) # 768 bytes - elif im.mode == "L": - # grayscale palette - fp.write(o8(12)) - for i in range(256): - fp.write(o8(i) * 3) - - -# -------------------------------------------------------------------- -# registry - - -Image.register_open(PcxImageFile.format, PcxImageFile, _accept) -Image.register_save(PcxImageFile.format, _save) - -Image.register_extension(PcxImageFile.format, ".pcx") - -Image.register_mime(PcxImageFile.format, "image/x-pcx") diff --git a/.flatpak-builder/cache/objects/cc/700d46f407c6c5ab2d5dde474366a928b7398277e61162e7f8ec06f469f07e.file b/.flatpak-builder/cache/objects/cc/700d46f407c6c5ab2d5dde474366a928b7398277e61162e7f8ec06f469f07e.file deleted file mode 100644 index e69de29..0000000 diff --git a/.flatpak-builder/cache/objects/cc/df4fd6dad67e7b17321a979ad8489ea7511260e238951e1efa363df774adaa.file b/.flatpak-builder/cache/objects/cc/df4fd6dad67e7b17321a979ad8489ea7511260e238951e1efa363df774adaa.file deleted file mode 100755 index 81a63059005d71f0afc3fe9c1345ce6a08630c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14680 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 R_Z2C$EA3x(5>a>C`d=$4oh<+W diff --git a/.flatpak-builder/cache/objects/cd/3c930bea6b8ec60b9b1ed2638e333eaf07a77f6b100039875196b8d5107bd4.file b/.flatpak-builder/cache/objects/cd/3c930bea6b8ec60b9b1ed2638e333eaf07a77f6b100039875196b8d5107bd4.file deleted file mode 100644 index 9da6d09..0000000 --- a/.flatpak-builder/cache/objects/cd/3c930bea6b8ec60b9b1ed2638e333eaf07a77f6b100039875196b8d5107bd4.file +++ /dev/null @@ -1,154 +0,0 @@ -Metadata-Version: 2.1 -Name: urllib3 -Version: 2.2.1 -Summary: HTTP library with thread-safe connection pooling, file post, and more. -Project-URL: Changelog, https://github.com/urllib3/urllib3/blob/main/CHANGES.rst -Project-URL: Documentation, https://urllib3.readthedocs.io -Project-URL: Code, https://github.com/urllib3/urllib3 -Project-URL: Issue tracker, https://github.com/urllib3/urllib3/issues -Author-email: Andrey Petrov -Maintainer-email: Seth Michael Larson , Quentin Pradet , Illia Volochii -License-File: LICENSE.txt -Keywords: filepost,http,httplib,https,pooling,ssl,threadsafe,urllib -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: Software Development :: Libraries -Requires-Python: >=3.8 -Provides-Extra: brotli -Requires-Dist: brotli>=1.0.9; (platform_python_implementation == 'CPython') and extra == 'brotli' -Requires-Dist: brotlicffi>=0.8.0; (platform_python_implementation != 'CPython') and extra == 'brotli' -Provides-Extra: h2 -Requires-Dist: h2<5,>=4; extra == 'h2' -Provides-Extra: socks -Requires-Dist: pysocks!=1.5.7,<2.0,>=1.5.6; extra == 'socks' -Provides-Extra: zstd -Requires-Dist: zstandard>=0.18.0; extra == 'zstd' -Description-Content-Type: text/markdown - -

- -![urllib3](https://github.com/urllib3/urllib3/raw/main/docs/_static/banner_github.svg) - -

- -

- PyPI Version - Python Versions - Join our Discord - Coverage Status - Build Status on GitHub - Documentation Status
- OpenSSF Scorecard - SLSA 3 - CII Best Practices -

- -urllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the -Python ecosystem already uses urllib3 and you should too. -urllib3 brings many critical features that are missing from the Python -standard libraries: - -- Thread safety. -- Connection pooling. -- Client-side SSL/TLS verification. -- File uploads with multipart encoding. -- Helpers for retrying requests and dealing with HTTP redirects. -- Support for gzip, deflate, brotli, and zstd encoding. -- Proxy support for HTTP and SOCKS. -- 100% test coverage. - -urllib3 is powerful and easy to use: - -```python3 ->>> import urllib3 ->>> resp = urllib3.request("GET", "http://httpbin.org/robots.txt") ->>> resp.status -200 ->>> resp.data -b"User-agent: *\nDisallow: /deny\n" -``` - -## Installing - -urllib3 can be installed with [pip](https://pip.pypa.io): - -```bash -$ python -m pip install urllib3 -``` - -Alternatively, you can grab the latest source code from [GitHub](https://github.com/urllib3/urllib3): - -```bash -$ git clone https://github.com/urllib3/urllib3.git -$ cd urllib3 -$ pip install . -``` - - -## Documentation - -urllib3 has usage and reference documentation at [urllib3.readthedocs.io](https://urllib3.readthedocs.io). - - -## Community - -urllib3 has a [community Discord channel](https://discord.gg/urllib3) for asking questions and -collaborating with other contributors. Drop by and say hello 👋 - - -## Contributing - -urllib3 happily accepts contributions. Please see our -[contributing documentation](https://urllib3.readthedocs.io/en/latest/contributing.html) -for some tips on getting started. - - -## Security Disclosures - -To report a security vulnerability, please use the -[Tidelift security contact](https://tidelift.com/security). -Tidelift will coordinate the fix and disclosure with maintainers. - - -## Maintainers - -- [@sethmlarson](https://github.com/sethmlarson) (Seth M. Larson) -- [@pquentin](https://github.com/pquentin) (Quentin Pradet) -- [@illia-v](https://github.com/illia-v) (Illia Volochii) -- [@theacodes](https://github.com/theacodes) (Thea Flowers) -- [@haikuginger](https://github.com/haikuginger) (Jess Shapiro) -- [@lukasa](https://github.com/lukasa) (Cory Benfield) -- [@sigmavirus24](https://github.com/sigmavirus24) (Ian Stapleton Cordasco) -- [@shazow](https://github.com/shazow) (Andrey Petrov) - -👋 - - -## Sponsorship - -If your company benefits from this library, please consider [sponsoring its -development](https://urllib3.readthedocs.io/en/latest/sponsors.html). - - -## For Enterprise - -Professional support for urllib3 is available as part of the [Tidelift -Subscription][1]. Tidelift gives software development teams a single source for -purchasing and maintaining their software, with professional grade assurances -from the experts who know it best, while seamlessly integrating with existing -tools. - -[1]: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme diff --git a/.flatpak-builder/cache/objects/ce/eb55f1e7b2ce4acf98aff7377041f1e0781e03025877403326a9b586721af9.file b/.flatpak-builder/cache/objects/ce/eb55f1e7b2ce4acf98aff7377041f1e0781e03025877403326a9b586721af9.file deleted file mode 100644 index 35ee583..0000000 --- a/.flatpak-builder/cache/objects/ce/eb55f1e7b2ce4acf98aff7377041f1e0781e03025877403326a9b586721af9.file +++ /dev/null @@ -1,193 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# WCK-style drawing interface operations -# -# History: -# 2003-12-07 fl created -# 2005-05-15 fl updated; added to PIL as ImageDraw2 -# 2005-05-15 fl added text support -# 2005-05-20 fl added arc/chord/pieslice support -# -# Copyright (c) 2003-2005 by Secret Labs AB -# Copyright (c) 2003-2005 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -""" -(Experimental) WCK-style drawing interface operations - -.. seealso:: :py:mod:`PIL.ImageDraw` -""" -from __future__ import annotations - -from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath - - -class Pen: - """Stores an outline color and width.""" - - def __init__(self, color, width=1, opacity=255): - self.color = ImageColor.getrgb(color) - self.width = width - - -class Brush: - """Stores a fill color""" - - def __init__(self, color, opacity=255): - self.color = ImageColor.getrgb(color) - - -class Font: - """Stores a TrueType font and color""" - - def __init__(self, color, file, size=12): - # FIXME: add support for bitmap fonts - self.color = ImageColor.getrgb(color) - self.font = ImageFont.truetype(file, size) - - -class Draw: - """ - (Experimental) WCK-style drawing interface - """ - - def __init__(self, image, size=None, color=None): - if not hasattr(image, "im"): - image = Image.new(image, size, color) - self.draw = ImageDraw.Draw(image) - self.image = image - self.transform = None - - def flush(self): - return self.image - - def render(self, op, xy, pen, brush=None): - # handle color arguments - outline = fill = None - width = 1 - if isinstance(pen, Pen): - outline = pen.color - width = pen.width - elif isinstance(brush, Pen): - outline = brush.color - width = brush.width - if isinstance(brush, Brush): - fill = brush.color - elif isinstance(pen, Brush): - fill = pen.color - # handle transformation - if self.transform: - xy = ImagePath.Path(xy) - xy.transform(self.transform) - # render the item - if op == "line": - self.draw.line(xy, fill=outline, width=width) - else: - getattr(self.draw, op)(xy, fill=fill, outline=outline) - - def settransform(self, offset): - """Sets a transformation offset.""" - (xoffset, yoffset) = offset - self.transform = (1, 0, xoffset, 0, 1, yoffset) - - def arc(self, xy, start, end, *options): - """ - Draws an arc (a portion of a circle outline) between the start and end - angles, inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc` - """ - self.render("arc", xy, start, end, *options) - - def chord(self, xy, start, end, *options): - """ - Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points - with a straight line. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord` - """ - self.render("chord", xy, start, end, *options) - - def ellipse(self, xy, *options): - """ - Draws an ellipse inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.ellipse` - """ - self.render("ellipse", xy, *options) - - def line(self, xy, *options): - """ - Draws a line between the coordinates in the ``xy`` list. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.line` - """ - self.render("line", xy, *options) - - def pieslice(self, xy, start, end, *options): - """ - Same as arc, but also draws straight lines between the end points and the - center of the bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice` - """ - self.render("pieslice", xy, start, end, *options) - - def polygon(self, xy, *options): - """ - Draws a polygon. - - The polygon outline consists of straight lines between the given - coordinates, plus a straight line between the last and the first - coordinate. - - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.polygon` - """ - self.render("polygon", xy, *options) - - def rectangle(self, xy, *options): - """ - Draws a rectangle. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.rectangle` - """ - self.render("rectangle", xy, *options) - - def text(self, xy, text, font): - """ - Draws the string at the given position. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.text` - """ - if self.transform: - xy = ImagePath.Path(xy) - xy.transform(self.transform) - self.draw.text(xy, text, font=font.font, fill=font.color) - - def textbbox(self, xy, text, font): - """ - Returns bounding box (in pixels) of given text. - - :return: ``(left, top, right, bottom)`` bounding box - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textbbox` - """ - if self.transform: - xy = ImagePath.Path(xy) - xy.transform(self.transform) - return self.draw.textbbox(xy, text, font=font.font) - - def textlength(self, text, font): - """ - Returns length (in pixels) of given text. - This is the amount by which following text should be offset. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textlength` - """ - return self.draw.textlength(text, font=font.font) diff --git a/.flatpak-builder/cache/objects/cf/2b9cea3012aa0ccfa55b170b80b7a3dcd9ff7398f2e8219d916180fee97250.file b/.flatpak-builder/cache/objects/cf/2b9cea3012aa0ccfa55b170b80b7a3dcd9ff7398f2e8219d916180fee97250.file deleted file mode 100644 index 9947f43..0000000 --- a/.flatpak-builder/cache/objects/cf/2b9cea3012aa0ccfa55b170b80b7a3dcd9ff7398f2e8219d916180fee97250.file +++ /dev/null @@ -1,472 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# BMP file handler -# -# Windows (and OS/2) native bitmap storage format. -# -# history: -# 1995-09-01 fl Created -# 1996-04-30 fl Added save -# 1997-08-27 fl Fixed save of 1-bit images -# 1998-03-06 fl Load P images as L where possible -# 1998-07-03 fl Load P images as 1 where possible -# 1998-12-29 fl Handle small palettes -# 2002-12-30 fl Fixed load of 1-bit palette images -# 2003-04-21 fl Fixed load of 1-bit monochrome images -# 2003-04-23 fl Added limited support for BI_BITFIELDS compression -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1995-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o16le as o16 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- -# Read BMP file - -BIT2MODE = { - # bits => mode, rawmode - 1: ("P", "P;1"), - 4: ("P", "P;4"), - 8: ("P", "P"), - 16: ("RGB", "BGR;15"), - 24: ("RGB", "BGR"), - 32: ("RGB", "BGRX"), -} - - -def _accept(prefix): - return prefix[:2] == b"BM" - - -def _dib_accept(prefix): - return i32(prefix) in [12, 40, 64, 108, 124] - - -# ============================================================================= -# Image plugin for the Windows BMP format. -# ============================================================================= -class BmpImageFile(ImageFile.ImageFile): - """Image plugin for the Windows Bitmap format (BMP)""" - - # ------------------------------------------------------------- Description - format_description = "Windows Bitmap" - format = "BMP" - - # -------------------------------------------------- BMP Compression values - COMPRESSIONS = {"RAW": 0, "RLE8": 1, "RLE4": 2, "BITFIELDS": 3, "JPEG": 4, "PNG": 5} - for k, v in COMPRESSIONS.items(): - vars()[k] = v - - def _bitmap(self, header=0, offset=0): - """Read relevant info about the BMP""" - read, seek = self.fp.read, self.fp.seek - if header: - seek(header) - # read bmp header size @offset 14 (this is part of the header size) - file_info = {"header_size": i32(read(4)), "direction": -1} - - # -------------------- If requested, read header at a specific position - # read the rest of the bmp header, without its size - header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4) - - # -------------------------------------------------- IBM OS/2 Bitmap v1 - # ----- This format has different offsets because of width/height types - if file_info["header_size"] == 12: - file_info["width"] = i16(header_data, 0) - file_info["height"] = i16(header_data, 2) - file_info["planes"] = i16(header_data, 4) - file_info["bits"] = i16(header_data, 6) - file_info["compression"] = self.RAW - file_info["palette_padding"] = 3 - - # --------------------------------------------- Windows Bitmap v2 to v5 - # v3, OS/2 v2, v4, v5 - elif file_info["header_size"] in (40, 64, 108, 124): - file_info["y_flip"] = header_data[7] == 0xFF - file_info["direction"] = 1 if file_info["y_flip"] else -1 - file_info["width"] = i32(header_data, 0) - file_info["height"] = ( - i32(header_data, 4) - if not file_info["y_flip"] - else 2**32 - i32(header_data, 4) - ) - file_info["planes"] = i16(header_data, 8) - file_info["bits"] = i16(header_data, 10) - file_info["compression"] = i32(header_data, 12) - # byte size of pixel data - file_info["data_size"] = i32(header_data, 16) - file_info["pixels_per_meter"] = ( - i32(header_data, 20), - i32(header_data, 24), - ) - file_info["colors"] = i32(header_data, 28) - file_info["palette_padding"] = 4 - self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) - if file_info["compression"] == self.BITFIELDS: - if len(header_data) >= 52: - for idx, mask in enumerate( - ["r_mask", "g_mask", "b_mask", "a_mask"] - ): - file_info[mask] = i32(header_data, 36 + idx * 4) - else: - # 40 byte headers only have the three components in the - # bitfields masks, ref: - # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx - # See also - # https://github.com/python-pillow/Pillow/issues/1293 - # There is a 4th component in the RGBQuad, in the alpha - # location, but it is listed as a reserved component, - # and it is not generally an alpha channel - file_info["a_mask"] = 0x0 - for mask in ["r_mask", "g_mask", "b_mask"]: - file_info[mask] = i32(read(4)) - file_info["rgb_mask"] = ( - file_info["r_mask"], - file_info["g_mask"], - file_info["b_mask"], - ) - file_info["rgba_mask"] = ( - file_info["r_mask"], - file_info["g_mask"], - file_info["b_mask"], - file_info["a_mask"], - ) - else: - msg = f"Unsupported BMP header type ({file_info['header_size']})" - raise OSError(msg) - - # ------------------ Special case : header is reported 40, which - # ---------------------- is shorter than real size for bpp >= 16 - self._size = file_info["width"], file_info["height"] - - # ------- If color count was not found in the header, compute from bits - file_info["colors"] = ( - file_info["colors"] - if file_info.get("colors", 0) - else (1 << file_info["bits"]) - ) - if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8: - offset += 4 * file_info["colors"] - - # ---------------------- Check bit depth for unusual unsupported values - self._mode, raw_mode = BIT2MODE.get(file_info["bits"], (None, None)) - if self.mode is None: - msg = f"Unsupported BMP pixel depth ({file_info['bits']})" - raise OSError(msg) - - # ---------------- Process BMP with Bitfields compression (not palette) - decoder_name = "raw" - if file_info["compression"] == self.BITFIELDS: - SUPPORTED = { - 32: [ - (0xFF0000, 0xFF00, 0xFF, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0xFF), - (0xFF, 0xFF00, 0xFF0000, 0xFF000000), - (0xFF0000, 0xFF00, 0xFF, 0xFF000000), - (0x0, 0x0, 0x0, 0x0), - ], - 24: [(0xFF0000, 0xFF00, 0xFF)], - 16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)], - } - MASK_MODES = { - (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX", - (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR", - (32, (0xFF000000, 0xFF0000, 0xFF00, 0xFF)): "ABGR", - (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", - (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", - (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", - (24, (0xFF0000, 0xFF00, 0xFF)): "BGR", - (16, (0xF800, 0x7E0, 0x1F)): "BGR;16", - (16, (0x7C00, 0x3E0, 0x1F)): "BGR;15", - } - if file_info["bits"] in SUPPORTED: - if ( - file_info["bits"] == 32 - and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]] - ): - raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])] - self._mode = "RGBA" if "A" in raw_mode else self.mode - elif ( - file_info["bits"] in (24, 16) - and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]] - ): - raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])] - else: - msg = "Unsupported BMP bitfields layout" - raise OSError(msg) - else: - msg = "Unsupported BMP bitfields layout" - raise OSError(msg) - elif file_info["compression"] == self.RAW: - if file_info["bits"] == 32 and header == 22: # 32-bit .cur offset - raw_mode, self._mode = "BGRA", "RGBA" - elif file_info["compression"] in (self.RLE8, self.RLE4): - decoder_name = "bmp_rle" - else: - msg = f"Unsupported BMP compression ({file_info['compression']})" - raise OSError(msg) - - # --------------- Once the header is processed, process the palette/LUT - if self.mode == "P": # Paletted for 1, 4 and 8 bit images - # ---------------------------------------------------- 1-bit images - if not (0 < file_info["colors"] <= 65536): - msg = f"Unsupported BMP Palette size ({file_info['colors']})" - raise OSError(msg) - else: - padding = file_info["palette_padding"] - palette = read(padding * file_info["colors"]) - grayscale = True - indices = ( - (0, 255) - if file_info["colors"] == 2 - else list(range(file_info["colors"])) - ) - - # ----------------- Check if grayscale and ignore palette if so - for ind, val in enumerate(indices): - rgb = palette[ind * padding : ind * padding + 3] - if rgb != o8(val) * 3: - grayscale = False - - # ------- If all colors are gray, white or black, ditch palette - if grayscale: - self._mode = "1" if file_info["colors"] == 2 else "L" - raw_mode = self.mode - else: - self._mode = "P" - self.palette = ImagePalette.raw( - "BGRX" if padding == 4 else "BGR", palette - ) - - # ---------------------------- Finally set the tile data for the plugin - self.info["compression"] = file_info["compression"] - args = [raw_mode] - if decoder_name == "bmp_rle": - args.append(file_info["compression"] == self.RLE4) - else: - args.append(((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3)) - args.append(file_info["direction"]) - self.tile = [ - ( - decoder_name, - (0, 0, file_info["width"], file_info["height"]), - offset or self.fp.tell(), - tuple(args), - ) - ] - - def _open(self): - """Open file, check magic number and read header""" - # read 14 bytes: magic number, filesize, reserved, header final offset - head_data = self.fp.read(14) - # choke if the file does not have the required magic bytes - if not _accept(head_data): - msg = "Not a BMP file" - raise SyntaxError(msg) - # read the start position of the BMP image data (u32) - offset = i32(head_data, 10) - # load bitmap information (offset=raster info) - self._bitmap(offset=offset) - - -class BmpRleDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer): - rle4 = self.args[1] - data = bytearray() - x = 0 - dest_length = self.state.xsize * self.state.ysize - while len(data) < dest_length: - pixels = self.fd.read(1) - byte = self.fd.read(1) - if not pixels or not byte: - break - num_pixels = pixels[0] - if num_pixels: - # encoded mode - if x + num_pixels > self.state.xsize: - # Too much data for row - num_pixels = max(0, self.state.xsize - x) - if rle4: - first_pixel = o8(byte[0] >> 4) - second_pixel = o8(byte[0] & 0x0F) - for index in range(num_pixels): - if index % 2 == 0: - data += first_pixel - else: - data += second_pixel - else: - data += byte * num_pixels - x += num_pixels - else: - if byte[0] == 0: - # end of line - while len(data) % self.state.xsize != 0: - data += b"\x00" - x = 0 - elif byte[0] == 1: - # end of bitmap - break - elif byte[0] == 2: - # delta - bytes_read = self.fd.read(2) - if len(bytes_read) < 2: - break - right, up = self.fd.read(2) - data += b"\x00" * (right + up * self.state.xsize) - x = len(data) % self.state.xsize - else: - # absolute mode - if rle4: - # 2 pixels per byte - byte_count = byte[0] // 2 - bytes_read = self.fd.read(byte_count) - for byte_read in bytes_read: - data += o8(byte_read >> 4) - data += o8(byte_read & 0x0F) - else: - byte_count = byte[0] - bytes_read = self.fd.read(byte_count) - data += bytes_read - if len(bytes_read) < byte_count: - break - x += byte[0] - - # align to 16-bit word boundary - if self.fd.tell() % 2 != 0: - self.fd.seek(1, os.SEEK_CUR) - rawmode = "L" if self.mode == "L" else "P" - self.set_as_raw(bytes(data), (rawmode, 0, self.args[-1])) - return -1, 0 - - -# ============================================================================= -# Image plugin for the DIB format (BMP alias) -# ============================================================================= -class DibImageFile(BmpImageFile): - format = "DIB" - format_description = "Windows Bitmap" - - def _open(self): - self._bitmap() - - -# -# -------------------------------------------------------------------- -# Write BMP file - - -SAVE = { - "1": ("1", 1, 2), - "L": ("L", 8, 256), - "P": ("P", 8, 256), - "RGB": ("BGR", 24, 0), - "RGBA": ("BGRA", 32, 0), -} - - -def _dib_save(im, fp, filename): - _save(im, fp, filename, False) - - -def _save(im, fp, filename, bitmap_header=True): - try: - rawmode, bits, colors = SAVE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as BMP" - raise OSError(msg) from e - - info = im.encoderinfo - - dpi = info.get("dpi", (96, 96)) - - # 1 meter == 39.3701 inches - ppm = tuple(int(x * 39.3701 + 0.5) for x in dpi) - - stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3) - header = 40 # or 64 for OS/2 version 2 - image = stride * im.size[1] - - if im.mode == "1": - palette = b"".join(o8(i) * 4 for i in (0, 255)) - elif im.mode == "L": - palette = b"".join(o8(i) * 4 for i in range(256)) - elif im.mode == "P": - palette = im.im.getpalette("RGB", "BGRX") - colors = len(palette) // 4 - else: - palette = None - - # bitmap header - if bitmap_header: - offset = 14 + header + colors * 4 - file_size = offset + image - if file_size > 2**32 - 1: - msg = "File size is too large for the BMP format" - raise ValueError(msg) - fp.write( - b"BM" # file type (magic) - + o32(file_size) # file size - + o32(0) # reserved - + o32(offset) # image data offset - ) - - # bitmap info header - fp.write( - o32(header) # info header size - + o32(im.size[0]) # width - + o32(im.size[1]) # height - + o16(1) # planes - + o16(bits) # depth - + o32(0) # compression (0=uncompressed) - + o32(image) # size of bitmap - + o32(ppm[0]) # resolution - + o32(ppm[1]) # resolution - + o32(colors) # colors used - + o32(colors) # colors important - ) - - fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) - - if palette: - fp.write(palette) - - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))]) - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(BmpImageFile.format, BmpImageFile, _accept) -Image.register_save(BmpImageFile.format, _save) - -Image.register_extension(BmpImageFile.format, ".bmp") - -Image.register_mime(BmpImageFile.format, "image/bmp") - -Image.register_decoder("bmp_rle", BmpRleDecoder) - -Image.register_open(DibImageFile.format, DibImageFile, _dib_accept) -Image.register_save(DibImageFile.format, _dib_save) - -Image.register_extension(DibImageFile.format, ".dib") - -Image.register_mime(DibImageFile.format, "image/bmp") diff --git a/.flatpak-builder/cache/objects/cf/5e7c556838a6756cf3c571d0cc77e94c4cac8bf70201106c651a06dfd10079.dirtree b/.flatpak-builder/cache/objects/cf/5e7c556838a6756cf3c571d0cc77e94c4cac8bf70201106c651a06dfd10079.dirtree deleted file mode 100644 index 8cfa2e1c52af2a62161d8109fa6d95f7c42a9376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62 zcmV-E0KxxbZ*4AWWoBk`WpXY-Y;a*?VJ>84b8B>OZ~&_(W@P4Z5Xw-iu!61!YM^iG Ud)5!@qMHo$Gj@^!bEg|TJt4aqaR2}S diff --git a/.flatpak-builder/cache/objects/cf/62f20ecb956b0b629d43fba9b391d0ad143d957e953765ee514c85b066874f.file b/.flatpak-builder/cache/objects/cf/62f20ecb956b0b629d43fba9b391d0ad143d957e953765ee514c85b066874f.file deleted file mode 100644 index c688a62..0000000 --- a/.flatpak-builder/cache/objects/cf/62f20ecb956b0b629d43fba9b391d0ad143d957e953765ee514c85b066874f.file +++ /dev/null @@ -1,66 +0,0 @@ -Metadata-Version: 2.1 -Name: certifi -Version: 2024.2.2 -Summary: Python package for providing Mozilla's CA Bundle. -Home-page: https://github.com/certifi/python-certifi -Author: Kenneth Reitz -Author-email: me@kennethreitz.com -License: MPL-2.0 -Project-URL: Source, https://github.com/certifi/python-certifi -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) -Classifier: Natural Language :: English -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Requires-Python: >=3.6 -License-File: LICENSE - -Certifi: Python SSL Certificates -================================ - -Certifi provides Mozilla's carefully curated collection of Root Certificates for -validating the trustworthiness of SSL certificates while verifying the identity -of TLS hosts. It has been extracted from the `Requests`_ project. - -Installation ------------- - -``certifi`` is available on PyPI. Simply install it with ``pip``:: - - $ pip install certifi - -Usage ------ - -To reference the installed certificate authority (CA) bundle, you can use the -built-in function:: - - >>> import certifi - - >>> certifi.where() - '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' - -Or from the command line:: - - $ python -m certifi - /usr/local/lib/python3.7/site-packages/certifi/cacert.pem - -Enjoy! - -.. _`Requests`: https://requests.readthedocs.io/en/master/ - -Addition/Removal of Certificates --------------------------------- - -Certifi does not support any addition/removal or other modification of the -CA trust store content. This project is intended to provide a reliable and -highly portable root of trust to python deployments. Look to upstream projects -for methods to use alternate trust. diff --git a/.flatpak-builder/cache/objects/cf/6e16faf936c3d769c30ac04cc90b1978687ef78e913b737ee8c7a6aa5d7e1e.file b/.flatpak-builder/cache/objects/cf/6e16faf936c3d769c30ac04cc90b1978687ef78e913b737ee8c7a6aa5d7e1e.file deleted file mode 100644 index 43aad21..0000000 --- a/.flatpak-builder/cache/objects/cf/6e16faf936c3d769c30ac04cc90b1978687ef78e913b737ee8c7a6aa5d7e1e.file +++ /dev/null @@ -1,54 +0,0 @@ -from typing import Any, Dict, Optional, Union -from warnings import warn - -from .api import from_bytes -from .constant import CHARDET_CORRESPONDENCE - - -def detect( - byte_str: bytes, should_rename_legacy: bool = False, **kwargs: Any -) -> Dict[str, Optional[Union[str, float]]]: - """ - chardet legacy method - Detect the encoding of the given byte string. It should be mostly backward-compatible. - Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) - This function is deprecated and should be used to migrate your project easily, consult the documentation for - further information. Not planned for removal. - - :param byte_str: The byte sequence to examine. - :param should_rename_legacy: Should we rename legacy encodings - to their more modern equivalents? - """ - if len(kwargs): - warn( - f"charset-normalizer disregard arguments '{','.join(list(kwargs.keys()))}' in legacy function detect()" - ) - - if not isinstance(byte_str, (bytearray, bytes)): - raise TypeError( # pragma: nocover - "Expected object of type bytes or bytearray, got: " - "{0}".format(type(byte_str)) - ) - - if isinstance(byte_str, bytearray): - byte_str = bytes(byte_str) - - r = from_bytes(byte_str).best() - - encoding = r.encoding if r is not None else None - language = r.language if r is not None and r.language != "Unknown" else "" - confidence = 1.0 - r.chaos if r is not None else None - - # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process - # but chardet does return 'utf-8-sig' and it is a valid codec name. - if r is not None and encoding == "utf_8" and r.bom: - encoding += "_sig" - - if should_rename_legacy is False and encoding in CHARDET_CORRESPONDENCE: - encoding = CHARDET_CORRESPONDENCE[encoding] - - return { - "encoding": encoding, - "language": language, - "confidence": confidence, - } diff --git a/.flatpak-builder/cache/objects/cf/88c5e96232ea712e96e84be4f63b747a3bd8fe36ade8275f4ce2cb6f17503b.file b/.flatpak-builder/cache/objects/cf/88c5e96232ea712e96e84be4f63b747a3bd8fe36ade8275f4ce2cb6f17503b.file deleted file mode 100644 index 3868f4422225934815ba6d7011543fac307632d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18013 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 diff --git a/.flatpak-builder/cache/objects/d0/5e4e60807ec086edaca8208b10abccb864cf4bf068f625522eb2c06d2e9598.file b/.flatpak-builder/cache/objects/d0/5e4e60807ec086edaca8208b10abccb864cf4bf068f625522eb2c06d2e9598.file deleted file mode 100644 index 1565612..0000000 --- a/.flatpak-builder/cache/objects/d0/5e4e60807ec086edaca8208b10abccb864cf4bf068f625522eb2c06d2e9598.file +++ /dev/null @@ -1,84 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# MPEG file handling -# -# History: -# 95-09-09 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i8 -from ._typing import SupportsRead - -# -# Bitstream parser - - -class BitStream: - def __init__(self, fp: SupportsRead[bytes]) -> None: - self.fp = fp - self.bits = 0 - self.bitbuffer = 0 - - def next(self) -> int: - return i8(self.fp.read(1)) - - def peek(self, bits: int) -> int: - while self.bits < bits: - c = self.next() - if c < 0: - self.bits = 0 - continue - self.bitbuffer = (self.bitbuffer << 8) + c - self.bits += 8 - return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 - - def skip(self, bits: int) -> None: - while self.bits < bits: - self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) - self.bits += 8 - self.bits = self.bits - bits - - def read(self, bits: int) -> int: - v = self.peek(bits) - self.bits = self.bits - bits - return v - - -## -# Image plugin for MPEG streams. This plugin can identify a stream, -# but it cannot read it. - - -class MpegImageFile(ImageFile.ImageFile): - format = "MPEG" - format_description = "MPEG" - - def _open(self) -> None: - assert self.fp is not None - - s = BitStream(self.fp) - if s.read(32) != 0x1B3: - msg = "not an MPEG file" - raise SyntaxError(msg) - - self._mode = "RGB" - self._size = s.read(12), s.read(12) - - -# -------------------------------------------------------------------- -# Registry stuff - -Image.register_open(MpegImageFile.format, MpegImageFile) - -Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) - -Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/.flatpak-builder/cache/objects/d0/f62e62f4477009721ff8e8836fc8e305253341534a10f437363c471c43a439.file b/.flatpak-builder/cache/objects/d0/f62e62f4477009721ff8e8836fc8e305253341534a10f437363c471c43a439.file deleted file mode 100644 index caf3b29509cf5ad75f4c94aea8ac51e67b6c358e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9296 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 diff --git a/.flatpak-builder/cache/objects/d2/dc8774eec3d9802c493603481b78b109a36d9198912ad0d668d47da812df2a.file b/.flatpak-builder/cache/objects/d2/dc8774eec3d9802c493603481b78b109a36d9198912ad0d668d47da812df2a.file deleted file mode 100644 index 617a413..0000000 --- a/.flatpak-builder/cache/objects/d2/dc8774eec3d9802c493603481b78b109a36d9198912ad0d668d47da812df2a.file +++ /dev/null @@ -1,1034 +0,0 @@ -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import datetime - -# Import encoding now, to avoid implicit import later. -# Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/psf/requests/issues/3578. -import encodings.idna # noqa: F401 -from io import UnsupportedOperation - -from urllib3.exceptions import ( - DecodeError, - LocationParseError, - ProtocolError, - ReadTimeoutError, - SSLError, -) -from urllib3.fields import RequestField -from urllib3.filepost import encode_multipart_formdata -from urllib3.util import parse_url - -from ._internal_utils import to_native_string, unicode_is_ascii -from .auth import HTTPBasicAuth -from .compat import ( - Callable, - JSONDecodeError, - Mapping, - basestring, - builtin_str, - chardet, - cookielib, -) -from .compat import json as complexjson -from .compat import urlencode, urlsplit, urlunparse -from .cookies import _copy_cookie_jar, cookiejar_from_dict, get_cookie_header -from .exceptions import ( - ChunkedEncodingError, - ConnectionError, - ContentDecodingError, - HTTPError, - InvalidJSONError, - InvalidURL, -) -from .exceptions import JSONDecodeError as RequestsJSONDecodeError -from .exceptions import MissingSchema -from .exceptions import SSLError as RequestsSSLError -from .exceptions import StreamConsumedError -from .hooks import default_hooks -from .status_codes import codes -from .structures import CaseInsensitiveDict -from .utils import ( - check_header_validity, - get_auth_from_url, - guess_filename, - guess_json_utf, - iter_slices, - parse_header_links, - requote_uri, - stream_decode_response_unicode, - super_len, - to_key_val_list, -) - -#: The set of HTTP status codes that indicate an automatically -#: processable redirect. -REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_redirect, # 307 - codes.permanent_redirect, # 308 -) - -DEFAULT_REDIRECT_LIMIT = 30 -CONTENT_CHUNK_SIZE = 10 * 1024 -ITER_CHUNK_SIZE = 512 - - -class RequestEncodingMixin: - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.url) - - path = p.path - if not path: - path = "/" - - url.append(path) - - query = p.query - if query: - url.append("?") - url.append(query) - - return "".join(url) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif hasattr(data, "read"): - return data - elif hasattr(data, "__iter__"): - result = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, "__iter__"): - vs = [vs] - for v in vs: - if v is not None: - result.append( - ( - k.encode("utf-8") if isinstance(k, str) else k, - v.encode("utf-8") if isinstance(v, str) else v, - ) - ) - return urlencode(result, doseq=True) - else: - return data - - @staticmethod - def _encode_files(files, data): - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - tuples. Order is retained if data is a list of tuples but arbitrary - if parameters are supplied as a dict. - The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) - or 4-tuples (filename, fileobj, contentype, custom_headers). - """ - if not files: - raise ValueError("Files must be provided.") - elif isinstance(data, basestring): - raise ValueError("Data must not be a string.") - - new_fields = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, basestring) or not hasattr(val, "__iter__"): - val = [val] - for v in val: - if v is not None: - # Don't call str() on bytestrings: in Py3 it all goes wrong. - if not isinstance(v, bytes): - v = str(v) - - new_fields.append( - ( - field.decode("utf-8") - if isinstance(field, bytes) - else field, - v.encode("utf-8") if isinstance(v, str) else v, - ) - ) - - for (k, v) in files: - # support for explicit filename - ft = None - fh = None - if isinstance(v, (tuple, list)): - if len(v) == 2: - fn, fp = v - elif len(v) == 3: - fn, fp, ft = v - else: - fn, fp, ft, fh = v - else: - fn = guess_filename(v) or k - fp = v - - if isinstance(fp, (str, bytes, bytearray)): - fdata = fp - elif hasattr(fp, "read"): - fdata = fp.read() - elif fp is None: - continue - else: - fdata = fp - - rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) - rf.make_multipart(content_type=ft) - new_fields.append(rf) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin: - def register_hook(self, event, hook): - """Properly register a hook.""" - - if event not in self.hooks: - raise ValueError(f'Unsupported event specified, with event name "{event}"') - - if isinstance(hook, Callable): - self.hooks[event].append(hook) - elif hasattr(hook, "__iter__"): - self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) - - def deregister_hook(self, event, hook): - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request ` object. - - Used to prepare a :class:`PreparedRequest `, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param json: json for the body to attach to the request (if files or data is not specified). - :param params: URL parameters to append to the URL. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> req.prepare() - - """ - - def __init__( - self, - method=None, - url=None, - headers=None, - files=None, - data=None, - params=None, - auth=None, - cookies=None, - hooks=None, - json=None, - ): - - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.json = json - self.params = params - self.auth = auth - self.cookies = cookies - - def __repr__(self): - return f"" - - def prepare(self): - """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" - p = PreparedRequest() - p.prepare( - method=self.method, - url=self.url, - headers=self.headers, - files=self.files, - data=self.data, - json=self.json, - params=self.params, - auth=self.auth, - cookies=self.cookies, - hooks=self.hooks, - ) - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest ` object, - containing the exact bytes that will be sent to the server. - - Instances are generated from a :class:`Request ` object, and - should not be instantiated manually; doing so may produce undesirable - effects. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> r = req.prepare() - >>> r - - - >>> s = requests.Session() - >>> s.send(r) - - """ - - def __init__(self): - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None - # The `CookieJar` used to create the Cookie header will be stored here - # after prepare_cookies is called - self._cookies = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - #: integer denoting starting position of a readable file-like body. - self._body_position = None - - def prepare( - self, - method=None, - url=None, - headers=None, - files=None, - data=None, - params=None, - auth=None, - cookies=None, - hooks=None, - json=None, - ): - """Prepares the entire request with the given parameters.""" - - self.prepare_method(method) - self.prepare_url(url, params) - self.prepare_headers(headers) - self.prepare_cookies(cookies) - self.prepare_body(data, files, json) - self.prepare_auth(auth, url) - - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - - # This MUST go after prepare_auth. Authenticators could add a hook - self.prepare_hooks(hooks) - - def __repr__(self): - return f"" - - def copy(self): - p = PreparedRequest() - p.method = self.method - p.url = self.url - p.headers = self.headers.copy() if self.headers is not None else None - p._cookies = _copy_cookie_jar(self._cookies) - p.body = self.body - p.hooks = self.hooks - p._body_position = self._body_position - return p - - def prepare_method(self, method): - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = to_native_string(self.method.upper()) - - @staticmethod - def _get_idna_encoded_host(host): - import idna - - try: - host = idna.encode(host, uts46=True).decode("utf-8") - except idna.IDNAError: - raise UnicodeError - return host - - def prepare_url(self, url, params): - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - #: We're unable to blindly call unicode/str functions - #: as this will include the bytestring indicator (b'') - #: on python 3.x. - #: https://github.com/psf/requests/pull/2238 - if isinstance(url, bytes): - url = url.decode("utf8") - else: - url = str(url) - - # Remove leading whitespaces from url - url = url.lstrip() - - # Don't do any URL preparation for non-HTTP schemes like `mailto`, - # `data` etc to work around exceptions from `url_parse`, which - # handles RFC 3986 only. - if ":" in url and not url.lower().startswith("http"): - self.url = url - return - - # Support for unicode domain names and paths. - try: - scheme, auth, host, port, path, query, fragment = parse_url(url) - except LocationParseError as e: - raise InvalidURL(*e.args) - - if not scheme: - raise MissingSchema( - f"Invalid URL {url!r}: No scheme supplied. " - f"Perhaps you meant https://{url}?" - ) - - if not host: - raise InvalidURL(f"Invalid URL {url!r}: No host supplied") - - # In general, we want to try IDNA encoding the hostname if the string contains - # non-ASCII characters. This allows users to automatically get the correct IDNA - # behaviour. For strings containing only ASCII characters, we need to also verify - # it doesn't start with a wildcard (*), before allowing the unencoded hostname. - if not unicode_is_ascii(host): - try: - host = self._get_idna_encoded_host(host) - except UnicodeError: - raise InvalidURL("URL has an invalid label.") - elif host.startswith(("*", ".")): - raise InvalidURL("URL has an invalid label.") - - # Carefully reconstruct the network location - netloc = auth or "" - if netloc: - netloc += "@" - netloc += host - if port: - netloc += f":{port}" - - # Bare domains aren't valid URLs. - if not path: - path = "/" - - if isinstance(params, (str, bytes)): - params = to_native_string(params) - - enc_params = self._encode_params(params) - if enc_params: - if query: - query = f"{query}&{enc_params}" - else: - query = enc_params - - url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) - self.url = url - - def prepare_headers(self, headers): - """Prepares the given HTTP headers.""" - - self.headers = CaseInsensitiveDict() - if headers: - for header in headers.items(): - # Raise exception on invalid header value. - check_header_validity(header) - name, value = header - self.headers[to_native_string(name)] = value - - def prepare_body(self, data, files, json=None): - """Prepares the given HTTP body data.""" - - # Check if file, fo, generator, iterator. - # If not, run through normal process. - - # Nottin' on you. - body = None - content_type = None - - if not data and json is not None: - # urllib3 requires a bytes-like body. Python 2's json.dumps - # provides this natively, but Python 3 gives a Unicode string. - content_type = "application/json" - - try: - body = complexjson.dumps(json, allow_nan=False) - except ValueError as ve: - raise InvalidJSONError(ve, request=self) - - if not isinstance(body, bytes): - body = body.encode("utf-8") - - is_stream = all( - [ - hasattr(data, "__iter__"), - not isinstance(data, (basestring, list, tuple, Mapping)), - ] - ) - - if is_stream: - try: - length = super_len(data) - except (TypeError, AttributeError, UnsupportedOperation): - length = None - - body = data - - if getattr(body, "tell", None) is not None: - # Record the current file position before reading. - # This will allow us to rewind a file in the event - # of a redirect. - try: - self._body_position = body.tell() - except OSError: - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body - self._body_position = object() - - if files: - raise NotImplementedError( - "Streamed bodies and files are mutually exclusive." - ) - - if length: - self.headers["Content-Length"] = builtin_str(length) - else: - self.headers["Transfer-Encoding"] = "chunked" - else: - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, data) - else: - if data: - body = self._encode_params(data) - if isinstance(data, basestring) or hasattr(data, "read"): - content_type = None - else: - content_type = "application/x-www-form-urlencoded" - - self.prepare_content_length(body) - - # Add content-type if it wasn't explicitly provided. - if content_type and ("content-type" not in self.headers): - self.headers["Content-Type"] = content_type - - self.body = body - - def prepare_content_length(self, body): - """Prepare Content-Length header based on request method and body""" - if body is not None: - length = super_len(body) - if length: - # If length exists, set it. Otherwise, we fallback - # to Transfer-Encoding: chunked. - self.headers["Content-Length"] = builtin_str(length) - elif ( - self.method not in ("GET", "HEAD") - and self.headers.get("Content-Length") is None - ): - # Set Content-Length to 0 for methods that can have a body - # but don't provide one. (i.e. not GET or HEAD) - self.headers["Content-Length"] = "0" - - def prepare_auth(self, auth, url=""): - """Prepares the given HTTP auth data.""" - - # If no Auth is explicitly provided, extract it from the URL first. - if auth is None: - url_auth = get_auth_from_url(self.url) - auth = url_auth if any(url_auth) else None - - if auth: - if isinstance(auth, tuple) and len(auth) == 2: - # special-case basic HTTP auth - auth = HTTPBasicAuth(*auth) - - # Allow auth to make its changes. - r = auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - # Recompute Content-Length - self.prepare_content_length(self.body) - - def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data. - - This function eventually generates a ``Cookie`` header from the - given cookies using cookielib. Due to cookielib's design, the header - will not be regenerated if it already exists, meaning this function - can only be called once for the life of the - :class:`PreparedRequest ` object. Any subsequent calls - to ``prepare_cookies`` will have no actual effect, unless the "Cookie" - header is removed beforehand. - """ - if isinstance(cookies, cookielib.CookieJar): - self._cookies = cookies - else: - self._cookies = cookiejar_from_dict(cookies) - - cookie_header = get_cookie_header(self._cookies, self) - if cookie_header is not None: - self.headers["Cookie"] = cookie_header - - def prepare_hooks(self, hooks): - """Prepares the given hooks.""" - # hooks can be passed as None to the prepare method and to this - # method. To prevent iterating over None, simply use an empty list - # if hooks is False-y - hooks = hooks or [] - for event in hooks: - self.register_hook(event, hooks[event]) - - -class Response: - """The :class:`Response ` object, which contains a - server's response to an HTTP request. - """ - - __attrs__ = [ - "_content", - "status_code", - "headers", - "url", - "history", - "encoding", - "reason", - "cookies", - "elapsed", - "request", - ] - - def __init__(self): - self._content = False - self._content_consumed = False - self._next = None - - #: Integer Code of responded HTTP Status, e.g. 404 or 200. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Use of ``raw`` requires that ``stream=True`` be set on the request. - #: This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response ` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". - self.reason = None - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta). - #: This property specifically measures the time taken between sending - #: the first byte of the request and finishing parsing the headers. It - #: is therefore unaffected by consuming the response content or the - #: value of the ``stream`` keyword argument. - self.elapsed = datetime.timedelta(0) - - #: The :class:`PreparedRequest ` object to which this - #: is a response. - self.request = None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def __getstate__(self): - # Consume everything; accessing the content attribute makes - # sure the content has been fully read. - if not self._content_consumed: - self.content - - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - for name, value in state.items(): - setattr(self, name, value) - - # pickled objects do not have .raw - setattr(self, "_content_consumed", True) - setattr(self, "raw", None) - - def __repr__(self): - return f"" - - def __bool__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __nonzero__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __iter__(self): - """Allows you to use a response as an iterator.""" - return self.iter_content(128) - - @property - def ok(self): - """Returns True if :attr:`status_code` is less than 400, False if not. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - try: - self.raise_for_status() - except HTTPError: - return False - return True - - @property - def is_redirect(self): - """True if this Response is a well-formed HTTP redirect that could have - been processed automatically (by :meth:`Session.resolve_redirects`). - """ - return "location" in self.headers and self.status_code in REDIRECT_STATI - - @property - def is_permanent_redirect(self): - """True if this Response one of the permanent versions of redirect.""" - return "location" in self.headers and self.status_code in ( - codes.moved_permanently, - codes.permanent_redirect, - ) - - @property - def next(self): - """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" - return self._next - - @property - def apparent_encoding(self): - """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" - return chardet.detect(self.content)["encoding"] - - def iter_content(self, chunk_size=1, decode_unicode=False): - """Iterates over the response data. When stream=True is set on the - request, this avoids reading the content at once into memory for - large responses. The chunk size is the number of bytes it should - read into memory. This is not necessarily the length of each item - returned as decoding can take place. - - chunk_size must be of type int or None. A value of None will - function differently depending on the value of `stream`. - stream=True will read data as it arrives in whatever size the - chunks are received. If stream=False, data is returned as - a single chunk. - - If decode_unicode is True, content will be decoded using the best - available encoding based on the response. - """ - - def generate(): - # Special case for urllib3. - if hasattr(self.raw, "stream"): - try: - yield from self.raw.stream(chunk_size, decode_content=True) - except ProtocolError as e: - raise ChunkedEncodingError(e) - except DecodeError as e: - raise ContentDecodingError(e) - except ReadTimeoutError as e: - raise ConnectionError(e) - except SSLError as e: - raise RequestsSSLError(e) - else: - # Standard file-like object. - while True: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - - self._content_consumed = True - - if self._content_consumed and isinstance(self._content, bool): - raise StreamConsumedError() - elif chunk_size is not None and not isinstance(chunk_size, int): - raise TypeError( - f"chunk_size must be an int, it is instead a {type(chunk_size)}." - ) - # simulate reading small chunks of the content - reused_chunks = iter_slices(self._content, chunk_size) - - stream_chunks = generate() - - chunks = reused_chunks if self._content_consumed else stream_chunks - - if decode_unicode: - chunks = stream_decode_response_unicode(chunks, self) - - return chunks - - def iter_lines( - self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None - ): - """Iterates over the response data, one line at a time. When - stream=True is set on the request, this avoids reading the - content at once into memory for large responses. - - .. note:: This method is not reentrant safe. - """ - - pending = None - - for chunk in self.iter_content( - chunk_size=chunk_size, decode_unicode=decode_unicode - ): - - if pending is not None: - chunk = pending + chunk - - if delimiter: - lines = chunk.split(delimiter) - else: - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - yield from lines - - if pending is not None: - yield pending - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - if self._content_consumed: - raise RuntimeError("The content for this response was already consumed") - - if self.status_code == 0 or self.raw is None: - self._content = None - else: - self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b"" - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - If Response.encoding is None, encoding will be guessed using - ``charset_normalizer`` or ``chardet``. - - The encoding of the response content is determined based solely on HTTP - headers, following RFC 2616 to the letter. If you can take advantage of - non-HTTP knowledge to make a better guess at the encoding, you should - set ``r.encoding`` appropriately before accessing this property. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return "" - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors="replace") - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors="replace") - - return content - - def json(self, **kwargs): - r"""Returns the json-encoded content of a response, if any. - - :param \*\*kwargs: Optional arguments that ``json.loads`` takes. - :raises requests.exceptions.JSONDecodeError: If the response body does not - contain valid json. - """ - - if not self.encoding and self.content and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using charset_normalizer to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - try: - return complexjson.loads(self.content.decode(encoding), **kwargs) - except UnicodeDecodeError: - # Wrong UTF codec detected; usually because it's not UTF-8 - # but some other 8-bit codec. This is an RFC violation, - # and the server didn't bother to tell us what codec *was* - # used. - pass - except JSONDecodeError as e: - raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) - - try: - return complexjson.loads(self.text, **kwargs) - except JSONDecodeError as e: - # Catch JSON-related errors and raise as requests.JSONDecodeError - # This aliases json.JSONDecodeError and simplejson.JSONDecodeError - raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) - - @property - def links(self): - """Returns the parsed header links of the response, if any.""" - - header = self.headers.get("link") - - resolved_links = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get("rel") or link.get("url") - resolved_links[key] = link - - return resolved_links - - def raise_for_status(self): - """Raises :class:`HTTPError`, if one occurred.""" - - http_error_msg = "" - if isinstance(self.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. (See PR #3538) - try: - reason = self.reason.decode("utf-8") - except UnicodeDecodeError: - reason = self.reason.decode("iso-8859-1") - else: - reason = self.reason - - if 400 <= self.status_code < 500: - http_error_msg = ( - f"{self.status_code} Client Error: {reason} for url: {self.url}" - ) - - elif 500 <= self.status_code < 600: - http_error_msg = ( - f"{self.status_code} Server Error: {reason} for url: {self.url}" - ) - - if http_error_msg: - raise HTTPError(http_error_msg, response=self) - - def close(self): - """Releases the connection back to the pool. Once this method has been - called the underlying ``raw`` object must not be accessed again. - - *Note: Should not normally need to be called explicitly.* - """ - if not self._content_consumed: - self.raw.close() - - release_conn = getattr(self.raw, "release_conn", None) - if release_conn is not None: - release_conn() diff --git a/.flatpak-builder/cache/objects/d3/0dc2b544fad93a0219aa7a376698686c57ef6433e6db5369a6c1dbbdbbc449.file b/.flatpak-builder/cache/objects/d3/0dc2b544fad93a0219aa7a376698686c57ef6433e6db5369a6c1dbbdbbc449.file deleted file mode 100644 index 953144a376491b64a316a13fb12f864d5c543194..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66309 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 d^5~sy Tuple[bytes, int]: - if errors != 'strict': - raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) - - if not data: - return b"", 0 - - return encode(data), len(data) - - def decode(self, data: bytes, errors: str = 'strict') -> Tuple[str, int]: - if errors != 'strict': - raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) - - if not data: - return '', 0 - - return decode(data), len(data) - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]: - if errors != 'strict': - raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) - - if not data: - return b'', 0 - - labels = _unicode_dots_re.split(data) - trailing_dot = b'' - if labels: - if not labels[-1]: - trailing_dot = b'.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = b'.' - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result_bytes = b'.'.join(result) + trailing_dot - size += len(trailing_dot) - return result_bytes, size - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]: - if errors != 'strict': - raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) - - if not data: - return ('', 0) - - if not isinstance(data, str): - data = str(data, 'ascii') - - labels = _unicode_dots_re.split(data) - trailing_dot = '' - if labels: - if not labels[-1]: - trailing_dot = '.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = '.' - - result = [] - size = 0 - for label in labels: - result.append(ulabel(label)) - if size: - size += 1 - size += len(label) - - result_str = '.'.join(result) + trailing_dot - size += len(trailing_dot) - return (result_str, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - - -class StreamReader(Codec, codecs.StreamReader): - pass - - -def search_function(name: str) -> Optional[codecs.CodecInfo]: - if name != 'idna2008': - return None - return codecs.CodecInfo( - name=name, - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) - -codecs.register(search_function) diff --git a/.flatpak-builder/cache/objects/d4/2fed1475cbf53c22f12e789f4049889edb206fbb43750c6fdd946b8c391917.file b/.flatpak-builder/cache/objects/d4/2fed1475cbf53c22f12e789f4049889edb206fbb43750c6fdd946b8c391917.file deleted file mode 100644 index 8945b5d..0000000 --- a/.flatpak-builder/cache/objects/d4/2fed1475cbf53c22f12e789f4049889edb206fbb43750c6fdd946b8c391917.file +++ /dev/null @@ -1,12 +0,0 @@ -import argparse - -from certifi import contents, where - -parser = argparse.ArgumentParser() -parser.add_argument("-c", "--contents", action="store_true") -args = parser.parse_args() - -if args.contents: - print(contents()) -else: - print(where()) diff --git a/.flatpak-builder/cache/objects/d4/7c59d5e67168ddc16aa249569734baa73f93e01e4fd56a81882507775cbd81.dirtree b/.flatpak-builder/cache/objects/d4/7c59d5e67168ddc16aa249569734baa73f93e01e4fd56a81882507775cbd81.dirtree deleted file mode 100644 index 884fde4d5e8e68ff2141363f163d628d003f8a2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcma!#&& z3sUoni*rD#XCK@gCR%iK67${UPVr>#4Ij=na6Gupnkw*nzT4jgF?)E6^OLiSK`PVZ z){4|yIB(h-)eb6(M-pSLkTZ9V?(-L}$SON6ez zDgLI}@tQj)q(g@%HMcmqD6^m>HIKn$>)q=IKSw49y|S^}{jluwDrW(I`J2oMQ(x}b RzgASXoRDGK+v0V98| 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 diff --git a/.flatpak-builder/cache/objects/d6/c14bb7343038ee92f1288ca8bded7791b9b27ddd042b3896308e923f841558.dirtree b/.flatpak-builder/cache/objects/d6/c14bb7343038ee92f1288ca8bded7791b9b27ddd042b3896308e923f841558.dirtree deleted file mode 100644 index 62026fd1e459cf5c18b905fb7bc1fc70ccc3c7a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 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 YaXI5VMrWqEOfQ&RnERMtFf%X!0NIM|%m4rY diff --git a/.flatpak-builder/cache/objects/d7/80260720d46f97480e7554699aebe5a5e18c0265cd378b1ef0c6ea98caf57f.file b/.flatpak-builder/cache/objects/d7/80260720d46f97480e7554699aebe5a5e18c0265cd378b1ef0c6ea98caf57f.file deleted file mode 100644 index ee16b4245472bab80255f8338f927f244a4607b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17901 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 diff --git a/.flatpak-builder/cache/objects/d9/8d04a8e9e72cca595881b621e6a5a52b5625003a8c7fe8084ec21073d4f1b4.file b/.flatpak-builder/cache/objects/d9/8d04a8e9e72cca595881b621e6a5a52b5625003a8c7fe8084ec21073d4f1b4.file deleted file mode 100644 index fba30a02b9cb9599e8d97abad6b50332b8053758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18418 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 24) & 0xFF, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 8) & 0xFF, - bgcolor & 0xFF, - ) - self.info["background"] = (bg_r, bg_g, bg_b, bg_a) - self.n_frames = frame_count - self.is_animated = self.n_frames > 1 - self._mode = "RGB" if mode == "RGBX" else mode - self.rawmode = mode - self.tile = [] - - # Attempt to read ICC / EXIF / XMP chunks from file - icc_profile = self._decoder.get_chunk("ICCP") - exif = self._decoder.get_chunk("EXIF") - xmp = self._decoder.get_chunk("XMP ") - if icc_profile: - self.info["icc_profile"] = icc_profile - if exif: - self.info["exif"] = exif - if xmp: - self.info["xmp"] = xmp - - # Initialize seek state - self._reset(reset=False) - - def _getexif(self): - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def getxmp(self): - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - return self._getxmp(self.info["xmp"]) if "xmp" in self.info else {} - - def seek(self, frame): - if not self._seek_check(frame): - return - - # Set logical frame to requested position - self.__logical_frame = frame - - def _reset(self, reset=True): - if reset: - self._decoder.reset() - self.__physical_frame = 0 - self.__loaded = -1 - self.__timestamp = 0 - - def _get_next(self): - # Get next frame - ret = self._decoder.get_next() - self.__physical_frame += 1 - - # Check if an error occurred - if ret is None: - self._reset() # Reset just to be safe - self.seek(0) - msg = "failed to decode next frame in WebP file" - raise EOFError(msg) - - # Compute duration - data, timestamp = ret - duration = timestamp - self.__timestamp - self.__timestamp = timestamp - - # libwebp gives frame end, adjust to start of frame - timestamp -= duration - return data, timestamp, duration - - def _seek(self, frame): - if self.__physical_frame == frame: - return # Nothing to do - if frame < self.__physical_frame: - self._reset() # Rewind to beginning - while self.__physical_frame < frame: - self._get_next() # Advance to the requested frame - - def load(self): - if _webp.HAVE_WEBPANIM: - if self.__loaded != self.__logical_frame: - self._seek(self.__logical_frame) - - # We need to load the image data for this frame - data, timestamp, duration = self._get_next() - self.info["timestamp"] = timestamp - self.info["duration"] = duration - self.__loaded = self.__logical_frame - - # Set tile - if self.fp and self._exclusive_fp: - self.fp.close() - self.fp = BytesIO(data) - self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)] - - return super().load() - - def load_seek(self, pos): - pass - - def tell(self): - if not _webp.HAVE_WEBPANIM: - return super().tell() - - return self.__logical_frame - - -def _save_all(im, fp, filename): - encoderinfo = im.encoderinfo.copy() - append_images = list(encoderinfo.get("append_images", [])) - - # If total frame count is 1, then save using the legacy API, which - # will preserve non-alpha modes - total = 0 - for ims in [im] + append_images: - total += getattr(ims, "n_frames", 1) - if total == 1: - _save(im, fp, filename) - return - - background = (0, 0, 0, 0) - if "background" in encoderinfo: - background = encoderinfo["background"] - elif "background" in im.info: - background = im.info["background"] - if isinstance(background, int): - # GifImagePlugin stores a global color table index in - # info["background"]. So it must be converted to an RGBA value - palette = im.getpalette() - if palette: - r, g, b = palette[background * 3 : (background + 1) * 3] - background = (r, g, b, 255) - else: - background = (background, background, background, 255) - - duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) - loop = im.encoderinfo.get("loop", 0) - minimize_size = im.encoderinfo.get("minimize_size", False) - kmin = im.encoderinfo.get("kmin", None) - kmax = im.encoderinfo.get("kmax", None) - allow_mixed = im.encoderinfo.get("allow_mixed", False) - verbose = False - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - alpha_quality = im.encoderinfo.get("alpha_quality", 100) - method = im.encoderinfo.get("method", 0) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", "") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - xmp = im.encoderinfo.get("xmp", "") - if allow_mixed: - lossless = False - - # Sensible keyframe defaults are from gif2webp.c script - if kmin is None: - kmin = 9 if lossless else 3 - if kmax is None: - kmax = 17 if lossless else 5 - - # Validate background color - if ( - not isinstance(background, (list, tuple)) - or len(background) != 4 - or not all(0 <= v < 256 for v in background) - ): - msg = f"Background color is not an RGBA tuple clamped to (0-255): {background}" - raise OSError(msg) - - # Convert to packed uint - bg_r, bg_g, bg_b, bg_a = background - background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) - - # Setup the WebP animation encoder - enc = _webp.WebPAnimEncoder( - im.size[0], - im.size[1], - background, - loop, - minimize_size, - kmin, - kmax, - allow_mixed, - verbose, - ) - - # Add each frame - frame_idx = 0 - timestamp = 0 - cur_idx = im.tell() - try: - for ims in [im] + append_images: - # Get # of frames in this image - nfr = getattr(ims, "n_frames", 1) - - for idx in range(nfr): - ims.seek(idx) - ims.load() - - # Make sure image mode is supported - frame = ims - rawmode = ims.mode - if ims.mode not in _VALID_WEBP_MODES: - alpha = ( - "A" in ims.mode - or "a" in ims.mode - or (ims.mode == "P" and "A" in ims.im.getpalettemode()) - ) - rawmode = "RGBA" if alpha else "RGB" - frame = ims.convert(rawmode) - - if rawmode == "RGB": - # For faster conversion, use RGBX - rawmode = "RGBX" - - # Append the frame to the animation encoder - enc.add( - frame.tobytes("raw", rawmode), - round(timestamp), - frame.size[0], - frame.size[1], - rawmode, - lossless, - quality, - alpha_quality, - method, - ) - - # Update timestamp and frame index - if isinstance(duration, (list, tuple)): - timestamp += duration[frame_idx] - else: - timestamp += duration - frame_idx += 1 - - finally: - im.seek(cur_idx) - - # Force encoder to flush frames - enc.add(None, round(timestamp), 0, 0, "", lossless, quality, alpha_quality, 0) - - # Get the final output from the encoder - data = enc.assemble(icc_profile, exif, xmp) - if data is None: - msg = "cannot write file as WebP (encoder returned None)" - raise OSError(msg) - - fp.write(data) - - -def _save(im, fp, filename): - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - alpha_quality = im.encoderinfo.get("alpha_quality", 100) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", b"") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - if exif.startswith(b"Exif\x00\x00"): - exif = exif[6:] - xmp = im.encoderinfo.get("xmp", "") - method = im.encoderinfo.get("method", 4) - exact = 1 if im.encoderinfo.get("exact") else 0 - - if im.mode not in _VALID_WEBP_LEGACY_MODES: - im = im.convert("RGBA" if im.has_transparency_data else "RGB") - - data = _webp.WebPEncode( - im.tobytes(), - im.size[0], - im.size[1], - lossless, - float(quality), - float(alpha_quality), - im.mode, - icc_profile, - method, - exact, - exif, - xmp, - ) - if data is None: - msg = "cannot write file as WebP (encoder returned None)" - raise OSError(msg) - - fp.write(data) - - -Image.register_open(WebPImageFile.format, WebPImageFile, _accept) -if SUPPORTED: - Image.register_save(WebPImageFile.format, _save) - if _webp.HAVE_WEBPANIM: - Image.register_save_all(WebPImageFile.format, _save_all) - Image.register_extension(WebPImageFile.format, ".webp") - Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/.flatpak-builder/cache/objects/da/123cc0d42a5c0ffa0083335193361d0d04a0d8f9047c3e154890954d8dd460.file b/.flatpak-builder/cache/objects/da/123cc0d42a5c0ffa0083335193361d0d04a0d8f9047c3e154890954d8dd460.file deleted file mode 100644 index f24ce2d823586ce5ff7770ba9df6ce12ad73a4d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12417 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 diff --git a/.flatpak-builder/cache/objects/da/d9c100a9eed6f8904282c8d9908d63699afe36c1a90a92edaec07d60988762.file b/.flatpak-builder/cache/objects/da/d9c100a9eed6f8904282c8d9908d63699afe36c1a90a92edaec07d60988762.file deleted file mode 100644 index 7470663..0000000 --- a/.flatpak-builder/cache/objects/da/d9c100a9eed6f8904282c8d9908d63699afe36c1a90a92edaec07d60988762.file +++ /dev/null @@ -1,73 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# read files from within a tar file -# -# History: -# 95-06-18 fl Created -# 96-05-28 fl Open files in binary mode -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-96. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -from types import TracebackType - -from . import ContainerIO - - -class TarIO(ContainerIO.ContainerIO[bytes]): - """A file object that provides read access to a given member of a TAR file.""" - - def __init__(self, tarfile: str, file: str) -> None: - """ - Create file object. - - :param tarfile: Name of TAR file. - :param file: Name of member file. - """ - self.fh = open(tarfile, "rb") - - while True: - s = self.fh.read(512) - if len(s) != 512: - msg = "unexpected end of tar file" - raise OSError(msg) - - name = s[:100].decode("utf-8") - i = name.find("\0") - if i == 0: - msg = "cannot find subfile" - raise OSError(msg) - if i > 0: - name = name[:i] - - size = int(s[124:135], 8) - - if file == name: - break - - self.fh.seek((size + 511) & (~511), io.SEEK_CUR) - - # Open region - super().__init__(self.fh, self.fh.tell(), size) - - # Context manager support - def __enter__(self) -> TarIO: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.close() - - def close(self) -> None: - self.fh.close() diff --git a/.flatpak-builder/cache/objects/da/ded255f82783a5e312d9353e4597b4b855ed49be67418fb733017653707542.file b/.flatpak-builder/cache/objects/da/ded255f82783a5e312d9353e4597b4b855ed49be67418fb733017653707542.file deleted file mode 100644 index 96e83bbe81932e722ef7a202d8353e154c85c4af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33912 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 diff --git a/.flatpak-builder/cache/objects/da/e1fb738d7395e46d8694dc616f4306737a30c47b0638ceea4266b5273d973e.dirtree b/.flatpak-builder/cache/objects/da/e1fb738d7395e46d8694dc616f4306737a30c47b0638ceea4266b5273d973e.dirtree deleted file mode 100644 index e8f6a84608f9e1fe5aef75eb9a15d95426ee08f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmdN(&n(GI&&w}LW%!hs#G;a?yWV=?v>w6t`2sUiO_Vj-@A0~STCza-&L30m+|-i9 zl*E!mhS}C}PC3eFSuPuVljhj8+n#&n!*!kEGFQT+e=OV}7ypn`CoC;9C$*R%&xCu< z|IJl1<}7u2w!4B$r(%Mv{bqBEvR1*xY~t$|$hu_leUz>_nErVi^V8Pj@7`@I{k25s z>YL(knjNpXb3!`Q*vb-%7*y8mo*0vL#NO^)`n~&7SB?bmzNm6F-mr+1XX8=RFxECg Lrl_!Z^hE#we;I0a diff --git a/.flatpak-builder/cache/objects/db/9f2a0f40f20d77b1510f4441993595801f892dbba0867604a6606ec7cc9ee2.dirtree b/.flatpak-builder/cache/objects/db/9f2a0f40f20d77b1510f4441993595801f892dbba0867604a6606ec7cc9ee2.dirtree deleted file mode 100644 index 709dce424cddd5a993aff8807eb6fb5890a143a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmV-P0Ji^OaBy<~8FeGw*(Snk&7)+&_ay+C*CmcYTcKzu$cuQACFOJcL~0K48+^fM f^R@%!g~#shwsrcX64mT;_9=+#3v5(~B?U(SG(#kC diff --git a/.flatpak-builder/cache/objects/dc/1ff86869fd56cbf94cc5c642fa01e00ee68dcdcd631e36044db500eed095a0.dirtree b/.flatpak-builder/cache/objects/dc/1ff86869fd56cbf94cc5c642fa01e00ee68dcdcd631e36044db500eed095a0.dirtree deleted file mode 100644 index 6332f20c4ed9926fccefcfcdfc76c5c1f35ae1c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcma!#&&jq11QhO|^yIEwzb;DI`9PIn1NSYTHiCLAdSq}hj C`bA0r diff --git a/.flatpak-builder/cache/objects/dc/529d95da10fabb9e81de373c334d6c7a4819fea3ee41c2b2222de50baa8c90.dirtree b/.flatpak-builder/cache/objects/dc/529d95da10fabb9e81de373c334d6c7a4819fea3ee41c2b2222de50baa8c90.dirtree deleted file mode 100644 index 0a277173d1a1926838ad72b2c7fafdf3b06dbee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6145 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 APyhe` diff --git a/.flatpak-builder/cache/objects/dc/6f196e15bbe23d627112e356db7ebc2436cf5f171f652b985f01f5b1a3986e.file b/.flatpak-builder/cache/objects/dc/6f196e15bbe23d627112e356db7ebc2436cf5f171f652b985f01f5b1a3986e.file deleted file mode 100644 index 6776163..0000000 --- a/.flatpak-builder/cache/objects/dc/6f196e15bbe23d627112e356db7ebc2436cf5f171f652b985f01f5b1a3986e.file +++ /dev/null @@ -1,79 +0,0 @@ -""" -requests.compat -~~~~~~~~~~~~~~~ - -This module previously handled import compatibility issues -between Python 2 and Python 3. It remains for backwards -compatibility until the next major version. -""" - -try: - import chardet -except ImportError: - import charset_normalizer as chardet - -import sys - -# ------- -# Pythons -# ------- - -# Syntax sugar. -_ver = sys.version_info - -#: Python 2.x? -is_py2 = _ver[0] == 2 - -#: Python 3.x? -is_py3 = _ver[0] == 3 - -# json/simplejson module import resolution -has_simplejson = False -try: - import simplejson as json - - has_simplejson = True -except ImportError: - import json - -if has_simplejson: - from simplejson import JSONDecodeError -else: - from json import JSONDecodeError - -# Keep OrderedDict for backwards compatibility. -from collections import OrderedDict -from collections.abc import Callable, Mapping, MutableMapping -from http import cookiejar as cookielib -from http.cookies import Morsel -from io import StringIO - -# -------------- -# Legacy Imports -# -------------- -from urllib.parse import ( - quote, - quote_plus, - unquote, - unquote_plus, - urldefrag, - urlencode, - urljoin, - urlparse, - urlsplit, - urlunparse, -) -from urllib.request import ( - getproxies, - getproxies_environment, - parse_http_list, - proxy_bypass, - proxy_bypass_environment, -) - -builtin_str = str -str = str -bytes = bytes -basestring = (str, bytes) -numeric_types = (int, float) -integer_types = (int,) diff --git a/.flatpak-builder/cache/objects/dc/9d3e03dfb8ae15e928f96aca573c6259e8c4fc71e040920bc9ac4b4f021eec.dirtree b/.flatpak-builder/cache/objects/dc/9d3e03dfb8ae15e928f96aca573c6259e8c4fc71e040920bc9ac4b4f021eec.dirtree deleted file mode 100644 index 8f2b80aaca8f331584a8690ebc0f6bf2fd810a6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmV-Y0ImOXX>?^RaA9L>VP|D?0H_&sjBp?uZ2jP7AzD&0NCp@znc$VU`xEfg*KM)P oKSXK{@f&=>XY;lL<%P%Y?zVOMq!QKabM`5S>kDjDh%OFL0RBHG3jhEB diff --git a/.flatpak-builder/cache/objects/dc/b6a9c50aa0a7069df4910b2474ddfee209c9b1f6035dfb6a7f5f5aab3c1d6f.file b/.flatpak-builder/cache/objects/dc/b6a9c50aa0a7069df4910b2474ddfee209c9b1f6035dfb6a7f5f5aab3c1d6f.file deleted file mode 100644 index bc99081ffdf5f39e712ade0e38812651f0ded668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5055 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 CAp+t6 diff --git a/.flatpak-builder/cache/objects/dd/6bb2c15a9455b7cf69c0848b02e39713a2113cf89cae55b6ed8c7ca3e2a458.dirtree b/.flatpak-builder/cache/objects/dd/6bb2c15a9455b7cf69c0848b02e39713a2113cf89cae55b6ed8c7ca3e2a458.dirtree deleted file mode 100644 index e2f8a59dfe98b3569eebb9c2c59b3f204d76568d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74 zcmV-Q0JZ;fXkl_?0OUilxYvKpDH$5wBm*8jAY gXY;lL<%P%Y?zVOMq!QKabM`5S>kDjDh$aR|04l*G8vp> 3), - lambda bits: ((bits + 15) >> 3) & ~1, - lambda bits: ((bits + 31) >> 3) & ~3, - lambda bits: ((bits + 63) >> 3) & ~7, -] - - -def sz(s: bytes, o: int) -> bytes: - return s[o : s.index(b"\0", o)] - - -class PcfFontFile(FontFile.FontFile): - """Font file plugin for the X11 PCF format.""" - - name = "name" - - def __init__(self, fp: BinaryIO, charset_encoding: str = "iso8859-1"): - self.charset_encoding = charset_encoding - - magic = l32(fp.read(4)) - if magic != PCF_MAGIC: - msg = "not a PCF file" - raise SyntaxError(msg) - - super().__init__() - - count = l32(fp.read(4)) - self.toc = {} - for i in range(count): - type = l32(fp.read(4)) - self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) - - self.fp = fp - - self.info = self._load_properties() - - metrics = self._load_metrics() - bitmaps = self._load_bitmaps(metrics) - encoding = self._load_encoding() - - # - # create glyph structure - - for ch, ix in enumerate(encoding): - if ix is not None: - ( - xsize, - ysize, - left, - right, - width, - ascent, - descent, - attributes, - ) = metrics[ix] - self.glyph[ch] = ( - (width, 0), - (left, descent - ysize, xsize + left, descent), - (0, 0, xsize, ysize), - bitmaps[ix], - ) - - def _getformat( - self, tag: int - ) -> tuple[BinaryIO, int, Callable[[bytes], int], Callable[[bytes], int]]: - format, size, offset = self.toc[tag] - - fp = self.fp - fp.seek(offset) - - format = l32(fp.read(4)) - - if format & 4: - i16, i32 = b16, b32 - else: - i16, i32 = l16, l32 - - return fp, format, i16, i32 - - def _load_properties(self) -> dict[bytes, bytes | int]: - # - # font properties - - properties = {} - - fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) - - nprops = i32(fp.read(4)) - - # read property description - p = [(i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))) for _ in range(nprops)] - - if nprops & 3: - fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad - - data = fp.read(i32(fp.read(4))) - - for k, s, v in p: - property_value: bytes | int = sz(data, v) if s else v - properties[sz(data, k)] = property_value - - return properties - - def _load_metrics(self) -> list[tuple[int, int, int, int, int, int, int, int]]: - # - # font metrics - - metrics: list[tuple[int, int, int, int, int, int, int, int]] = [] - - fp, format, i16, i32 = self._getformat(PCF_METRICS) - - append = metrics.append - - if (format & 0xFF00) == 0x100: - # "compressed" metrics - for i in range(i16(fp.read(2))): - left = i8(fp.read(1)) - 128 - right = i8(fp.read(1)) - 128 - width = i8(fp.read(1)) - 128 - ascent = i8(fp.read(1)) - 128 - descent = i8(fp.read(1)) - 128 - xsize = right - left - ysize = ascent + descent - append((xsize, ysize, left, right, width, ascent, descent, 0)) - - else: - # "jumbo" metrics - for i in range(i32(fp.read(4))): - left = i16(fp.read(2)) - right = i16(fp.read(2)) - width = i16(fp.read(2)) - ascent = i16(fp.read(2)) - descent = i16(fp.read(2)) - attributes = i16(fp.read(2)) - xsize = right - left - ysize = ascent + descent - append((xsize, ysize, left, right, width, ascent, descent, attributes)) - - return metrics - - def _load_bitmaps( - self, metrics: list[tuple[int, int, int, int, int, int, int, int]] - ) -> list[Image.Image]: - # - # bitmap data - - fp, format, i16, i32 = self._getformat(PCF_BITMAPS) - - nbitmaps = i32(fp.read(4)) - - if nbitmaps != len(metrics): - msg = "Wrong number of bitmaps" - raise OSError(msg) - - offsets = [i32(fp.read(4)) for _ in range(nbitmaps)] - - bitmap_sizes = [i32(fp.read(4)) for _ in range(4)] - - # byteorder = format & 4 # non-zero => MSB - bitorder = format & 8 # non-zero => MSB - padindex = format & 3 - - bitmapsize = bitmap_sizes[padindex] - offsets.append(bitmapsize) - - data = fp.read(bitmapsize) - - pad = BYTES_PER_ROW[padindex] - mode = "1;R" - if bitorder: - mode = "1" - - bitmaps = [] - for i in range(nbitmaps): - xsize, ysize = metrics[i][:2] - b, e = offsets[i : i + 2] - bitmaps.append( - Image.frombytes("1", (xsize, ysize), data[b:e], "raw", mode, pad(xsize)) - ) - - return bitmaps - - def _load_encoding(self) -> list[int | None]: - fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) - - first_col, last_col = i16(fp.read(2)), i16(fp.read(2)) - first_row, last_row = i16(fp.read(2)), i16(fp.read(2)) - - i16(fp.read(2)) # default - - nencoding = (last_col - first_col + 1) * (last_row - first_row + 1) - - # map character code to bitmap index - encoding: list[int | None] = [None] * min(256, nencoding) - - encoding_offsets = [i16(fp.read(2)) for _ in range(nencoding)] - - for i in range(first_col, len(encoding)): - try: - encoding_offset = encoding_offsets[ - ord(bytearray([i]).decode(self.charset_encoding)) - ] - if encoding_offset != 0xFFFF: - encoding[i] = encoding_offset - except UnicodeDecodeError: - # character is not supported in selected encoding - pass - - return encoding diff --git a/.flatpak-builder/cache/objects/dd/cef9b2f2e776ddfa818300ae45588b3bb3caa1961b535ba8b925ea1a19e96c.file b/.flatpak-builder/cache/objects/dd/cef9b2f2e776ddfa818300ae45588b3bb3caa1961b535ba8b925ea1a19e96c.file deleted file mode 100644 index 7b6c8ddc94a6b445e5227b2e8eadc6b236f63610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2759 zcmbVO-A`Lb7N5CawgD6T0kJ6|4k0uqAKrwDHtjZ2)k2n(l2%DqszYKq%r%%?Uz>X` zC9$rxsA?rt<>6vk!ilJITXj>aw9@_s`#0DtKX^wQ32oJfyt!hZ`m|^K1t#67+VObi z+%xC=&Y3f3&b{Bc-CaCF$o*aT-+v*0KmQZZ?It!TytfU+79xmX1*LElV@7id7v%^~ z1cgrtQ6VKpMT|HkbIVc-frw8qLQmn}Xi*1;t{@_Pj)+4Rmz($qJpmVI4*F z+0}ZMoy%SO^b-zb;ooTB33nZZozK~07}M^!s-}&&kxZ-l+;e6)%u#VB6Dg-o>E zGLP1|tLQU)kYgXzY|9bc8RZ-%oQXfhnuqW?&S*y&A(QKr{0tM}9?tPO!G%n$^_#Fk zB7MOH+t@h~coIP!Jgg4>4zHw6TYx0$96{HSDH6xsdT_NV;v_D>YM*@;EO%fFZC4Hu zPk?^fem1(>BMGhAa}!Zr^}|(&ph91bw$!|r`i9zkA`?#{bE4>^=`=3J(e z^favpjpO^ermNG#9B=Zbkl^6t`&v@!MbLKtE^XmAw0)r6+thZOE^?$vJ4hc`@wBW! zO#T-3%snT-*kgCNE87cYDil{kP$Cjgku-K6ZfGp>b%7qrYw@)(SLfG_#P3aMT3Vxmp3KTr zFl0rcydpzoN~H;7fGjl9?^67!&JsM-Zoj@B ziDxnqC3z>3xo<3`)rs>LE=2UCA)m{{7w$qi*CQX!%tl&8_d{iMF{z%<+y`IM8ClJG zTPv*IpRe;q!Ghim!C6N&C+hP*SSuYFY4lxBf8prXP=2VmQ1*;eJR=)YwY#q_S$gGKL1#XC~!8QBd4OU~eiXo)r9oaO{VPAbQVzUU4IbML+V9var9imm68i^gyyKYH z5(=)G7kLK2FDLQ`ZK>oNgUS2pJh^X0x1Y#+mq2OkaEQ{~`zB{*(L&wK;c%I0KYviMQ{E$gknp0wj% zk9|9~Gx5z?`)t)8w5DKd)<=cczM3c+4=-(B`iF0{-Nh8PUmk~x9pXjsc*7&wt8Zess3^k!@=!APM|rsXDt0R_96*O)ESGZ z@su2k(XJRv=~ac%J+auzYFufqNQtxt7lC>kbBxIPf|ks%4-f4Ez(kZX$&xTo6W$b0)zJSK8h8vU+|3+ItimS+IHs|eC*?GmB8?RW zjnxF|SV*TbtgwU_i)m4}CNCy+L)PlIL7QX?Z?K{5=&#N{Hnw|Ny9^7gQt9m5uf}7H zYaxVBme9z-zKdMz_1`WUF8x-obs?8;gL}|b@|`I=&sLmg*Tq`zWenSVaj-5`d}F_` ih5ziY{)t1_zb;mg&zi0HU)>ohqsa=IEVX*w`~Lz$l5WHR diff --git a/.flatpak-builder/cache/objects/dd/ebb8639f9bc1e3c8aa9d9e9101fa7cd4edd8542fd820f6bbd302ce6290c05f.file b/.flatpak-builder/cache/objects/dd/ebb8639f9bc1e3c8aa9d9e9101fa7cd4edd8542fd820f6bbd302ce6290c05f.file deleted file mode 100644 index 6cd3a902abadeba59a6d6d779edce03ce29c47bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4501 zcmb6cU2ogg^-`oniIOGTvLxGSY|3_`%8unGZW1F6x}{5;CQD=^PEu6BAjl$P)0Rl} zl1d_12GpSg@~}M&XpvxR0i)QGY}tUk3>db(*9nQpnq;SW-Qe-NH-ctY(Q1ka}^(<86| zdj&7Ru-GT~R$atq9B?5qd>=-S92X!&I4xLDl3Pn$R)lgvm-xl<5|71_ zf;E0wER;n2rkYGWBjo94;69Y3On)|eQ^cyI$k{AReWi+05@l5_ff`ptt&C+p#|u(k<8MjYGOsO*{Cq`QR%Bi( zmI`7~goCER$>DRdz&ocX#c@1b^H{kl2_nC!ID~SpC|Y=gi-XH6H(t%uVv{dp3{nae z9+zcuq*MH?f_d?Fjwo=12iZSyRGLm5eJeH1OGMd10ggS<-(vD{f(TEX;u8*T;s~E` zR3NK1Wn$e?{pzx$@;AzI-ZJf$f>%|3QB<{dVZ`A1%6#P%FUfoc9GikM=nmwgTsnQBUl6*rk-NoFBf}xXSyUSz63}CS!=2QST#e&JKC=yX7xKC8H zbKc~ul9rO{3HJWzlqzZBWGR(BxI&a6*IKY z96SWPM&MEZ3!sKxL{W689+}>Z9Ir=?*U~#|A=Rga(2y+hCp zU+mtAEni&s#f|vHKjX)?;>WfFp?V-*4#P#2s+47C*zR~Yj==7E^ zq5BdqzubwBgWR3I5q;{M?w=)%nSBmcqdWo4s|yAs1U{byH{XS%+7a$sL9H{~ci_At zB?#0Pu5~0wMv>ME?+8JX_L9^GxAnd~g=(#^{Bn8`Xss8l(g2p53_CFfyoGr;1)b!kz4C+qv6|UdlVh3ExlL#O-h0NEn{;7?FO2w z2x)_RW5Fx9JJT812nA3F{u{5sXEk!*ooi42x>um9-cOjSmuMnWf*W}INFu5FG`@+C zkie9wb|1kURozurm8sHIPn892$j9Vd5=lb=l7`j}pBH5j=QI)*?SMgY4GCx2kQ4kQi%NMqu;q|2I^A*Z%!Mg^0)jY&b73}CWp_y7QtvzcX~1~Nls z6_QT2RTP>1_CkI+hgDI_LU=0X3euX0N#!&LmD9q)C6g`V0)&`plO=e9sF}UrLlDU0 zN=Z|eaIUmmF&RmabEdZ$e3HGkMscDRagWK)Eu6y`;yu|6oFss#jwc8h2LKq3e3~c` zotro?TxjnlHDcs zhJE3K1c|YZ%a34q4j%P45Pxc@!T8+V)9BD=%4RfCk0!Qb!}VBVGnTB!k_|UKz%>wn zJ6(6Wc3*f=AlyKV8`hd&Cpv7z_)f$-T@4!E@9yrt2%rPwn}ZYe!3mv-8GQ%8yj34Q zriZ6%myF>zACBomQ#x}1*6(S0c&v75n;mE%%AKZ+(Ia1{eq2vo(nl`q-r;RFNY-bJ z{`l`t)<;k1v6FWK5WoBSjROZkc+>-0Mm@DOsOSw@+C7a8)nnt^Bgx-Q)JM+h!|y`_ z%t2z$Aa^I&;E=EP^OIkmet7V&uFdc}_3%3l+BM+OnMlKHzj}M);A40-T@O#gs~%77 z0E{8yS6M+Gz{d^yu~49OxApF$O1%=%MWcV-L^j2j1Eqn|P>g z%o&kUBRovn&~c+bX>7KzsjJV3WQagM6@Id^t0L4h9!VCUW=$s<(`|8pT18c4(=C*X zB^8r%`3HoDp>vLF5&qWj`!KJ;qmu8rhMqFMUyc28{PU~7zW&+u4ejw6ojb9~ou~t3 zPS%-|db3%KOm8+zxWF%5#ALHsLCI&cn4Eq)io8umeFTv2-3}h)%dsQKaWW!eP5*@= z`B}8%j1^Nt&WD{Mf0bBTw8DfPI^H5=RxlzaSq2b2NO1_l&y%&5k>7bw7p=e3cX1kC zkcvRP4X{B|6lI`E9Zl{af6clL6slRbfw-D=w+3xE!J2jNShPUiY7K^_h79JQ-qv;v zwiiAuYG@A_1Aq~=8_{A2KI4Xmrosl(TT9z_lMI3ZMcKdz_SVjmo6v+U8ZV(q>Yc3- zK<<8s1$Jxa+2}%E;6+pYd%)=Kt6i{I8{t^(61f{JU=aSjJawLGpf)&5%~0?KwZKiv zMa?u&3vh@D+*#YA2XuPCV7#@npUi$bTeI#4jhI1LR>?W|ib{0qLb(H=Ka|->9 aJ;TsXXo^6u=S&PeiTTeQqMwXW0RIn-XK|DO diff --git a/.flatpak-builder/cache/objects/de/390678f4ef4f1f99c6f8bc38c9186f006ad3620778a4ed0c28183f17c707ea.file b/.flatpak-builder/cache/objects/de/390678f4ef4f1f99c6f8bc38c9186f006ad3620778a4ed0c28183f17c707ea.file deleted file mode 100644 index 8917033309b62b3f1240353b6e00d6ca1d06ab33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 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 NKB42!cA2G||2LpSYGnWb diff --git a/.flatpak-builder/cache/objects/e0/44b9b1b7b956ea1a0646954aec3d7359b5b70291235600441de6ca7b2ad8b2.dirtree b/.flatpak-builder/cache/objects/e0/44b9b1b7b956ea1a0646954aec3d7359b5b70291235600441de6ca7b2ad8b2.dirtree deleted file mode 100644 index c85c341a8d60bdc6ac5df22a14f06f7522486b0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61 zcmYe!&(+IHO-n0IEz)z$DM(CC)T_wN(Mzvl(5}?1FH+UMYi6-k#+`lc!dDUR*Zscz Rvi{GzZh>n80-L0)Z2;yO8R7r{ diff --git a/.flatpak-builder/cache/objects/e0/7c49062be8f0b22589f702c3dc2281bcd3de170026fb855f6fada4df5da5be.file b/.flatpak-builder/cache/objects/e0/7c49062be8f0b22589f702c3dc2281bcd3de170026fb855f6fada4df5da5be.file deleted file mode 100644 index abb3fb7..0000000 --- a/.flatpak-builder/cache/objects/e0/7c49062be8f0b22589f702c3dc2281bcd3de170026fb855f6fada4df5da5be.file +++ /dev/null @@ -1,103 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IM Tools support for PIL -# -# history: -# 1996-05-27 fl Created (read 8-bit images only) -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) -# -# Copyright (c) Secret Labs AB 1997-2001. -# Copyright (c) Fredrik Lundh 1996-2001. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re - -from . import Image, ImageFile - -# -# -------------------------------------------------------------------- - -field = re.compile(rb"([a-z]*) ([^ \r\n]*)") - - -## -# Image plugin for IM Tools images. - - -class ImtImageFile(ImageFile.ImageFile): - format = "IMT" - format_description = "IM Tools" - - def _open(self) -> None: - # Quick rejection: if there's not a LF among the first - # 100 bytes, this is (probably) not a text header. - - assert self.fp is not None - - buffer = self.fp.read(100) - if b"\n" not in buffer: - msg = "not an IM file" - raise SyntaxError(msg) - - xsize = ysize = 0 - - while True: - if buffer: - s = buffer[:1] - buffer = buffer[1:] - else: - s = self.fp.read(1) - if not s: - break - - if s == b"\x0C": - # image data begins - self.tile = [ - ( - "raw", - (0, 0) + self.size, - self.fp.tell() - len(buffer), - (self.mode, 0, 1), - ) - ] - - break - - else: - # read key/value pair - if b"\n" not in buffer: - buffer += self.fp.read(100) - lines = buffer.split(b"\n") - s += lines.pop(0) - buffer = b"\n".join(lines) - if len(s) == 1 or len(s) > 100: - break - if s[0] == ord(b"*"): - continue # comment - - m = field.match(s) - if not m: - break - k, v = m.group(1, 2) - if k == b"width": - xsize = int(v) - self._size = xsize, ysize - elif k == b"height": - ysize = int(v) - self._size = xsize, ysize - elif k == b"pixel" and v == b"n8": - self._mode = "L" - - -# -# -------------------------------------------------------------------- - -Image.register_open(ImtImageFile.format, ImtImageFile) - -# -# no extension registered (".im" is simply too common) diff --git a/.flatpak-builder/cache/objects/e0/e7278daec6c7854df9b81f060e02cb3b0b302880e078c770398b788b9f190d.dirtree b/.flatpak-builder/cache/objects/e0/e7278daec6c7854df9b81f060e02cb3b0b302880e078c770398b788b9f190d.dirtree deleted file mode 100644 index 8737e54739bb51e08e8ff7b53c8103bd0a030661..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmV-Y0ImOXX>?^RaA9L>VP|D?0M`Mlkibg+>$aE-0&psf#oQ8}fHXlk@h1IN3{~9x o>_ln~@f&=>XY;lL<%P%Y?zVOMq!QKabM`5S>kDjDh%OFL09u$RT>t<8 diff --git a/.flatpak-builder/cache/objects/e1/0389c85992aa78d2ac085a565d512645845ecc320d6f6cf327064e015419d7.dirtree b/.flatpak-builder/cache/objects/e1/0389c85992aa78d2ac085a565d512645845ecc320d6f6cf327064e015419d7.dirtree deleted file mode 100644 index bb4a5d2e81a67cbb38e755cfd3d08b00aa9ba452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67 zcmV-J0KETWZ*4AWWoBk`WpXY-Y;a*?VJ>ZDbYW?3W^XQdZEOHF?zf}NYlgkh;OY|W ZeEc47bQPo8AKpO4sI", fobj.read(HEADERSIZE)) - - -def read_32t(fobj, start_length, size): - # The 128x128 icon seems to have an extra header for some reason. - (start, length) = start_length - fobj.seek(start) - sig = fobj.read(4) - if sig != b"\x00\x00\x00\x00": - msg = "Unknown signature, expecting 0x00000000" - raise SyntaxError(msg) - return read_32(fobj, (start + 4, length - 4), size) - - -def read_32(fobj, start_length, size): - """ - Read a 32bit RGB icon resource. Seems to be either uncompressed or - an RLE packbits-like scheme. - """ - (start, length) = start_length - fobj.seek(start) - pixel_size = (size[0] * size[2], size[1] * size[2]) - sizesq = pixel_size[0] * pixel_size[1] - if length == sizesq * 3: - # uncompressed ("RGBRGBGB") - indata = fobj.read(length) - im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) - else: - # decode image - im = Image.new("RGB", pixel_size, None) - for band_ix in range(3): - data = [] - bytesleft = sizesq - while bytesleft > 0: - byte = fobj.read(1) - if not byte: - break - byte = byte[0] - if byte & 0x80: - blocksize = byte - 125 - byte = fobj.read(1) - for i in range(blocksize): - data.append(byte) - else: - blocksize = byte + 1 - data.append(fobj.read(blocksize)) - bytesleft -= blocksize - if bytesleft <= 0: - break - if bytesleft != 0: - msg = f"Error reading channel [{repr(bytesleft)} left]" - raise SyntaxError(msg) - band = Image.frombuffer("L", pixel_size, b"".join(data), "raw", "L", 0, 1) - im.im.putband(band.im, band_ix) - return {"RGB": im} - - -def read_mk(fobj, start_length, size): - # Alpha masks seem to be uncompressed - start = start_length[0] - fobj.seek(start) - pixel_size = (size[0] * size[2], size[1] * size[2]) - sizesq = pixel_size[0] * pixel_size[1] - band = Image.frombuffer("L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1) - return {"A": band} - - -def read_png_or_jpeg2000(fobj, start_length, size): - (start, length) = start_length - fobj.seek(start) - sig = fobj.read(12) - if sig[:8] == b"\x89PNG\x0d\x0a\x1a\x0a": - fobj.seek(start) - im = PngImagePlugin.PngImageFile(fobj) - Image._decompression_bomb_check(im.size) - return {"RGBA": im} - elif ( - sig[:4] == b"\xff\x4f\xff\x51" - or sig[:4] == b"\x0d\x0a\x87\x0a" - or sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" - ): - if not enable_jpeg2k: - msg = ( - "Unsupported icon subimage format (rebuild PIL " - "with JPEG 2000 support to fix this)" - ) - raise ValueError(msg) - # j2k, jpc or j2c - fobj.seek(start) - jp2kstream = fobj.read(length) - f = io.BytesIO(jp2kstream) - im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) - Image._decompression_bomb_check(im.size) - if im.mode != "RGBA": - im = im.convert("RGBA") - return {"RGBA": im} - else: - msg = "Unsupported icon subimage format" - raise ValueError(msg) - - -class IcnsFile: - SIZES = { - (512, 512, 2): [(b"ic10", read_png_or_jpeg2000)], - (512, 512, 1): [(b"ic09", read_png_or_jpeg2000)], - (256, 256, 2): [(b"ic14", read_png_or_jpeg2000)], - (256, 256, 1): [(b"ic08", read_png_or_jpeg2000)], - (128, 128, 2): [(b"ic13", read_png_or_jpeg2000)], - (128, 128, 1): [ - (b"ic07", read_png_or_jpeg2000), - (b"it32", read_32t), - (b"t8mk", read_mk), - ], - (64, 64, 1): [(b"icp6", read_png_or_jpeg2000)], - (32, 32, 2): [(b"ic12", read_png_or_jpeg2000)], - (48, 48, 1): [(b"ih32", read_32), (b"h8mk", read_mk)], - (32, 32, 1): [ - (b"icp5", read_png_or_jpeg2000), - (b"il32", read_32), - (b"l8mk", read_mk), - ], - (16, 16, 2): [(b"ic11", read_png_or_jpeg2000)], - (16, 16, 1): [ - (b"icp4", read_png_or_jpeg2000), - (b"is32", read_32), - (b"s8mk", read_mk), - ], - } - - def __init__(self, fobj): - """ - fobj is a file-like object as an icns resource - """ - # signature : (start, length) - self.dct = dct = {} - self.fobj = fobj - sig, filesize = nextheader(fobj) - if not _accept(sig): - msg = "not an icns file" - raise SyntaxError(msg) - i = HEADERSIZE - while i < filesize: - sig, blocksize = nextheader(fobj) - if blocksize <= 0: - msg = "invalid block header" - raise SyntaxError(msg) - i += HEADERSIZE - blocksize -= HEADERSIZE - dct[sig] = (i, blocksize) - fobj.seek(blocksize, io.SEEK_CUR) - i += blocksize - - def itersizes(self): - sizes = [] - for size, fmts in self.SIZES.items(): - for fmt, reader in fmts: - if fmt in self.dct: - sizes.append(size) - break - return sizes - - def bestsize(self): - sizes = self.itersizes() - if not sizes: - msg = "No 32bit icon resources found" - raise SyntaxError(msg) - return max(sizes) - - def dataforsize(self, size): - """ - Get an icon resource as {channel: array}. Note that - the arrays are bottom-up like windows bitmaps and will likely - need to be flipped or transposed in some way. - """ - dct = {} - for code, reader in self.SIZES[size]: - desc = self.dct.get(code) - if desc is not None: - dct.update(reader(self.fobj, desc, size)) - return dct - - def getimage(self, size=None): - if size is None: - size = self.bestsize() - if len(size) == 2: - size = (size[0], size[1], 1) - channels = self.dataforsize(size) - - im = channels.get("RGBA", None) - if im: - return im - - im = channels.get("RGB").copy() - try: - im.putalpha(channels["A"]) - except KeyError: - pass - return im - - -## -# Image plugin for Mac OS icons. - - -class IcnsImageFile(ImageFile.ImageFile): - """ - PIL image support for Mac OS .icns files. - Chooses the best resolution, but will possibly load - a different size image if you mutate the size attribute - before calling 'load'. - - The info dictionary has a key 'sizes' that is a list - of sizes that the icns file has. - """ - - format = "ICNS" - format_description = "Mac OS icns resource" - - def _open(self): - self.icns = IcnsFile(self.fp) - self._mode = "RGBA" - self.info["sizes"] = self.icns.itersizes() - self.best_size = self.icns.bestsize() - self.size = ( - self.best_size[0] * self.best_size[2], - self.best_size[1] * self.best_size[2], - ) - - @property - def size(self): - return self._size - - @size.setter - def size(self, value): - info_size = value - if info_size not in self.info["sizes"] and len(info_size) == 2: - info_size = (info_size[0], info_size[1], 1) - if ( - info_size not in self.info["sizes"] - and len(info_size) == 3 - and info_size[2] == 1 - ): - simple_sizes = [ - (size[0] * size[2], size[1] * size[2]) for size in self.info["sizes"] - ] - if value in simple_sizes: - info_size = self.info["sizes"][simple_sizes.index(value)] - if info_size not in self.info["sizes"]: - msg = "This is not one of the allowed sizes of this image" - raise ValueError(msg) - self._size = value - - def load(self): - if len(self.size) == 3: - self.best_size = self.size - self.size = ( - self.best_size[0] * self.best_size[2], - self.best_size[1] * self.best_size[2], - ) - - px = Image.Image.load(self) - if self.im is not None and self.im.size == self.size: - # Already loaded - return px - self.load_prepare() - # This is likely NOT the best way to do it, but whatever. - im = self.icns.getimage(self.best_size) - - # If this is a PNG or JPEG 2000, it won't be loaded yet - px = im.load() - - self.im = im.im - self._mode = im.mode - self.size = im.size - - return px - - -def _save(im, fp, filename): - """ - Saves the image as a series of PNG files, - that are then combined into a .icns file. - """ - if hasattr(fp, "flush"): - fp.flush() - - sizes = { - b"ic07": 128, - b"ic08": 256, - b"ic09": 512, - b"ic10": 1024, - b"ic11": 32, - b"ic12": 64, - b"ic13": 256, - b"ic14": 512, - } - provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} - size_streams = {} - for size in set(sizes.values()): - image = ( - provided_images[size] - if size in provided_images - else im.resize((size, size)) - ) - - temp = io.BytesIO() - image.save(temp, "png") - size_streams[size] = temp.getvalue() - - entries = [] - for type, size in sizes.items(): - stream = size_streams[size] - entries.append( - {"type": type, "size": HEADERSIZE + len(stream), "stream": stream} - ) - - # Header - fp.write(MAGIC) - file_length = HEADERSIZE # Header - file_length += HEADERSIZE + 8 * len(entries) # TOC - file_length += sum(entry["size"] for entry in entries) - fp.write(struct.pack(">i", file_length)) - - # TOC - fp.write(b"TOC ") - fp.write(struct.pack(">i", HEADERSIZE + len(entries) * HEADERSIZE)) - for entry in entries: - fp.write(entry["type"]) - fp.write(struct.pack(">i", entry["size"])) - - # Data - for entry in entries: - fp.write(entry["type"]) - fp.write(struct.pack(">i", entry["size"])) - fp.write(entry["stream"]) - - if hasattr(fp, "flush"): - fp.flush() - - -def _accept(prefix): - return prefix[:4] == MAGIC - - -Image.register_open(IcnsImageFile.format, IcnsImageFile, _accept) -Image.register_extension(IcnsImageFile.format, ".icns") - -Image.register_save(IcnsImageFile.format, _save) -Image.register_mime(IcnsImageFile.format, "image/icns") - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 IcnsImagePlugin.py [file]") - sys.exit() - - with open(sys.argv[1], "rb") as fp: - imf = IcnsImageFile(fp) - for size in imf.info["sizes"]: - width, height, scale = imf.size = size - imf.save(f"out-{width}-{height}-{scale}.png") - with Image.open(sys.argv[1]) as im: - im.save("out.png") - if sys.platform == "windows": - os.startfile("out.png") diff --git a/.flatpak-builder/cache/objects/e3/21f5f4d9cbda7c5f2f13cac385ecf1cc59a95b0b4e1810666e35dc83ae7e19.file b/.flatpak-builder/cache/objects/e3/21f5f4d9cbda7c5f2f13cac385ecf1cc59a95b0b4e1810666e35dc83ae7e19.file deleted file mode 100644 index 534c629..0000000 --- a/.flatpak-builder/cache/objects/e3/21f5f4d9cbda7c5f2f13cac385ecf1cc59a95b0b4e1810666e35dc83ae7e19.file +++ /dev/null @@ -1,265 +0,0 @@ -# A binary morphology add-on for the Python Imaging Library -# -# History: -# 2014-06-04 Initial version. -# -# Copyright (c) 2014 Dov Grobgeld -from __future__ import annotations - -import re - -from . import Image, _imagingmorph - -LUT_SIZE = 1 << 9 - -# fmt: off -ROTATION_MATRIX = [ - 6, 3, 0, - 7, 4, 1, - 8, 5, 2, -] -MIRROR_MATRIX = [ - 2, 1, 0, - 5, 4, 3, - 8, 7, 6, -] -# fmt: on - - -class LutBuilder: - """A class for building a MorphLut from a descriptive language - - The input patterns is a list of a strings sequences like these:: - - 4:(... - .1. - 111)->1 - - (whitespaces including linebreaks are ignored). The option 4 - describes a series of symmetry operations (in this case a - 4-rotation), the pattern is described by: - - - . or X - Ignore - - 1 - Pixel is on - - 0 - Pixel is off - - The result of the operation is described after "->" string. - - The default is to return the current pixel value, which is - returned if no other match is found. - - Operations: - - - 4 - 4 way rotation - - N - Negate - - 1 - Dummy op for no other operation (an op must always be given) - - M - Mirroring - - Example:: - - lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) - lut = lb.build_lut() - - """ - - def __init__( - self, patterns: list[str] | None = None, op_name: str | None = None - ) -> None: - if patterns is not None: - self.patterns = patterns - else: - self.patterns = [] - self.lut: bytearray | None = None - if op_name is not None: - known_patterns = { - "corner": ["1:(... ... ...)->0", "4:(00. 01. ...)->1"], - "dilation4": ["4:(... .0. .1.)->1"], - "dilation8": ["4:(... .0. .1.)->1", "4:(... .0. ..1)->1"], - "erosion4": ["4:(... .1. .0.)->0"], - "erosion8": ["4:(... .1. .0.)->0", "4:(... .1. ..0)->0"], - "edge": [ - "1:(... ... ...)->0", - "4:(.0. .1. ...)->1", - "4:(01. .1. ...)->1", - ], - } - if op_name not in known_patterns: - msg = "Unknown pattern " + op_name + "!" - raise Exception(msg) - - self.patterns = known_patterns[op_name] - - def add_patterns(self, patterns: list[str]) -> None: - self.patterns += patterns - - def build_default_lut(self) -> None: - symbols = [0, 1] - m = 1 << 4 # pos of current pixel - self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) - - def get_lut(self) -> bytearray | None: - return self.lut - - def _string_permute(self, pattern: str, permutation: list[int]) -> str: - """string_permute takes a pattern and a permutation and returns the - string permuted according to the permutation list. - """ - assert len(permutation) == 9 - return "".join(pattern[p] for p in permutation) - - def _pattern_permute( - self, basic_pattern: str, options: str, basic_result: int - ) -> list[tuple[str, int]]: - """pattern_permute takes a basic pattern and its result and clones - the pattern according to the modifications described in the $options - parameter. It returns a list of all cloned patterns.""" - patterns = [(basic_pattern, basic_result)] - - # rotations - if "4" in options: - res = patterns[-1][1] - for i in range(4): - patterns.append( - (self._string_permute(patterns[-1][0], ROTATION_MATRIX), res) - ) - # mirror - if "M" in options: - n = len(patterns) - for pattern, res in patterns[:n]: - patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res)) - - # negate - if "N" in options: - n = len(patterns) - for pattern, res in patterns[:n]: - # Swap 0 and 1 - pattern = pattern.replace("0", "Z").replace("1", "0").replace("Z", "1") - res = 1 - int(res) - patterns.append((pattern, res)) - - return patterns - - def build_lut(self) -> bytearray: - """Compile all patterns into a morphology lut. - - TBD :Build based on (file) morphlut:modify_lut - """ - self.build_default_lut() - assert self.lut is not None - patterns = [] - - # Parse and create symmetries of the patterns strings - for p in self.patterns: - m = re.search(r"(\w*):?\s*\((.+?)\)\s*->\s*(\d)", p.replace("\n", "")) - if not m: - msg = 'Syntax error in pattern "' + p + '"' - raise Exception(msg) - options = m.group(1) - pattern = m.group(2) - result = int(m.group(3)) - - # Get rid of spaces - pattern = pattern.replace(" ", "").replace("\n", "") - - patterns += self._pattern_permute(pattern, options, result) - - # compile the patterns into regular expressions for speed - compiled_patterns = [] - for pattern in patterns: - p = pattern[0].replace(".", "X").replace("X", "[01]") - compiled_patterns.append((re.compile(p), pattern[1])) - - # Step through table and find patterns that match. - # Note that all the patterns are searched. The last one - # caught overrides - for i in range(LUT_SIZE): - # Build the bit pattern - bitpattern = bin(i)[2:] - bitpattern = ("0" * (9 - len(bitpattern)) + bitpattern)[::-1] - - for pattern, r in compiled_patterns: - if pattern.match(bitpattern): - self.lut[i] = [0, 1][r] - - return self.lut - - -class MorphOp: - """A class for binary morphological operators""" - - def __init__( - self, - lut: bytearray | None = None, - op_name: str | None = None, - patterns: list[str] | None = None, - ) -> None: - """Create a binary morphological operator""" - self.lut = lut - if op_name is not None: - self.lut = LutBuilder(op_name=op_name).build_lut() - elif patterns is not None: - self.lut = LutBuilder(patterns=patterns).build_lut() - - def apply(self, image: Image.Image): - """Run a single morphological operation on an image - - Returns a tuple of the number of changed pixels and the - morphed image""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - outimage = Image.new(image.mode, image.size, None) - count = _imagingmorph.apply(bytes(self.lut), image.im.id, outimage.im.id) - return count, outimage - - def match(self, image: Image.Image): - """Get a list of coordinates matching the morphological operation on - an image. - - Returns a list of tuples of (x,y) coordinates - of all matching pixels. See :ref:`coordinate-system`.""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - return _imagingmorph.match(bytes(self.lut), image.im.id) - - def get_on_pixels(self, image: Image.Image): - """Get a list of all turned on pixels in a binary image - - Returns a list of tuples of (x,y) coordinates - of all matching pixels. See :ref:`coordinate-system`.""" - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - return _imagingmorph.get_on_pixels(image.im.id) - - def load_lut(self, filename: str) -> None: - """Load an operator from an mrl file""" - with open(filename, "rb") as f: - self.lut = bytearray(f.read()) - - if len(self.lut) != LUT_SIZE: - self.lut = None - msg = "Wrong size operator file!" - raise Exception(msg) - - def save_lut(self, filename: str) -> None: - """Save an operator to an mrl file""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - with open(filename, "wb") as f: - f.write(self.lut) - - def set_lut(self, lut: bytearray | None) -> None: - """Set the lut from an external source""" - self.lut = lut diff --git a/.flatpak-builder/cache/objects/e3/669492b424822854cccc4637f1f18583f85efae05fcdf1b5f26cfc53e37d31.file b/.flatpak-builder/cache/objects/e3/669492b424822854cccc4637f1f18583f85efae05fcdf1b5f26cfc53e37d31.file deleted file mode 100644 index 29e7f6359c371aefbb26101ae43d85fab984ac55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6268 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 Gr2hi>YdtRj diff --git a/.flatpak-builder/cache/objects/e3/6fb346f0d6ff0dee96a2cbba2ef85fa9141f0ef81f7b811a091a2ab90faa22.file b/.flatpak-builder/cache/objects/e3/6fb346f0d6ff0dee96a2cbba2ef85fa9141f0ef81f7b811a091a2ab90faa22.file deleted file mode 100644 index 4e0d2b51d6e21813ead4f883eac81e26833aef7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4064 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 KXZ9J>^Zx>DW?OLp diff --git a/.flatpak-builder/cache/objects/e3/ae9cf47d04e8c9e20136d1cb1e20f37d3b2d8f5e602d976bf4804beda951bb.file b/.flatpak-builder/cache/objects/e3/ae9cf47d04e8c9e20136d1cb1e20f37d3b2d8f5e602d976bf4804beda951bb.file deleted file mode 100644 index 8634904..0000000 --- a/.flatpak-builder/cache/objects/e3/ae9cf47d04e8c9e20136d1cb1e20f37d3b2d8f5e602d976bf4804beda951bb.file +++ /dev/null @@ -1,1995 +0,0 @@ -# -*- coding: utf-8 -*- -from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE -from encodings.aliases import aliases -from re import IGNORECASE, compile as re_compile -from typing import Dict, List, Set, Union - -# Contain for each eligible encoding a list of/item bytes SIG/BOM -ENCODING_MARKS: Dict[str, Union[bytes, List[bytes]]] = { - "utf_8": BOM_UTF8, - "utf_7": [ - b"\x2b\x2f\x76\x38", - b"\x2b\x2f\x76\x39", - b"\x2b\x2f\x76\x2b", - b"\x2b\x2f\x76\x2f", - b"\x2b\x2f\x76\x38\x2d", - ], - "gb18030": b"\x84\x31\x95\x33", - "utf_32": [BOM_UTF32_BE, BOM_UTF32_LE], - "utf_16": [BOM_UTF16_BE, BOM_UTF16_LE], -} - -TOO_SMALL_SEQUENCE: int = 32 -TOO_BIG_SEQUENCE: int = int(10e6) - -UTF8_MAXIMAL_ALLOCATION: int = 1_112_064 - -# Up-to-date Unicode ucd/15.0.0 -UNICODE_RANGES_COMBINED: Dict[str, range] = { - "Control character": range(32), - "Basic Latin": range(32, 128), - "Latin-1 Supplement": range(128, 256), - "Latin Extended-A": range(256, 384), - "Latin Extended-B": range(384, 592), - "IPA Extensions": range(592, 688), - "Spacing Modifier Letters": range(688, 768), - "Combining Diacritical Marks": range(768, 880), - "Greek and Coptic": range(880, 1024), - "Cyrillic": range(1024, 1280), - "Cyrillic Supplement": range(1280, 1328), - "Armenian": range(1328, 1424), - "Hebrew": range(1424, 1536), - "Arabic": range(1536, 1792), - "Syriac": range(1792, 1872), - "Arabic Supplement": range(1872, 1920), - "Thaana": range(1920, 1984), - "NKo": range(1984, 2048), - "Samaritan": range(2048, 2112), - "Mandaic": range(2112, 2144), - "Syriac Supplement": range(2144, 2160), - "Arabic Extended-B": range(2160, 2208), - "Arabic Extended-A": range(2208, 2304), - "Devanagari": range(2304, 2432), - "Bengali": range(2432, 2560), - "Gurmukhi": range(2560, 2688), - "Gujarati": range(2688, 2816), - "Oriya": range(2816, 2944), - "Tamil": range(2944, 3072), - "Telugu": range(3072, 3200), - "Kannada": range(3200, 3328), - "Malayalam": range(3328, 3456), - "Sinhala": range(3456, 3584), - "Thai": range(3584, 3712), - "Lao": range(3712, 3840), - "Tibetan": range(3840, 4096), - "Myanmar": range(4096, 4256), - "Georgian": range(4256, 4352), - "Hangul Jamo": range(4352, 4608), - "Ethiopic": range(4608, 4992), - "Ethiopic Supplement": range(4992, 5024), - "Cherokee": range(5024, 5120), - "Unified Canadian Aboriginal Syllabics": range(5120, 5760), - "Ogham": range(5760, 5792), - "Runic": range(5792, 5888), - "Tagalog": range(5888, 5920), - "Hanunoo": range(5920, 5952), - "Buhid": range(5952, 5984), - "Tagbanwa": range(5984, 6016), - "Khmer": range(6016, 6144), - "Mongolian": range(6144, 6320), - "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6400), - "Limbu": range(6400, 6480), - "Tai Le": range(6480, 6528), - "New Tai Lue": range(6528, 6624), - "Khmer Symbols": range(6624, 6656), - "Buginese": range(6656, 6688), - "Tai Tham": range(6688, 6832), - "Combining Diacritical Marks Extended": range(6832, 6912), - "Balinese": range(6912, 7040), - "Sundanese": range(7040, 7104), - "Batak": range(7104, 7168), - "Lepcha": range(7168, 7248), - "Ol Chiki": range(7248, 7296), - "Cyrillic Extended-C": range(7296, 7312), - "Georgian Extended": range(7312, 7360), - "Sundanese Supplement": range(7360, 7376), - "Vedic Extensions": range(7376, 7424), - "Phonetic Extensions": range(7424, 7552), - "Phonetic Extensions Supplement": range(7552, 7616), - "Combining Diacritical Marks Supplement": range(7616, 7680), - "Latin Extended Additional": range(7680, 7936), - "Greek Extended": range(7936, 8192), - "General Punctuation": range(8192, 8304), - "Superscripts and Subscripts": range(8304, 8352), - "Currency Symbols": range(8352, 8400), - "Combining Diacritical Marks for Symbols": range(8400, 8448), - "Letterlike Symbols": range(8448, 8528), - "Number Forms": range(8528, 8592), - "Arrows": range(8592, 8704), - "Mathematical Operators": range(8704, 8960), - "Miscellaneous Technical": range(8960, 9216), - "Control Pictures": range(9216, 9280), - "Optical Character Recognition": range(9280, 9312), - "Enclosed Alphanumerics": range(9312, 9472), - "Box Drawing": range(9472, 9600), - "Block Elements": range(9600, 9632), - "Geometric Shapes": range(9632, 9728), - "Miscellaneous Symbols": range(9728, 9984), - "Dingbats": range(9984, 10176), - "Miscellaneous Mathematical Symbols-A": range(10176, 10224), - "Supplemental Arrows-A": range(10224, 10240), - "Braille Patterns": range(10240, 10496), - "Supplemental Arrows-B": range(10496, 10624), - "Miscellaneous Mathematical Symbols-B": range(10624, 10752), - "Supplemental Mathematical Operators": range(10752, 11008), - "Miscellaneous Symbols and Arrows": range(11008, 11264), - "Glagolitic": range(11264, 11360), - "Latin Extended-C": range(11360, 11392), - "Coptic": range(11392, 11520), - "Georgian Supplement": range(11520, 11568), - "Tifinagh": range(11568, 11648), - "Ethiopic Extended": range(11648, 11744), - "Cyrillic Extended-A": range(11744, 11776), - "Supplemental Punctuation": range(11776, 11904), - "CJK Radicals Supplement": range(11904, 12032), - "Kangxi Radicals": range(12032, 12256), - "Ideographic Description Characters": range(12272, 12288), - "CJK Symbols and Punctuation": range(12288, 12352), - "Hiragana": range(12352, 12448), - "Katakana": range(12448, 12544), - "Bopomofo": range(12544, 12592), - "Hangul Compatibility Jamo": range(12592, 12688), - "Kanbun": range(12688, 12704), - "Bopomofo Extended": range(12704, 12736), - "CJK Strokes": range(12736, 12784), - "Katakana Phonetic Extensions": range(12784, 12800), - "Enclosed CJK Letters and Months": range(12800, 13056), - "CJK Compatibility": range(13056, 13312), - "CJK Unified Ideographs Extension A": range(13312, 19904), - "Yijing Hexagram Symbols": range(19904, 19968), - "CJK Unified Ideographs": range(19968, 40960), - "Yi Syllables": range(40960, 42128), - "Yi Radicals": range(42128, 42192), - "Lisu": range(42192, 42240), - "Vai": range(42240, 42560), - "Cyrillic Extended-B": range(42560, 42656), - "Bamum": range(42656, 42752), - "Modifier Tone Letters": range(42752, 42784), - "Latin Extended-D": range(42784, 43008), - "Syloti Nagri": range(43008, 43056), - "Common Indic Number Forms": range(43056, 43072), - "Phags-pa": range(43072, 43136), - "Saurashtra": range(43136, 43232), - "Devanagari Extended": range(43232, 43264), - "Kayah Li": range(43264, 43312), - "Rejang": range(43312, 43360), - "Hangul Jamo Extended-A": range(43360, 43392), - "Javanese": range(43392, 43488), - "Myanmar Extended-B": range(43488, 43520), - "Cham": range(43520, 43616), - "Myanmar Extended-A": range(43616, 43648), - "Tai Viet": range(43648, 43744), - "Meetei Mayek Extensions": range(43744, 43776), - "Ethiopic Extended-A": range(43776, 43824), - "Latin Extended-E": range(43824, 43888), - "Cherokee Supplement": range(43888, 43968), - "Meetei Mayek": range(43968, 44032), - "Hangul Syllables": range(44032, 55216), - "Hangul Jamo Extended-B": range(55216, 55296), - "High Surrogates": range(55296, 56192), - "High Private Use Surrogates": range(56192, 56320), - "Low Surrogates": range(56320, 57344), - "Private Use Area": range(57344, 63744), - "CJK Compatibility Ideographs": range(63744, 64256), - "Alphabetic Presentation Forms": range(64256, 64336), - "Arabic Presentation Forms-A": range(64336, 65024), - "Variation Selectors": range(65024, 65040), - "Vertical Forms": range(65040, 65056), - "Combining Half Marks": range(65056, 65072), - "CJK Compatibility Forms": range(65072, 65104), - "Small Form Variants": range(65104, 65136), - "Arabic Presentation Forms-B": range(65136, 65280), - "Halfwidth and Fullwidth Forms": range(65280, 65520), - "Specials": range(65520, 65536), - "Linear B Syllabary": range(65536, 65664), - "Linear B Ideograms": range(65664, 65792), - "Aegean Numbers": range(65792, 65856), - "Ancient Greek Numbers": range(65856, 65936), - "Ancient Symbols": range(65936, 66000), - "Phaistos Disc": range(66000, 66048), - "Lycian": range(66176, 66208), - "Carian": range(66208, 66272), - "Coptic Epact Numbers": range(66272, 66304), - "Old Italic": range(66304, 66352), - "Gothic": range(66352, 66384), - "Old Permic": range(66384, 66432), - "Ugaritic": range(66432, 66464), - "Old Persian": range(66464, 66528), - "Deseret": range(66560, 66640), - "Shavian": range(66640, 66688), - "Osmanya": range(66688, 66736), - "Osage": range(66736, 66816), - "Elbasan": range(66816, 66864), - "Caucasian Albanian": range(66864, 66928), - "Vithkuqi": range(66928, 67008), - "Linear A": range(67072, 67456), - "Latin Extended-F": range(67456, 67520), - "Cypriot Syllabary": range(67584, 67648), - "Imperial Aramaic": range(67648, 67680), - "Palmyrene": range(67680, 67712), - "Nabataean": range(67712, 67760), - "Hatran": range(67808, 67840), - "Phoenician": range(67840, 67872), - "Lydian": range(67872, 67904), - "Meroitic Hieroglyphs": range(67968, 68000), - "Meroitic Cursive": range(68000, 68096), - "Kharoshthi": range(68096, 68192), - "Old South Arabian": range(68192, 68224), - "Old North Arabian": range(68224, 68256), - "Manichaean": range(68288, 68352), - "Avestan": range(68352, 68416), - "Inscriptional Parthian": range(68416, 68448), - "Inscriptional Pahlavi": range(68448, 68480), - "Psalter Pahlavi": range(68480, 68528), - "Old Turkic": range(68608, 68688), - "Old Hungarian": range(68736, 68864), - "Hanifi Rohingya": range(68864, 68928), - "Rumi Numeral Symbols": range(69216, 69248), - "Yezidi": range(69248, 69312), - "Arabic Extended-C": range(69312, 69376), - "Old Sogdian": range(69376, 69424), - "Sogdian": range(69424, 69488), - "Old Uyghur": range(69488, 69552), - "Chorasmian": range(69552, 69600), - "Elymaic": range(69600, 69632), - "Brahmi": range(69632, 69760), - "Kaithi": range(69760, 69840), - "Sora Sompeng": range(69840, 69888), - "Chakma": range(69888, 69968), - "Mahajani": range(69968, 70016), - "Sharada": range(70016, 70112), - "Sinhala Archaic Numbers": range(70112, 70144), - "Khojki": range(70144, 70224), - "Multani": range(70272, 70320), - "Khudawadi": range(70320, 70400), - "Grantha": range(70400, 70528), - "Newa": range(70656, 70784), - "Tirhuta": range(70784, 70880), - "Siddham": range(71040, 71168), - "Modi": range(71168, 71264), - "Mongolian Supplement": range(71264, 71296), - "Takri": range(71296, 71376), - "Ahom": range(71424, 71504), - "Dogra": range(71680, 71760), - "Warang Citi": range(71840, 71936), - "Dives Akuru": range(71936, 72032), - "Nandinagari": range(72096, 72192), - "Zanabazar Square": range(72192, 72272), - "Soyombo": range(72272, 72368), - "Unified Canadian Aboriginal Syllabics Extended-A": range(72368, 72384), - "Pau Cin Hau": range(72384, 72448), - "Devanagari Extended-A": range(72448, 72544), - "Bhaiksuki": range(72704, 72816), - "Marchen": range(72816, 72896), - "Masaram Gondi": range(72960, 73056), - "Gunjala Gondi": range(73056, 73136), - "Makasar": range(73440, 73472), - "Kawi": range(73472, 73568), - "Lisu Supplement": range(73648, 73664), - "Tamil Supplement": range(73664, 73728), - "Cuneiform": range(73728, 74752), - "Cuneiform Numbers and Punctuation": range(74752, 74880), - "Early Dynastic Cuneiform": range(74880, 75088), - "Cypro-Minoan": range(77712, 77824), - "Egyptian Hieroglyphs": range(77824, 78896), - "Egyptian Hieroglyph Format Controls": range(78896, 78944), - "Anatolian Hieroglyphs": range(82944, 83584), - "Bamum Supplement": range(92160, 92736), - "Mro": range(92736, 92784), - "Tangsa": range(92784, 92880), - "Bassa Vah": range(92880, 92928), - "Pahawh Hmong": range(92928, 93072), - "Medefaidrin": range(93760, 93856), - "Miao": range(93952, 94112), - "Ideographic Symbols and Punctuation": range(94176, 94208), - "Tangut": range(94208, 100352), - "Tangut Components": range(100352, 101120), - "Khitan Small Script": range(101120, 101632), - "Tangut Supplement": range(101632, 101760), - "Kana Extended-B": range(110576, 110592), - "Kana Supplement": range(110592, 110848), - "Kana Extended-A": range(110848, 110896), - "Small Kana Extension": range(110896, 110960), - "Nushu": range(110960, 111360), - "Duployan": range(113664, 113824), - "Shorthand Format Controls": range(113824, 113840), - "Znamenny Musical Notation": range(118528, 118736), - "Byzantine Musical Symbols": range(118784, 119040), - "Musical Symbols": range(119040, 119296), - "Ancient Greek Musical Notation": range(119296, 119376), - "Kaktovik Numerals": range(119488, 119520), - "Mayan Numerals": range(119520, 119552), - "Tai Xuan Jing Symbols": range(119552, 119648), - "Counting Rod Numerals": range(119648, 119680), - "Mathematical Alphanumeric Symbols": range(119808, 120832), - "Sutton SignWriting": range(120832, 121520), - "Latin Extended-G": range(122624, 122880), - "Glagolitic Supplement": range(122880, 122928), - "Cyrillic Extended-D": range(122928, 123024), - "Nyiakeng Puachue Hmong": range(123136, 123216), - "Toto": range(123536, 123584), - "Wancho": range(123584, 123648), - "Nag Mundari": range(124112, 124160), - "Ethiopic Extended-B": range(124896, 124928), - "Mende Kikakui": range(124928, 125152), - "Adlam": range(125184, 125280), - "Indic Siyaq Numbers": range(126064, 126144), - "Ottoman Siyaq Numbers": range(126208, 126288), - "Arabic Mathematical Alphabetic Symbols": range(126464, 126720), - "Mahjong Tiles": range(126976, 127024), - "Domino Tiles": range(127024, 127136), - "Playing Cards": range(127136, 127232), - "Enclosed Alphanumeric Supplement": range(127232, 127488), - "Enclosed Ideographic Supplement": range(127488, 127744), - "Miscellaneous Symbols and Pictographs": range(127744, 128512), - "Emoticons range(Emoji)": range(128512, 128592), - "Ornamental Dingbats": range(128592, 128640), - "Transport and Map Symbols": range(128640, 128768), - "Alchemical Symbols": range(128768, 128896), - "Geometric Shapes Extended": range(128896, 129024), - "Supplemental Arrows-C": range(129024, 129280), - "Supplemental Symbols and Pictographs": range(129280, 129536), - "Chess Symbols": range(129536, 129648), - "Symbols and Pictographs Extended-A": range(129648, 129792), - "Symbols for Legacy Computing": range(129792, 130048), - "CJK Unified Ideographs Extension B": range(131072, 173792), - "CJK Unified Ideographs Extension C": range(173824, 177984), - "CJK Unified Ideographs Extension D": range(177984, 178208), - "CJK Unified Ideographs Extension E": range(178208, 183984), - "CJK Unified Ideographs Extension F": range(183984, 191472), - "CJK Compatibility Ideographs Supplement": range(194560, 195104), - "CJK Unified Ideographs Extension G": range(196608, 201552), - "CJK Unified Ideographs Extension H": range(201552, 205744), - "Tags": range(917504, 917632), - "Variation Selectors Supplement": range(917760, 918000), - "Supplementary Private Use Area-A": range(983040, 1048576), - "Supplementary Private Use Area-B": range(1048576, 1114112), -} - - -UNICODE_SECONDARY_RANGE_KEYWORD: List[str] = [ - "Supplement", - "Extended", - "Extensions", - "Modifier", - "Marks", - "Punctuation", - "Symbols", - "Forms", - "Operators", - "Miscellaneous", - "Drawing", - "Block", - "Shapes", - "Supplemental", - "Tags", -] - -RE_POSSIBLE_ENCODING_INDICATION = re_compile( - r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", - IGNORECASE, -) - -IANA_NO_ALIASES = [ - "cp720", - "cp737", - "cp856", - "cp874", - "cp875", - "cp1006", - "koi8_r", - "koi8_t", - "koi8_u", -] - -IANA_SUPPORTED: List[str] = sorted( - filter( - lambda x: x.endswith("_codec") is False - and x not in {"rot_13", "tactis", "mbcs"}, - list(set(aliases.values())) + IANA_NO_ALIASES, - ) -) - -IANA_SUPPORTED_COUNT: int = len(IANA_SUPPORTED) - -# pre-computed code page that are similar using the function cp_similarity. -IANA_SUPPORTED_SIMILAR: Dict[str, List[str]] = { - "cp037": ["cp1026", "cp1140", "cp273", "cp500"], - "cp1026": ["cp037", "cp1140", "cp273", "cp500"], - "cp1125": ["cp866"], - "cp1140": ["cp037", "cp1026", "cp273", "cp500"], - "cp1250": ["iso8859_2"], - "cp1251": ["kz1048", "ptcp154"], - "cp1252": ["iso8859_15", "iso8859_9", "latin_1"], - "cp1253": ["iso8859_7"], - "cp1254": ["iso8859_15", "iso8859_9", "latin_1"], - "cp1257": ["iso8859_13"], - "cp273": ["cp037", "cp1026", "cp1140", "cp500"], - "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], - "cp500": ["cp037", "cp1026", "cp1140", "cp273"], - "cp850": ["cp437", "cp857", "cp858", "cp865"], - "cp857": ["cp850", "cp858", "cp865"], - "cp858": ["cp437", "cp850", "cp857", "cp865"], - "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], - "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], - "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], - "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], - "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], - "cp866": ["cp1125"], - "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], - "iso8859_11": ["tis_620"], - "iso8859_13": ["cp1257"], - "iso8859_14": [ - "iso8859_10", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_15": [ - "cp1252", - "cp1254", - "iso8859_10", - "iso8859_14", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_16": [ - "iso8859_14", - "iso8859_15", - "iso8859_2", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], - "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], - "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], - "iso8859_7": ["cp1253"], - "iso8859_9": [ - "cp1252", - "cp1254", - "cp1258", - "iso8859_10", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_4", - "latin_1", - ], - "kz1048": ["cp1251", "ptcp154"], - "latin_1": [ - "cp1252", - "cp1254", - "cp1258", - "iso8859_10", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_4", - "iso8859_9", - ], - "mac_iceland": ["mac_roman", "mac_turkish"], - "mac_roman": ["mac_iceland", "mac_turkish"], - "mac_turkish": ["mac_iceland", "mac_roman"], - "ptcp154": ["cp1251", "kz1048"], - "tis_620": ["iso8859_11"], -} - - -CHARDET_CORRESPONDENCE: Dict[str, str] = { - "iso2022_kr": "ISO-2022-KR", - "iso2022_jp": "ISO-2022-JP", - "euc_kr": "EUC-KR", - "tis_620": "TIS-620", - "utf_32": "UTF-32", - "euc_jp": "EUC-JP", - "koi8_r": "KOI8-R", - "iso8859_1": "ISO-8859-1", - "iso8859_2": "ISO-8859-2", - "iso8859_5": "ISO-8859-5", - "iso8859_6": "ISO-8859-6", - "iso8859_7": "ISO-8859-7", - "iso8859_8": "ISO-8859-8", - "utf_16": "UTF-16", - "cp855": "IBM855", - "mac_cyrillic": "MacCyrillic", - "gb2312": "GB2312", - "gb18030": "GB18030", - "cp932": "CP932", - "cp866": "IBM866", - "utf_8": "utf-8", - "utf_8_sig": "UTF-8-SIG", - "shift_jis": "SHIFT_JIS", - "big5": "Big5", - "cp1250": "windows-1250", - "cp1251": "windows-1251", - "cp1252": "Windows-1252", - "cp1253": "windows-1253", - "cp1255": "windows-1255", - "cp1256": "windows-1256", - "cp1254": "Windows-1254", - "cp949": "CP949", -} - - -COMMON_SAFE_ASCII_CHARACTERS: Set[str] = { - "<", - ">", - "=", - ":", - "/", - "&", - ";", - "{", - "}", - "[", - "]", - ",", - "|", - '"', - "-", -} - - -KO_NAMES: Set[str] = {"johab", "cp949", "euc_kr"} -ZH_NAMES: Set[str] = {"big5", "cp950", "big5hkscs", "hz"} - -# Logging LEVEL below DEBUG -TRACE: int = 5 - - -# Language label that contain the em dash "—" -# character are to be considered alternative seq to origin -FREQUENCIES: Dict[str, List[str]] = { - "English": [ - "e", - "a", - "t", - "i", - "o", - "n", - "s", - "r", - "h", - "l", - "d", - "c", - "u", - "m", - "f", - "p", - "g", - "w", - "y", - "b", - "v", - "k", - "x", - "j", - "z", - "q", - ], - "English—": [ - "e", - "a", - "t", - "i", - "o", - "n", - "s", - "r", - "h", - "l", - "d", - "c", - "m", - "u", - "f", - "p", - "g", - "w", - "b", - "y", - "v", - "k", - "j", - "x", - "z", - "q", - ], - "German": [ - "e", - "n", - "i", - "r", - "s", - "t", - "a", - "d", - "h", - "u", - "l", - "g", - "o", - "c", - "m", - "b", - "f", - "k", - "w", - "z", - "p", - "v", - "ü", - "ä", - "ö", - "j", - ], - "French": [ - "e", - "a", - "s", - "n", - "i", - "t", - "r", - "l", - "u", - "o", - "d", - "c", - "p", - "m", - "é", - "v", - "g", - "f", - "b", - "h", - "q", - "à", - "x", - "è", - "y", - "j", - ], - "Dutch": [ - "e", - "n", - "a", - "i", - "r", - "t", - "o", - "d", - "s", - "l", - "g", - "h", - "v", - "m", - "u", - "k", - "c", - "p", - "b", - "w", - "j", - "z", - "f", - "y", - "x", - "ë", - ], - "Italian": [ - "e", - "i", - "a", - "o", - "n", - "l", - "t", - "r", - "s", - "c", - "d", - "u", - "p", - "m", - "g", - "v", - "f", - "b", - "z", - "h", - "q", - "è", - "à", - "k", - "y", - "ò", - ], - "Polish": [ - "a", - "i", - "o", - "e", - "n", - "r", - "z", - "w", - "s", - "c", - "t", - "k", - "y", - "d", - "p", - "m", - "u", - "l", - "j", - "ł", - "g", - "b", - "h", - "ą", - "ę", - "ó", - ], - "Spanish": [ - "e", - "a", - "o", - "n", - "s", - "r", - "i", - "l", - "d", - "t", - "c", - "u", - "m", - "p", - "b", - "g", - "v", - "f", - "y", - "ó", - "h", - "q", - "í", - "j", - "z", - "á", - ], - "Russian": [ - "о", - "а", - "е", - "и", - "н", - "с", - "т", - "р", - "в", - "л", - "к", - "м", - "д", - "п", - "у", - "г", - "я", - "ы", - "з", - "б", - "й", - "ь", - "ч", - "х", - "ж", - "ц", - ], - # Jap-Kanji - "Japanese": [ - "人", - "一", - "大", - "亅", - "丁", - "丨", - "竹", - "笑", - "口", - "日", - "今", - "二", - "彳", - "行", - "十", - "土", - "丶", - "寸", - "寺", - "時", - "乙", - "丿", - "乂", - "气", - "気", - "冂", - "巾", - "亠", - "市", - "目", - "儿", - "見", - "八", - "小", - "凵", - "県", - "月", - "彐", - "門", - "間", - "木", - "東", - "山", - "出", - "本", - "中", - "刀", - "分", - "耳", - "又", - "取", - "最", - "言", - "田", - "心", - "思", - "刂", - "前", - "京", - "尹", - "事", - "生", - "厶", - "云", - "会", - "未", - "来", - "白", - "冫", - "楽", - "灬", - "馬", - "尸", - "尺", - "駅", - "明", - "耂", - "者", - "了", - "阝", - "都", - "高", - "卜", - "占", - "厂", - "广", - "店", - "子", - "申", - "奄", - "亻", - "俺", - "上", - "方", - "冖", - "学", - "衣", - "艮", - "食", - "自", - ], - # Jap-Katakana - "Japanese—": [ - "ー", - "ン", - "ス", - "・", - "ル", - "ト", - "リ", - "イ", - "ア", - "ラ", - "ッ", - "ク", - "ド", - "シ", - "レ", - "ジ", - "タ", - "フ", - "ロ", - "カ", - "テ", - "マ", - "ィ", - "グ", - "バ", - "ム", - "プ", - "オ", - "コ", - "デ", - "ニ", - "ウ", - "メ", - "サ", - "ビ", - "ナ", - "ブ", - "ャ", - "エ", - "ュ", - "チ", - "キ", - "ズ", - "ダ", - "パ", - "ミ", - "ェ", - "ョ", - "ハ", - "セ", - "ベ", - "ガ", - "モ", - "ツ", - "ネ", - "ボ", - "ソ", - "ノ", - "ァ", - "ヴ", - "ワ", - "ポ", - "ペ", - "ピ", - "ケ", - "ゴ", - "ギ", - "ザ", - "ホ", - "ゲ", - "ォ", - "ヤ", - "ヒ", - "ユ", - "ヨ", - "ヘ", - "ゼ", - "ヌ", - "ゥ", - "ゾ", - "ヶ", - "ヂ", - "ヲ", - "ヅ", - "ヵ", - "ヱ", - "ヰ", - "ヮ", - "ヽ", - "゠", - "ヾ", - "ヷ", - "ヿ", - "ヸ", - "ヹ", - "ヺ", - ], - # Jap-Hiragana - "Japanese——": [ - "の", - "に", - "る", - "た", - "と", - "は", - "し", - "い", - "を", - "で", - "て", - "が", - "な", - "れ", - "か", - "ら", - "さ", - "っ", - "り", - "す", - "あ", - "も", - "こ", - "ま", - "う", - "く", - "よ", - "き", - "ん", - "め", - "お", - "け", - "そ", - "つ", - "だ", - "や", - "え", - "ど", - "わ", - "ち", - "み", - "せ", - "じ", - "ば", - "へ", - "び", - "ず", - "ろ", - "ほ", - "げ", - "む", - "べ", - "ひ", - "ょ", - "ゆ", - "ぶ", - "ご", - "ゃ", - "ね", - "ふ", - "ぐ", - "ぎ", - "ぼ", - "ゅ", - "づ", - "ざ", - "ぞ", - "ぬ", - "ぜ", - "ぱ", - "ぽ", - "ぷ", - "ぴ", - "ぃ", - "ぁ", - "ぇ", - "ぺ", - "ゞ", - "ぢ", - "ぉ", - "ぅ", - "ゐ", - "ゝ", - "ゑ", - "゛", - "゜", - "ゎ", - "ゔ", - "゚", - "ゟ", - "゙", - "ゕ", - "ゖ", - ], - "Portuguese": [ - "a", - "e", - "o", - "s", - "i", - "r", - "d", - "n", - "t", - "m", - "u", - "c", - "l", - "p", - "g", - "v", - "b", - "f", - "h", - "ã", - "q", - "é", - "ç", - "á", - "z", - "í", - ], - "Swedish": [ - "e", - "a", - "n", - "r", - "t", - "s", - "i", - "l", - "d", - "o", - "m", - "k", - "g", - "v", - "h", - "f", - "u", - "p", - "ä", - "c", - "b", - "ö", - "å", - "y", - "j", - "x", - ], - "Chinese": [ - "的", - "一", - "是", - "不", - "了", - "在", - "人", - "有", - "我", - "他", - "这", - "个", - "们", - "中", - "来", - "上", - "大", - "为", - "和", - "国", - "地", - "到", - "以", - "说", - "时", - "要", - "就", - "出", - "会", - "可", - "也", - "你", - "对", - "生", - "能", - "而", - "子", - "那", - "得", - "于", - "着", - "下", - "自", - "之", - "年", - "过", - "发", - "后", - "作", - "里", - "用", - "道", - "行", - "所", - "然", - "家", - "种", - "事", - "成", - "方", - "多", - "经", - "么", - "去", - "法", - "学", - "如", - "都", - "同", - "现", - "当", - "没", - "动", - "面", - "起", - "看", - "定", - "天", - "分", - "还", - "进", - "好", - "小", - "部", - "其", - "些", - "主", - "样", - "理", - "心", - "她", - "本", - "前", - "开", - "但", - "因", - "只", - "从", - "想", - "实", - ], - "Ukrainian": [ - "о", - "а", - "н", - "і", - "и", - "р", - "в", - "т", - "е", - "с", - "к", - "л", - "у", - "д", - "м", - "п", - "з", - "я", - "ь", - "б", - "г", - "й", - "ч", - "х", - "ц", - "ї", - ], - "Norwegian": [ - "e", - "r", - "n", - "t", - "a", - "s", - "i", - "o", - "l", - "d", - "g", - "k", - "m", - "v", - "f", - "p", - "u", - "b", - "h", - "å", - "y", - "j", - "ø", - "c", - "æ", - "w", - ], - "Finnish": [ - "a", - "i", - "n", - "t", - "e", - "s", - "l", - "o", - "u", - "k", - "ä", - "m", - "r", - "v", - "j", - "h", - "p", - "y", - "d", - "ö", - "g", - "c", - "b", - "f", - "w", - "z", - ], - "Vietnamese": [ - "n", - "h", - "t", - "i", - "c", - "g", - "a", - "o", - "u", - "m", - "l", - "r", - "à", - "đ", - "s", - "e", - "v", - "p", - "b", - "y", - "ư", - "d", - "á", - "k", - "ộ", - "ế", - ], - "Czech": [ - "o", - "e", - "a", - "n", - "t", - "s", - "i", - "l", - "v", - "r", - "k", - "d", - "u", - "m", - "p", - "í", - "c", - "h", - "z", - "á", - "y", - "j", - "b", - "ě", - "é", - "ř", - ], - "Hungarian": [ - "e", - "a", - "t", - "l", - "s", - "n", - "k", - "r", - "i", - "o", - "z", - "á", - "é", - "g", - "m", - "b", - "y", - "v", - "d", - "h", - "u", - "p", - "j", - "ö", - "f", - "c", - ], - "Korean": [ - "이", - "다", - "에", - "의", - "는", - "로", - "하", - "을", - "가", - "고", - "지", - "서", - "한", - "은", - "기", - "으", - "년", - "대", - "사", - "시", - "를", - "리", - "도", - "인", - "스", - "일", - ], - "Indonesian": [ - "a", - "n", - "e", - "i", - "r", - "t", - "u", - "s", - "d", - "k", - "m", - "l", - "g", - "p", - "b", - "o", - "h", - "y", - "j", - "c", - "w", - "f", - "v", - "z", - "x", - "q", - ], - "Turkish": [ - "a", - "e", - "i", - "n", - "r", - "l", - "ı", - "k", - "d", - "t", - "s", - "m", - "y", - "u", - "o", - "b", - "ü", - "ş", - "v", - "g", - "z", - "h", - "c", - "p", - "ç", - "ğ", - ], - "Romanian": [ - "e", - "i", - "a", - "r", - "n", - "t", - "u", - "l", - "o", - "c", - "s", - "d", - "p", - "m", - "ă", - "f", - "v", - "î", - "g", - "b", - "ș", - "ț", - "z", - "h", - "â", - "j", - ], - "Farsi": [ - "ا", - "ی", - "ر", - "د", - "ن", - "ه", - "و", - "م", - "ت", - "ب", - "س", - "ل", - "ک", - "ش", - "ز", - "ف", - "گ", - "ع", - "خ", - "ق", - "ج", - "آ", - "پ", - "ح", - "ط", - "ص", - ], - "Arabic": [ - "ا", - "ل", - "ي", - "م", - "و", - "ن", - "ر", - "ت", - "ب", - "ة", - "ع", - "د", - "س", - "ف", - "ه", - "ك", - "ق", - "أ", - "ح", - "ج", - "ش", - "ط", - "ص", - "ى", - "خ", - "إ", - ], - "Danish": [ - "e", - "r", - "n", - "t", - "a", - "i", - "s", - "d", - "l", - "o", - "g", - "m", - "k", - "f", - "v", - "u", - "b", - "h", - "p", - "å", - "y", - "ø", - "æ", - "c", - "j", - "w", - ], - "Serbian": [ - "а", - "и", - "о", - "е", - "н", - "р", - "с", - "у", - "т", - "к", - "ј", - "в", - "д", - "м", - "п", - "л", - "г", - "з", - "б", - "a", - "i", - "e", - "o", - "n", - "ц", - "ш", - ], - "Lithuanian": [ - "i", - "a", - "s", - "o", - "r", - "e", - "t", - "n", - "u", - "k", - "m", - "l", - "p", - "v", - "d", - "j", - "g", - "ė", - "b", - "y", - "ų", - "š", - "ž", - "c", - "ą", - "į", - ], - "Slovene": [ - "e", - "a", - "i", - "o", - "n", - "r", - "s", - "l", - "t", - "j", - "v", - "k", - "d", - "p", - "m", - "u", - "z", - "b", - "g", - "h", - "č", - "c", - "š", - "ž", - "f", - "y", - ], - "Slovak": [ - "o", - "a", - "e", - "n", - "i", - "r", - "v", - "t", - "s", - "l", - "k", - "d", - "m", - "p", - "u", - "c", - "h", - "j", - "b", - "z", - "á", - "y", - "ý", - "í", - "č", - "é", - ], - "Hebrew": [ - "י", - "ו", - "ה", - "ל", - "ר", - "ב", - "ת", - "מ", - "א", - "ש", - "נ", - "ע", - "ם", - "ד", - "ק", - "ח", - "פ", - "ס", - "כ", - "ג", - "ט", - "צ", - "ן", - "ז", - "ך", - ], - "Bulgarian": [ - "а", - "и", - "о", - "е", - "н", - "т", - "р", - "с", - "в", - "л", - "к", - "д", - "п", - "м", - "з", - "г", - "я", - "ъ", - "у", - "б", - "ч", - "ц", - "й", - "ж", - "щ", - "х", - ], - "Croatian": [ - "a", - "i", - "o", - "e", - "n", - "r", - "j", - "s", - "t", - "u", - "k", - "l", - "v", - "d", - "m", - "p", - "g", - "z", - "b", - "c", - "č", - "h", - "š", - "ž", - "ć", - "f", - ], - "Hindi": [ - "क", - "र", - "स", - "न", - "त", - "म", - "ह", - "प", - "य", - "ल", - "व", - "ज", - "द", - "ग", - "ब", - "श", - "ट", - "अ", - "ए", - "थ", - "भ", - "ड", - "च", - "ध", - "ष", - "इ", - ], - "Estonian": [ - "a", - "i", - "e", - "s", - "t", - "l", - "u", - "n", - "o", - "k", - "r", - "d", - "m", - "v", - "g", - "p", - "j", - "h", - "ä", - "b", - "õ", - "ü", - "f", - "c", - "ö", - "y", - ], - "Thai": [ - "า", - "น", - "ร", - "อ", - "ก", - "เ", - "ง", - "ม", - "ย", - "ล", - "ว", - "ด", - "ท", - "ส", - "ต", - "ะ", - "ป", - "บ", - "ค", - "ห", - "แ", - "จ", - "พ", - "ช", - "ข", - "ใ", - ], - "Greek": [ - "α", - "τ", - "ο", - "ι", - "ε", - "ν", - "ρ", - "σ", - "κ", - "η", - "π", - "ς", - "υ", - "μ", - "λ", - "ί", - "ό", - "ά", - "γ", - "έ", - "δ", - "ή", - "ω", - "χ", - "θ", - "ύ", - ], - "Tamil": [ - "க", - "த", - "ப", - "ட", - "ர", - "ம", - "ல", - "ன", - "வ", - "ற", - "ய", - "ள", - "ச", - "ந", - "இ", - "ண", - "அ", - "ஆ", - "ழ", - "ங", - "எ", - "உ", - "ஒ", - "ஸ", - ], - "Kazakh": [ - "а", - "ы", - "е", - "н", - "т", - "р", - "л", - "і", - "д", - "с", - "м", - "қ", - "к", - "о", - "б", - "и", - "у", - "ғ", - "ж", - "ң", - "з", - "ш", - "й", - "п", - "г", - "ө", - ], -} - -LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES) diff --git a/.flatpak-builder/cache/objects/e3/f838019982b396cb8e386a80ad0a05fec4b76ef76da8911e2d5c042f519373.file b/.flatpak-builder/cache/objects/e3/f838019982b396cb8e386a80ad0a05fec4b76ef76da8911e2d5c042f519373.file deleted file mode 100755 index 62b1670769a4b21305e740d41d84b6f0c73bf609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475992 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

MzncZLT;UxoL`z4g@ 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

m+4Q*+T5gA$#%-SmwF2ya2BrYe0@^q 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 WlCosyl7VR5YOT!PEcX)HKETXAXz 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 BnjQcE diff --git a/.flatpak-builder/cache/objects/b3/573f53338ad0a6e9e14bd4aeccc3ba0b557a4b1a73a15a9739ebc2c99ef93a.file b/.flatpak-builder/cache/objects/b3/573f53338ad0a6e9e14bd4aeccc3ba0b557a4b1a73a15a9739ebc2c99ef93a.file deleted file mode 100644 index 125cfcb8c1956549bba6c74e6500a05a8a9adb53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16967 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 KzrTV}_2VB%KqyB5 diff --git a/.flatpak-builder/cache/objects/b3/fd2764a88557a28fdee20c3da6c6efa0b09621503bd525d384196085753803.file b/.flatpak-builder/cache/objects/b3/fd2764a88557a28fdee20c3da6c6efa0b09621503bd525d384196085753803.file deleted file mode 100644 index 0f331ff94355248a9ac0152338f2402294b1ccba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23106 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 D+Ja#& diff --git a/.flatpak-builder/cache/objects/b4/1ed4d371b826d7bafb83ae4754e6a77b649ec538dddcb2772711c02a041f68.dirtree b/.flatpak-builder/cache/objects/b4/1ed4d371b826d7bafb83ae4754e6a77b649ec538dddcb2772711c02a041f68.dirtree deleted file mode 100644 index e906ed5cc1a2ba071f048e71bc6f2bf3fe98f9b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47 zcmebAbawR%cGWAXC}FTX=5XVj==bT;^X6%I2xPa!7gYUst^Qv4A}vzv(Cy?qJi2-S D$U78J diff --git a/.flatpak-builder/cache/objects/b4/9c4c369be46f9d5086a2fd441dad2c00af2915cfb58bfe9b05362a9493485c.file b/.flatpak-builder/cache/objects/b4/9c4c369be46f9d5086a2fd441dad2c00af2915cfb58bfe9b05362a9493485c.file deleted file mode 100644 index a4b4d2a1679cbdfe042c31789312cb2e903365e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15453 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 diff --git a/.flatpak-builder/cache/objects/b5/1f18a25214df5e6d49f45d6b1df6d3a8e8cde4430af62d4c2da9328c484def.file b/.flatpak-builder/cache/objects/b5/1f18a25214df5e6d49f45d6b1df6d3a8e8cde4430af62d4c2da9328c484def.file deleted file mode 100644 index 8962c3bafa065ba116fe972a89f3643db82898a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12719 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 Ow_oA*OUb|%&;J8~>}S0I diff --git a/.flatpak-builder/cache/objects/b8/6df03d14fb9a4551f7e6dda3988978ca02aab584cd97b23e9ee96a965aedc8.file b/.flatpak-builder/cache/objects/b8/6df03d14fb9a4551f7e6dda3988978ca02aab584cd97b23e9ee96a965aedc8.file deleted file mode 100644 index 523ffcb..0000000 --- a/.flatpak-builder/cache/objects/b8/6df03d14fb9a4551f7e6dda3988978ca02aab584cd97b23e9ee96a965aedc8.file +++ /dev/null @@ -1,474 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# EPS file handling -# -# History: -# 1995-09-01 fl Created (0.1) -# 1996-05-18 fl Don't choke on "atend" fields, Ghostscript interface (0.2) -# 1996-08-22 fl Don't choke on floating point BoundingBox values -# 1996-08-23 fl Handle files from Macintosh (0.3) -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) -# 2003-09-07 fl Check gs.close status (from Federico Di Gregorio) (0.5) -# 2014-05-07 e Handling of EPS with binary preview and fixed resolution -# resizing -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import re -import subprocess -import sys -import tempfile - -from . import Image, ImageFile -from ._binary import i32le as i32 -from ._deprecate import deprecate - -# -------------------------------------------------------------------- - - -split = re.compile(r"^%%([^:]*):[ \t]*(.*)[ \t]*$") -field = re.compile(r"^%[%!\w]([^:]*)[ \t]*$") - -gs_binary: str | bool | None = None -gs_windows_binary = None - - -def has_ghostscript(): - global gs_binary, gs_windows_binary - if gs_binary is None: - if sys.platform.startswith("win"): - if gs_windows_binary is None: - import shutil - - for binary in ("gswin32c", "gswin64c", "gs"): - if shutil.which(binary) is not None: - gs_windows_binary = binary - break - else: - gs_windows_binary = False - gs_binary = gs_windows_binary - else: - try: - subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL) - gs_binary = "gs" - except OSError: - gs_binary = False - return gs_binary is not False - - -def Ghostscript(tile, size, fp, scale=1, transparency=False): - """Render an image using Ghostscript""" - global gs_binary - if not has_ghostscript(): - msg = "Unable to locate Ghostscript on paths" - raise OSError(msg) - - # Unpack decoder tile - decoder, tile, offset, data = tile[0] - length, bbox = data - - # Hack to support hi-res rendering - scale = int(scale) or 1 - width = size[0] * scale - height = size[1] * scale - # resolution is dependent on bbox and size - res_x = 72.0 * width / (bbox[2] - bbox[0]) - res_y = 72.0 * height / (bbox[3] - bbox[1]) - - out_fd, outfile = tempfile.mkstemp() - os.close(out_fd) - - infile_temp = None - if hasattr(fp, "name") and os.path.exists(fp.name): - infile = fp.name - else: - in_fd, infile_temp = tempfile.mkstemp() - os.close(in_fd) - infile = infile_temp - - # Ignore length and offset! - # Ghostscript can read it - # Copy whole file to read in Ghostscript - with open(infile_temp, "wb") as f: - # fetch length of fp - fp.seek(0, io.SEEK_END) - fsize = fp.tell() - # ensure start position - # go back - fp.seek(0) - lengthfile = fsize - while lengthfile > 0: - s = fp.read(min(lengthfile, 100 * 1024)) - if not s: - break - lengthfile -= len(s) - f.write(s) - - device = "pngalpha" if transparency else "ppmraw" - - # Build Ghostscript command - command = [ - gs_binary, - "-q", # quiet mode - f"-g{width:d}x{height:d}", # set output geometry (pixels) - f"-r{res_x:f}x{res_y:f}", # set input DPI (dots per inch) - "-dBATCH", # exit after processing - "-dNOPAUSE", # don't pause between pages - "-dSAFER", # safe mode - f"-sDEVICE={device}", - f"-sOutputFile={outfile}", # output file - # adjust for image origin - "-c", - f"{-bbox[0]} {-bbox[1]} translate", - "-f", - infile, # input file - # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) - "-c", - "showpage", - ] - - # push data through Ghostscript - try: - startupinfo = None - if sys.platform.startswith("win"): - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - subprocess.check_call(command, startupinfo=startupinfo) - out_im = Image.open(outfile) - out_im.load() - finally: - try: - os.unlink(outfile) - if infile_temp: - os.unlink(infile_temp) - except OSError: - pass - - im = out_im.im.copy() - out_im.close() - return im - - -class PSFile: - """ - Wrapper for bytesio object that treats either CR or LF as end of line. - This class is no longer used internally, but kept for backwards compatibility. - """ - - def __init__(self, fp): - deprecate( - "PSFile", - 11, - action="If you need the functionality of this class " - "you will need to implement it yourself.", - ) - self.fp = fp - self.char = None - - def seek(self, offset, whence=io.SEEK_SET): - self.char = None - self.fp.seek(offset, whence) - - def readline(self): - s = [self.char or b""] - self.char = None - - c = self.fp.read(1) - while (c not in b"\r\n") and len(c): - s.append(c) - c = self.fp.read(1) - - self.char = self.fp.read(1) - # line endings can be 1 or 2 of \r \n, in either order - if self.char in b"\r\n": - self.char = None - - return b"".join(s).decode("latin-1") - - -def _accept(prefix): - return prefix[:4] == b"%!PS" or (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5) - - -## -# Image plugin for Encapsulated PostScript. This plugin supports only -# a few variants of this format. - - -class EpsImageFile(ImageFile.ImageFile): - """EPS File Parser for the Python Imaging Library""" - - format = "EPS" - format_description = "Encapsulated Postscript" - - mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} - - def _open(self): - (length, offset) = self._find_offset(self.fp) - - # go to offset - start of "%!PS" - self.fp.seek(offset) - - self._mode = "RGB" - self._size = None - - byte_arr = bytearray(255) - bytes_mv = memoryview(byte_arr) - bytes_read = 0 - reading_header_comments = True - reading_trailer_comments = False - trailer_reached = False - - def check_required_header_comments(): - if "PS-Adobe" not in self.info: - msg = 'EPS header missing "%!PS-Adobe" comment' - raise SyntaxError(msg) - if "BoundingBox" not in self.info: - msg = 'EPS header missing "%%BoundingBox" comment' - raise SyntaxError(msg) - - def _read_comment(s): - nonlocal reading_trailer_comments - try: - m = split.match(s) - except re.error as e: - msg = "not an EPS file" - raise SyntaxError(msg) from e - - if m: - k, v = m.group(1, 2) - self.info[k] = v - if k == "BoundingBox": - if v == "(atend)": - reading_trailer_comments = True - elif not self._size or ( - trailer_reached and reading_trailer_comments - ): - try: - # Note: The DSC spec says that BoundingBox - # fields should be integers, but some drivers - # put floating point values there anyway. - box = [int(float(i)) for i in v.split()] - self._size = box[2] - box[0], box[3] - box[1] - self.tile = [ - ("eps", (0, 0) + self.size, offset, (length, box)) - ] - except Exception: - pass - return True - - while True: - byte = self.fp.read(1) - if byte == b"": - # if we didn't read a byte we must be at the end of the file - if bytes_read == 0: - break - elif byte in b"\r\n": - # if we read a line ending character, ignore it and parse what - # we have already read. if we haven't read any other characters, - # continue reading - if bytes_read == 0: - continue - else: - # ASCII/hexadecimal lines in an EPS file must not exceed - # 255 characters, not including line ending characters - if bytes_read >= 255: - # only enforce this for lines starting with a "%", - # otherwise assume it's binary data - if byte_arr[0] == ord("%"): - msg = "not an EPS file" - raise SyntaxError(msg) - else: - if reading_header_comments: - check_required_header_comments() - reading_header_comments = False - # reset bytes_read so we can keep reading - # data until the end of the line - bytes_read = 0 - byte_arr[bytes_read] = byte[0] - bytes_read += 1 - continue - - if reading_header_comments: - # Load EPS header - - # if this line doesn't start with a "%", - # or does start with "%%EndComments", - # then we've reached the end of the header/comments - if byte_arr[0] != ord("%") or bytes_mv[:13] == b"%%EndComments": - check_required_header_comments() - reading_header_comments = False - continue - - s = str(bytes_mv[:bytes_read], "latin-1") - if not _read_comment(s): - m = field.match(s) - if m: - k = m.group(1) - if k[:8] == "PS-Adobe": - self.info["PS-Adobe"] = k[9:] - else: - self.info[k] = "" - elif s[0] == "%": - # handle non-DSC PostScript comments that some - # tools mistakenly put in the Comments section - pass - else: - msg = "bad EPS header" - raise OSError(msg) - elif bytes_mv[:11] == b"%ImageData:": - # Check for an "ImageData" descriptor - # https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577413_pgfId-1035096 - - # Values: - # columns - # rows - # bit depth (1 or 8) - # mode (1: L, 2: LAB, 3: RGB, 4: CMYK) - # number of padding channels - # block size (number of bytes per row per channel) - # binary/ascii (1: binary, 2: ascii) - # data start identifier (the image data follows after a single line - # consisting only of this quoted value) - image_data_values = byte_arr[11:bytes_read].split(None, 7) - columns, rows, bit_depth, mode_id = ( - int(value) for value in image_data_values[:4] - ) - - if bit_depth == 1: - self._mode = "1" - elif bit_depth == 8: - try: - self._mode = self.mode_map[mode_id] - except ValueError: - break - else: - break - - self._size = columns, rows - return - elif bytes_mv[:5] == b"%%EOF": - break - elif trailer_reached and reading_trailer_comments: - # Load EPS trailer - s = str(bytes_mv[:bytes_read], "latin-1") - _read_comment(s) - elif bytes_mv[:9] == b"%%Trailer": - trailer_reached = True - bytes_read = 0 - - check_required_header_comments() - - if not self._size: - msg = "cannot determine EPS bounding box" - raise OSError(msg) - - def _find_offset(self, fp): - s = fp.read(4) - - if s == b"%!PS": - # for HEAD without binary preview - fp.seek(0, io.SEEK_END) - length = fp.tell() - offset = 0 - elif i32(s) == 0xC6D3D0C5: - # FIX for: Some EPS file not handled correctly / issue #302 - # EPS can contain binary data - # or start directly with latin coding - # more info see: - # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf - s = fp.read(8) - offset = i32(s) - length = i32(s, 4) - else: - msg = "not an EPS file" - raise SyntaxError(msg) - - return length, offset - - def load(self, scale=1, transparency=False): - # Load EPS via Ghostscript - if self.tile: - self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency) - self._mode = self.im.mode - self._size = self.im.size - self.tile = [] - return Image.Image.load(self) - - def load_seek(self, pos): - # we can't incrementally load, so force ImageFile.parser to - # use our custom load method by defining this method. - pass - - -# -------------------------------------------------------------------- - - -def _save(im, fp, filename, eps=1): - """EPS Writer for the Python Imaging Library.""" - - # make sure image data is available - im.load() - - # determine PostScript image mode - if im.mode == "L": - operator = (8, 1, b"image") - elif im.mode == "RGB": - operator = (8, 3, b"false 3 colorimage") - elif im.mode == "CMYK": - operator = (8, 4, b"false 4 colorimage") - else: - msg = "image mode is not supported" - raise ValueError(msg) - - if eps: - # write EPS header - fp.write(b"%!PS-Adobe-3.0 EPSF-3.0\n") - fp.write(b"%%Creator: PIL 0.1 EpsEncode\n") - # fp.write("%%CreationDate: %s"...) - fp.write(b"%%%%BoundingBox: 0 0 %d %d\n" % im.size) - fp.write(b"%%Pages: 1\n") - fp.write(b"%%EndComments\n") - fp.write(b"%%Page: 1 1\n") - fp.write(b"%%ImageData: %d %d " % im.size) - fp.write(b'%d %d 0 1 1 "%s"\n' % operator) - - # image header - fp.write(b"gsave\n") - fp.write(b"10 dict begin\n") - fp.write(b"/buf %d string def\n" % (im.size[0] * operator[1])) - fp.write(b"%d %d scale\n" % im.size) - fp.write(b"%d %d 8\n" % im.size) # <= bits - fp.write(b"[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) - fp.write(b"{ currentfile buf readhexstring pop } bind\n") - fp.write(operator[2] + b"\n") - if hasattr(fp, "flush"): - fp.flush() - - ImageFile._save(im, fp, [("eps", (0, 0) + im.size, 0, None)]) - - fp.write(b"\n%%%%EndBinary\n") - fp.write(b"grestore end\n") - if hasattr(fp, "flush"): - fp.flush() - - -# -------------------------------------------------------------------- - - -Image.register_open(EpsImageFile.format, EpsImageFile, _accept) - -Image.register_save(EpsImageFile.format, _save) - -Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) - -Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/.flatpak-builder/cache/objects/b8/e8cc6fb45053be3a4b9ff5fcb6e4da6fd3b91d11cd88b0dc78362f43e554b3.file b/.flatpak-builder/cache/objects/b8/e8cc6fb45053be3a4b9ff5fcb6e4da6fd3b91d11cd88b0dc78362f43e554b3.file deleted file mode 100644 index 5341260..0000000 --- a/.flatpak-builder/cache/objects/b8/e8cc6fb45053be3a4b9ff5fcb6e4da6fd3b91d11cd88b0dc78362f43e554b3.file +++ /dev/null @@ -1,42 +0,0 @@ -# For backwards compatibility, provide imports that used to be here. -from __future__ import annotations - -from .connection import is_connection_dropped -from .request import SKIP_HEADER, SKIPPABLE_HEADERS, make_headers -from .response import is_fp_closed -from .retry import Retry -from .ssl_ import ( - ALPN_PROTOCOLS, - IS_PYOPENSSL, - SSLContext, - assert_fingerprint, - create_urllib3_context, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, -) -from .timeout import Timeout -from .url import Url, parse_url -from .wait import wait_for_read, wait_for_write - -__all__ = ( - "IS_PYOPENSSL", - "SSLContext", - "ALPN_PROTOCOLS", - "Retry", - "Timeout", - "Url", - "assert_fingerprint", - "create_urllib3_context", - "is_connection_dropped", - "is_fp_closed", - "parse_url", - "make_headers", - "resolve_cert_reqs", - "resolve_ssl_version", - "ssl_wrap_socket", - "wait_for_read", - "wait_for_write", - "SKIP_HEADER", - "SKIPPABLE_HEADERS", -) diff --git a/.flatpak-builder/cache/objects/b9/b3c62dc9293df049a6b6c6c5369ac410974f0025d47b7b3b5dca10b8c05c51.file b/.flatpak-builder/cache/objects/b9/b3c62dc9293df049a6b6c6c5369ac410974f0025d47b7b3b5dca10b8c05c51.file deleted file mode 100644 index 9e556167ab31e1e73ce36c1bcb1443742b4da6f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 zcmZ3^%ge>gz`(Gr!lzE9?HI>nAR7*tpsdeIK*n^26owSW9EM!RD8^i-C?-aR6s8pB zbfzfg6qYEK6xLt{O}3YeK!uu2w>XmX^GZ_lN{Vl>mS?0Er51s#C}IH;Ra`~}Mkaa& zMnL4J$$E<=IUia27JGbrVopwc{4MVI__EZZ;>`TK`1q9!pMhE#ewpeg78K~`WG3ks zRF-7q=Nao68tNBkmZa(yBqnDkrl%I`C#M#bWTs{6$H!;pWtPOp>lIY~;;_lhPbtkw wwJYKVngViSu>p|yz|6?Vc!NRl0ygx3TXaJC1uppp_8WXs4cs7D#0k^{05SSc+W-In diff --git a/.flatpak-builder/cache/objects/ba/4e11441ae52c0377cfd226f0a87bae9f6ab0fc498af3cb9c3a9f9a6f66fe39.file b/.flatpak-builder/cache/objects/ba/4e11441ae52c0377cfd226f0a87bae9f6ab0fc498af3cb9c3a9f9a6f66fe39.file deleted file mode 100644 index dd4894d43f098ff897f93e489a06a4f9f11588d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54815 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 Y(cq{iGdZ16D}Aw+h5huBRMF7=102_7w*UYD diff --git a/.flatpak-builder/cache/objects/ba/91b85fe7983c51e0c05ea1e103158b339bc1d3fd62d5dc189a1a7227871a1c.file b/.flatpak-builder/cache/objects/ba/91b85fe7983c51e0c05ea1e103158b339bc1d3fd62d5dc189a1a7227871a1c.file deleted file mode 100644 index 77472a2..0000000 --- a/.flatpak-builder/cache/objects/ba/91b85fe7983c51e0c05ea1e103158b339bc1d3fd62d5dc189a1a7227871a1c.file +++ /dev/null @@ -1,357 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# a simple math add-on for the Python Imaging Library -# -# History: -# 1999-02-15 fl Original PIL Plus release -# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 -# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 -# -# Copyright (c) 1999-2005 by Secret Labs AB -# Copyright (c) 2005 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import builtins -from types import CodeType -from typing import Any, Callable - -from . import Image, _imagingmath -from ._deprecate import deprecate - - -class _Operand: - """Wraps an image operand, providing standard operators""" - - def __init__(self, im: Image.Image): - self.im = im - - def __fixup(self, im1: _Operand | float) -> Image.Image: - # convert image to suitable mode - if isinstance(im1, _Operand): - # argument was an image. - if im1.im.mode in ("1", "L"): - return im1.im.convert("I") - elif im1.im.mode in ("I", "F"): - return im1.im - else: - msg = f"unsupported mode: {im1.im.mode}" - raise ValueError(msg) - else: - # argument was a constant - if isinstance(im1, (int, float)) and self.im.mode in ("1", "L", "I"): - return Image.new("I", self.im.size, im1) - else: - return Image.new("F", self.im.size, im1) - - def apply( - self, - op: str, - im1: _Operand | float, - im2: _Operand | float | None = None, - mode: str | None = None, - ) -> _Operand: - im_1 = self.__fixup(im1) - if im2 is None: - # unary operation - out = Image.new(mode or im_1.mode, im_1.size, None) - im_1.load() - try: - op = getattr(_imagingmath, op + "_" + im_1.mode) - except AttributeError as e: - msg = f"bad operand type for '{op}'" - raise TypeError(msg) from e - _imagingmath.unop(op, out.im.id, im_1.im.id) - else: - # binary operation - im_2 = self.__fixup(im2) - if im_1.mode != im_2.mode: - # convert both arguments to floating point - if im_1.mode != "F": - im_1 = im_1.convert("F") - if im_2.mode != "F": - im_2 = im_2.convert("F") - if im_1.size != im_2.size: - # crop both arguments to a common size - size = ( - min(im_1.size[0], im_2.size[0]), - min(im_1.size[1], im_2.size[1]), - ) - if im_1.size != size: - im_1 = im_1.crop((0, 0) + size) - if im_2.size != size: - im_2 = im_2.crop((0, 0) + size) - out = Image.new(mode or im_1.mode, im_1.size, None) - im_1.load() - im_2.load() - try: - op = getattr(_imagingmath, op + "_" + im_1.mode) - except AttributeError as e: - msg = f"bad operand type for '{op}'" - raise TypeError(msg) from e - _imagingmath.binop(op, out.im.id, im_1.im.id, im_2.im.id) - return _Operand(out) - - # unary operators - def __bool__(self) -> bool: - # an image is "true" if it contains at least one non-zero pixel - return self.im.getbbox() is not None - - def __abs__(self) -> _Operand: - return self.apply("abs", self) - - def __pos__(self) -> _Operand: - return self - - def __neg__(self) -> _Operand: - return self.apply("neg", self) - - # binary operators - def __add__(self, other: _Operand | float) -> _Operand: - return self.apply("add", self, other) - - def __radd__(self, other: _Operand | float) -> _Operand: - return self.apply("add", other, self) - - def __sub__(self, other: _Operand | float) -> _Operand: - return self.apply("sub", self, other) - - def __rsub__(self, other: _Operand | float) -> _Operand: - return self.apply("sub", other, self) - - def __mul__(self, other: _Operand | float) -> _Operand: - return self.apply("mul", self, other) - - def __rmul__(self, other: _Operand | float) -> _Operand: - return self.apply("mul", other, self) - - def __truediv__(self, other: _Operand | float) -> _Operand: - return self.apply("div", self, other) - - def __rtruediv__(self, other: _Operand | float) -> _Operand: - return self.apply("div", other, self) - - def __mod__(self, other: _Operand | float) -> _Operand: - return self.apply("mod", self, other) - - def __rmod__(self, other: _Operand | float) -> _Operand: - return self.apply("mod", other, self) - - def __pow__(self, other: _Operand | float) -> _Operand: - return self.apply("pow", self, other) - - def __rpow__(self, other: _Operand | float) -> _Operand: - return self.apply("pow", other, self) - - # bitwise - def __invert__(self) -> _Operand: - return self.apply("invert", self) - - def __and__(self, other: _Operand | float) -> _Operand: - return self.apply("and", self, other) - - def __rand__(self, other: _Operand | float) -> _Operand: - return self.apply("and", other, self) - - def __or__(self, other: _Operand | float) -> _Operand: - return self.apply("or", self, other) - - def __ror__(self, other: _Operand | float) -> _Operand: - return self.apply("or", other, self) - - def __xor__(self, other: _Operand | float) -> _Operand: - return self.apply("xor", self, other) - - def __rxor__(self, other: _Operand | float) -> _Operand: - return self.apply("xor", other, self) - - def __lshift__(self, other: _Operand | float) -> _Operand: - return self.apply("lshift", self, other) - - def __rshift__(self, other: _Operand | float) -> _Operand: - return self.apply("rshift", self, other) - - # logical - def __eq__(self, other): - return self.apply("eq", self, other) - - def __ne__(self, other): - return self.apply("ne", self, other) - - def __lt__(self, other: _Operand | float) -> _Operand: - return self.apply("lt", self, other) - - def __le__(self, other: _Operand | float) -> _Operand: - return self.apply("le", self, other) - - def __gt__(self, other: _Operand | float) -> _Operand: - return self.apply("gt", self, other) - - def __ge__(self, other: _Operand | float) -> _Operand: - return self.apply("ge", self, other) - - -# conversions -def imagemath_int(self: _Operand) -> _Operand: - return _Operand(self.im.convert("I")) - - -def imagemath_float(self: _Operand) -> _Operand: - return _Operand(self.im.convert("F")) - - -# logical -def imagemath_equal(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("eq", self, other, mode="I") - - -def imagemath_notequal(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("ne", self, other, mode="I") - - -def imagemath_min(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("min", self, other) - - -def imagemath_max(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("max", self, other) - - -def imagemath_convert(self: _Operand, mode: str) -> _Operand: - return _Operand(self.im.convert(mode)) - - -ops = { - "int": imagemath_int, - "float": imagemath_float, - "equal": imagemath_equal, - "notequal": imagemath_notequal, - "min": imagemath_min, - "max": imagemath_max, - "convert": imagemath_convert, -} - - -def lambda_eval( - expression: Callable[[dict[str, Any]], Any], - options: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Returns the result of an image function. - - :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band - images, use the :py:meth:`~PIL.Image.Image.split` method or - :py:func:`~PIL.Image.merge` function. - - :param expression: A function that receives a dictionary. - :param options: Values to add to the function's dictionary. You - can either use a dictionary, or one or more keyword - arguments. - :return: The expression result. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - """ - - args: dict[str, Any] = ops.copy() - args.update(options) - args.update(kw) - for k, v in args.items(): - if hasattr(v, "im"): - args[k] = _Operand(v) - - out = expression(args) - try: - return out.im - except AttributeError: - return out - - -def unsafe_eval( - expression: str, - options: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Evaluates an image expression. This uses Python's ``eval()`` function to process - the expression string, and carries the security risks of doing so. It is not - recommended to process expressions without considering this. - :py:meth:`~lambda_eval` is a more secure alternative. - - :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band - images, use the :py:meth:`~PIL.Image.Image.split` method or - :py:func:`~PIL.Image.merge` function. - - :param expression: A string containing a Python-style expression. - :param options: Values to add to the evaluation context. You - can either use a dictionary, or one or more keyword - arguments. - :return: The evaluated expression. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - """ - - # build execution namespace - args: dict[str, Any] = ops.copy() - for k in list(options.keys()) + list(kw.keys()): - if "__" in k or hasattr(builtins, k): - msg = f"'{k}' not allowed" - raise ValueError(msg) - - args.update(options) - args.update(kw) - for k, v in args.items(): - if hasattr(v, "im"): - args[k] = _Operand(v) - - compiled_code = compile(expression, "", "eval") - - def scan(code: CodeType) -> None: - for const in code.co_consts: - if type(const) is type(compiled_code): - scan(const) - - for name in code.co_names: - if name not in args and name != "abs": - msg = f"'{name}' not allowed" - raise ValueError(msg) - - scan(compiled_code) - out = builtins.eval(expression, {"__builtins": {"abs": abs}}, args) - try: - return out.im - except AttributeError: - return out - - -def eval( - expression: str, - _dict: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Evaluates an image expression. - - Deprecated. Use lambda_eval() or unsafe_eval() instead. - - :param expression: A string containing a Python-style expression. - :param _dict: Values to add to the evaluation context. You - can either use a dictionary, or one or more keyword - arguments. - :return: The evaluated expression. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - - .. deprecated:: 10.3.0 - """ - - deprecate( - "ImageMath.eval", - 12, - "ImageMath.lambda_eval or ImageMath.unsafe_eval", - ) - return unsafe_eval(expression, _dict, **kw) diff --git a/.flatpak-builder/cache/objects/bb/c7aa8e50951792b0160c03504197b9aa9fef4f295d1a8ec28f7a77c37da788.file b/.flatpak-builder/cache/objects/bb/c7aa8e50951792b0160c03504197b9aa9fef4f295d1a8ec28f7a77c37da788.file deleted file mode 100644 index d09a88d4c4a7d4e5b17bbd2fa3cb7f4d9b9c25bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6264 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 diff --git a/.flatpak-builder/cache/objects/bb/cfc1ace0cfc9f62b1122e95ecb3047f0f3beac013bb9638fcb95820fbbbe1b.file b/.flatpak-builder/cache/objects/bb/cfc1ace0cfc9f62b1122e95ecb3047f0f3beac013bb9638fcb95820fbbbe1b.file deleted file mode 100644 index b28f6ec..0000000 --- a/.flatpak-builder/cache/objects/bb/cfc1ace0cfc9f62b1122e95ecb3047f0f3beac013bb9638fcb95820fbbbe1b.file +++ /dev/null @@ -1,243 +0,0 @@ -Metadata-Version: 2.1 -Name: idna -Version: 3.7 -Summary: Internationalized Domain Names in Applications (IDNA) -Author-email: Kim Davies -Requires-Python: >=3.5 -Description-Content-Type: text/x-rst -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: Name Service (DNS) -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Utilities -Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst -Project-URL: Issue tracker, https://github.com/kjd/idna/issues -Project-URL: Source, https://github.com/kjd/idna - -Internationalized Domain Names in Applications (IDNA) -===================================================== - -Support for the Internationalized Domain Names in -Applications (IDNA) protocol as specified in `RFC 5891 -`_. This is the latest version of -the protocol and is sometimes referred to as “IDNA 2008”. - -This library also provides support for Unicode Technical -Standard 46, `Unicode IDNA Compatibility Processing -`_. - -This acts as a suitable replacement for the “encodings.idna” -module that comes with the Python standard library, but which -only supports the older superseded IDNA specification (`RFC 3490 -`_). - -Basic functions are simply executed: - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - - -Installation ------------- - -This package is available for installation from PyPI: - -.. code-block:: bash - - $ python3 -m pip install idna - - -Usage ------ - -For typical usage, the ``encode`` and ``decode`` functions will take a -domain name argument and perform a conversion to A-labels or U-labels -respectively. - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - -You may use the codec encoding and decoding methods using the -``idna.codec`` module: - -.. code-block:: pycon - - >>> import idna.codec - >>> print('домен.испытание'.encode('idna2008')) - b'xn--d1acufc.xn--80akhbyknj4f' - >>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna2008')) - домен.испытание - -Conversions can be applied at a per-label basis using the ``ulabel`` or -``alabel`` functions if necessary: - -.. code-block:: pycon - - >>> idna.alabel('测试') - b'xn--0zwm56d' - -Compatibility Mapping (UTS #46) -+++++++++++++++++++++++++++++++ - -As described in `RFC 5895 `_, the -IDNA specification does not normalize input from different potential -ways a user may input a domain name. This functionality, known as -a “mapping”, is considered by the specification to be a local -user-interface issue distinct from IDNA conversion functionality. - -This library provides one such mapping that was developed by the -Unicode Consortium. Known as `Unicode IDNA Compatibility Processing -`_, it provides for both a regular -mapping for typical applications, as well as a transitional mapping to -help migrate from older IDNA 2003 applications. - -For example, “Königsgäßchen” is not a permissible label as *LATIN -CAPITAL LETTER K* is not allowed (nor are capital letters in general). -UTS 46 will convert this into lower case prior to applying the IDNA -conversion. - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('Königsgäßchen') - ... - idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed - >>> idna.encode('Königsgäßchen', uts46=True) - b'xn--knigsgchen-b4a3dun' - >>> print(idna.decode('xn--knigsgchen-b4a3dun')) - königsgäßchen - -Transitional processing provides conversions to help transition from -the older 2003 standard to the current standard. For example, in the -original IDNA specification, the *LATIN SMALL LETTER SHARP S* (ß) was -converted into two *LATIN SMALL LETTER S* (ss), whereas in the current -IDNA specification this conversion is not performed. - -.. code-block:: pycon - - >>> idna.encode('Königsgäßchen', uts46=True, transitional=True) - 'xn--knigsgsschen-lcb0w' - -Implementers should use transitional processing with caution, only in -rare cases where conversion from legacy labels to current labels must be -performed (i.e. IDNA implementations that pre-date 2008). For typical -applications that just need to convert labels, transitional processing -is unlikely to be beneficial and could produce unexpected incompatible -results. - -``encodings.idna`` Compatibility -++++++++++++++++++++++++++++++++ - -Function calls from the Python built-in ``encodings.idna`` module are -mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. -Simply substitute the ``import`` clause in your code to refer to the new -module name. - -Exceptions ----------- - -All errors raised during the conversion following the specification -should raise an exception derived from the ``idna.IDNAError`` base -class. - -More specific exceptions that may be generated as ``idna.IDNABidiError`` -when the error reflects an illegal combination of left-to-right and -right-to-left characters in a label; ``idna.InvalidCodepoint`` when -a specific codepoint is an illegal character in an IDN label (i.e. -INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is -illegal based on its positional context (i.e. it is CONTEXTO or CONTEXTJ -but the contextual requirements are not satisfied.) - -Building and Diagnostics ------------------------- - -The IDNA and UTS 46 functionality relies upon pre-calculated lookup -tables for performance. These tables are derived from computing against -eligibility criteria in the respective standards. These tables are -computed using the command-line script ``tools/idna-data``. - -This tool will fetch relevant codepoint data from the Unicode repository -and perform the required calculations to identify eligibility. There are -three main modes: - -* ``idna-data make-libdata``. Generates ``idnadata.py`` and - ``uts46data.py``, the pre-calculated lookup tables used for IDNA and - UTS 46 conversions. Implementers who wish to track this library against - a different Unicode version may use this tool to manually generate a - different version of the ``idnadata.py`` and ``uts46data.py`` files. - -* ``idna-data make-table``. Generate a table of the IDNA disposition - (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix - B.1 of RFC 5892 and the pre-computed tables published by `IANA - `_. - -* ``idna-data U+0061``. Prints debugging output on the various - properties associated with an individual Unicode codepoint (in this - case, U+0061), that are used to assess the IDNA and UTS 46 status of a - codepoint. This is helpful in debugging or analysis. - -The tool accepts a number of arguments, described using ``idna-data --h``. Most notably, the ``--version`` argument allows the specification -of the version of Unicode to be used in computing the table data. For -example, ``idna-data --version 9.0.0 make-libdata`` will generate -library data against Unicode 9.0.0. - - -Additional Notes ----------------- - -* **Packages**. The latest tagged release version is published in the - `Python Package Index `_. - -* **Version support**. This library supports Python 3.5 and higher. - As this library serves as a low-level toolkit for a variety of - applications, many of which strive for broad compatibility with older - Python versions, there is no rush to remove older interpreter support. - Removing support for older versions should be well justified in that the - maintenance burden has become too high. - -* **Python 2**. Python 2 is supported by version 2.x of this library. - While active development of the version 2.x series has ended, notable - issues being corrected may be backported to 2.x. Use "idna<3" in your - requirements file if you need this library for a Python 2 application. - -* **Testing**. The library has a test suite based on each rule of the - IDNA specification, as well as tests that are provided as part of the - Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing - `_. - -* **Emoji**. It is an occasional request to support emoji domains in - this library. Encoding of symbols like emoji is expressly prohibited by - the technical standard IDNA 2008 and emoji domains are broadly phased - out across the domain industry due to associated security risks. For - now, applications that need to support these non-compliant labels - may wish to consider trying the encode/decode operation in this library - first, and then falling back to using `encodings.idna`. See `the Github - project `_ for more discussion. - diff --git a/.flatpak-builder/cache/objects/bc/91d420d3e7978bd81dcb15f30d7f558fafbaedc0713633f402729139d6abf1.file b/.flatpak-builder/cache/objects/bc/91d420d3e7978bd81dcb15f30d7f558fafbaedc0713633f402729139d6abf1.file deleted file mode 100644 index 3055a7c74f330b4895d6f606268c1103481b77d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7645 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 DY0PK> diff --git a/.flatpak-builder/cache/objects/bc/a7254a3e0d33bc46b3d2521f9d9b8b2f46542f706d7d443b5dae002c69922a.file b/.flatpak-builder/cache/objects/bc/a7254a3e0d33bc46b3d2521f9d9b8b2f46542f706d7d443b5dae002c69922a.file deleted file mode 100644 index 095cf3c..0000000 --- a/.flatpak-builder/cache/objects/bc/a7254a3e0d33bc46b3d2521f9d9b8b2f46542f706d7d443b5dae002c69922a.file +++ /dev/null @@ -1,4 +0,0 @@ -# This file is protected via CODEOWNERS -from __future__ import annotations - -__version__ = "2.2.1" diff --git a/.flatpak-builder/cache/objects/bc/b02f0c5d1848ac2ab4e1081c8f1a79e83ba21d762976bb76bedd14bac46b6a.file b/.flatpak-builder/cache/objects/bc/b02f0c5d1848ac2ab4e1081c8f1a79e83ba21d762976bb76bedd14bac46b6a.file deleted file mode 100644 index 86582fb..0000000 --- a/.flatpak-builder/cache/objects/bc/b02f0c5d1848ac2ab4e1081c8f1a79e83ba21d762976bb76bedd14bac46b6a.file +++ /dev/null @@ -1,318 +0,0 @@ -# -# The Python Imaging Library. -# -# SPIDER image file handling -# -# History: -# 2004-08-02 Created BB -# 2006-03-02 added save method -# 2006-03-13 added support for stack images -# -# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. -# Copyright (c) 2004 by William Baxter. -# Copyright (c) 2004 by Secret Labs AB. -# Copyright (c) 2004 by Fredrik Lundh. -# - -## -# Image plugin for the Spider image format. This format is used -# by the SPIDER software, in processing image data from electron -# microscopy and tomography. -## - -# -# SpiderImagePlugin.py -# -# The Spider image format is used by SPIDER software, in processing -# image data from electron microscopy and tomography. -# -# Spider home page: -# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html -# -# Details about the Spider image format: -# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html -# -from __future__ import annotations - -import os -import struct -import sys - -from . import Image, ImageFile - - -def isInt(f): - try: - i = int(f) - if f - i == 0: - return 1 - else: - return 0 - except (ValueError, OverflowError): - return 0 - - -iforms = [1, 3, -11, -12, -21, -22] - - -# There is no magic number to identify Spider files, so just check a -# series of header locations to see if they have reasonable values. -# Returns no. of bytes in the header, if it is a valid Spider header, -# otherwise returns 0 - - -def isSpiderHeader(t): - h = (99,) + t # add 1 value so can use spider header index start=1 - # header values 1,2,5,12,13,22,23 should be integers - for i in [1, 2, 5, 12, 13, 22, 23]: - if not isInt(h[i]): - return 0 - # check iform - iform = int(h[5]) - if iform not in iforms: - return 0 - # check other header values - labrec = int(h[13]) # no. records in file header - labbyt = int(h[22]) # total no. of bytes in header - lenbyt = int(h[23]) # record length in bytes - if labbyt != (labrec * lenbyt): - return 0 - # looks like a valid header - return labbyt - - -def isSpiderImage(filename): - with open(filename, "rb") as fp: - f = fp.read(92) # read 23 * 4 bytes - t = struct.unpack(">23f", f) # try big-endian first - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - t = struct.unpack("<23f", f) # little-endian - hdrlen = isSpiderHeader(t) - return hdrlen - - -class SpiderImageFile(ImageFile.ImageFile): - format = "SPIDER" - format_description = "Spider 2D image" - _close_exclusive_fp_after_loading = False - - def _open(self): - # check header - n = 27 * 4 # read 27 float values - f = self.fp.read(n) - - try: - self.bigendian = 1 - t = struct.unpack(">27f", f) # try big-endian first - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - self.bigendian = 0 - t = struct.unpack("<27f", f) # little-endian - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - msg = "not a valid Spider file" - raise SyntaxError(msg) - except struct.error as e: - msg = "not a valid Spider file" - raise SyntaxError(msg) from e - - h = (99,) + t # add 1 value : spider header index starts at 1 - iform = int(h[5]) - if iform != 1: - msg = "not a Spider 2D image" - raise SyntaxError(msg) - - self._size = int(h[12]), int(h[2]) # size in pixels (width, height) - self.istack = int(h[24]) - self.imgnumber = int(h[27]) - - if self.istack == 0 and self.imgnumber == 0: - # stk=0, img=0: a regular 2D image - offset = hdrlen - self._nimages = 1 - elif self.istack > 0 and self.imgnumber == 0: - # stk>0, img=0: Opening the stack for the first time - self.imgbytes = int(h[12]) * int(h[2]) * 4 - self.hdrlen = hdrlen - self._nimages = int(h[26]) - # Point to the first image in the stack - offset = hdrlen * 2 - self.imgnumber = 1 - elif self.istack == 0 and self.imgnumber > 0: - # stk=0, img>0: an image within the stack - offset = hdrlen + self.stkoffset - self.istack = 2 # So Image knows it's still a stack - else: - msg = "inconsistent stack header values" - raise SyntaxError(msg) - - if self.bigendian: - self.rawmode = "F;32BF" - else: - self.rawmode = "F;32F" - self._mode = "F" - - self.tile = [("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1))] - self._fp = self.fp # FIXME: hack - - @property - def n_frames(self): - return self._nimages - - @property - def is_animated(self): - return self._nimages > 1 - - # 1st image index is zero (although SPIDER imgnumber starts at 1) - def tell(self): - if self.imgnumber < 1: - return 0 - else: - return self.imgnumber - 1 - - def seek(self, frame): - if self.istack == 0: - msg = "attempt to seek in a non-stack file" - raise EOFError(msg) - if not self._seek_check(frame): - return - self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) - self.fp = self._fp - self.fp.seek(self.stkoffset) - self._open() - - # returns a byte image after rescaling to 0..255 - def convert2byte(self, depth=255): - (minimum, maximum) = self.getextrema() - m = 1 - if maximum != minimum: - m = depth / (maximum - minimum) - b = -m * minimum - return self.point(lambda i, m=m, b=b: i * m + b).convert("L") - - # returns a ImageTk.PhotoImage object, after rescaling to 0..255 - def tkPhotoImage(self): - from . import ImageTk - - return ImageTk.PhotoImage(self.convert2byte(), palette=256) - - -# -------------------------------------------------------------------- -# Image series - - -# given a list of filenames, return a list of images -def loadImageSeries(filelist=None): - """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage""" - if filelist is None or len(filelist) < 1: - return - - imglist = [] - for img in filelist: - if not os.path.exists(img): - print(f"unable to find {img}") - continue - try: - with Image.open(img) as im: - im = im.convert2byte() - except Exception: - if not isSpiderImage(img): - print(img + " is not a Spider image file") - continue - im.info["filename"] = img - imglist.append(im) - return imglist - - -# -------------------------------------------------------------------- -# For saving images in Spider format - - -def makeSpiderHeader(im): - nsam, nrow = im.size - lenbyt = nsam * 4 # There are labrec records in the header - labrec = int(1024 / lenbyt) - if 1024 % lenbyt != 0: - labrec += 1 - labbyt = labrec * lenbyt - nvalues = int(labbyt / 4) - if nvalues < 23: - return [] - - hdr = [0.0] * nvalues - - # NB these are Fortran indices - hdr[1] = 1.0 # nslice (=1 for an image) - hdr[2] = float(nrow) # number of rows per slice - hdr[3] = float(nrow) # number of records in the image - hdr[5] = 1.0 # iform for 2D image - hdr[12] = float(nsam) # number of pixels per line - hdr[13] = float(labrec) # number of records in file header - hdr[22] = float(labbyt) # total number of bytes in header - hdr[23] = float(lenbyt) # record length in bytes - - # adjust for Fortran indexing - hdr = hdr[1:] - hdr.append(0.0) - # pack binary data into a string - return [struct.pack("f", v) for v in hdr] - - -def _save(im, fp, filename): - if im.mode[0] != "F": - im = im.convert("F") - - hdr = makeSpiderHeader(im) - if len(hdr) < 256: - msg = "Error creating Spider header" - raise OSError(msg) - - # write the SPIDER header - fp.writelines(hdr) - - rawmode = "F;32NF" # 32-bit native floating point - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) - - -def _save_spider(im, fp, filename): - # get the filename extension and register it with Image - ext = os.path.splitext(filename)[1] - Image.register_extension(SpiderImageFile.format, ext) - _save(im, fp, filename) - - -# -------------------------------------------------------------------- - - -Image.register_open(SpiderImageFile.format, SpiderImageFile) -Image.register_save(SpiderImageFile.format, _save_spider) - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 SpiderImagePlugin.py [infile] [outfile]") - sys.exit() - - filename = sys.argv[1] - if not isSpiderImage(filename): - print("input image must be in Spider format") - sys.exit() - - with Image.open(filename) as im: - print("image: " + str(im)) - print("format: " + str(im.format)) - print("size: " + str(im.size)) - print("mode: " + str(im.mode)) - print("max, min: ", end=" ") - print(im.getextrema()) - - if len(sys.argv) > 2: - outfile = sys.argv[2] - - # perform some image operation - im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - print( - f"saving a flipped version of {os.path.basename(filename)} " - f"as {outfile} " - ) - im.save(outfile, SpiderImageFile.format) diff --git a/.flatpak-builder/cache/objects/bc/b9456a5b06f11c8583fa702c087a35b1b015c3fe70260a5c2d6f4dd1a091f3.file b/.flatpak-builder/cache/objects/bc/b9456a5b06f11c8583fa702c087a35b1b015c3fe70260a5c2d6f4dd1a091f3.file deleted file mode 100644 index 4e505f2..0000000 --- a/.flatpak-builder/cache/objects/bc/b9456a5b06f11c8583fa702c087a35b1b015c3fe70260a5c2d6f4dd1a091f3.file +++ /dev/null @@ -1,347 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# im.show() drivers -# -# History: -# 2008-04-06 fl Created -# -# Copyright (c) Secret Labs AB 2008. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import abc -import os -import shutil -import subprocess -import sys -from shlex import quote -from typing import Any - -from . import Image - -_viewers = [] - - -def register(viewer, order: int = 1) -> None: - """ - The :py:func:`register` function is used to register additional viewers:: - - from PIL import ImageShow - ImageShow.register(MyViewer()) # MyViewer will be used as a last resort - ImageShow.register(MySecondViewer(), 0) # MySecondViewer will be prioritised - ImageShow.register(ImageShow.XVViewer(), 0) # XVViewer will be prioritised - - :param viewer: The viewer to be registered. - :param order: - Zero or a negative integer to prepend this viewer to the list, - a positive integer to append it. - """ - try: - if issubclass(viewer, Viewer): - viewer = viewer() - except TypeError: - pass # raised if viewer wasn't a class - if order > 0: - _viewers.append(viewer) - else: - _viewers.insert(0, viewer) - - -def show(image: Image.Image, title: str | None = None, **options: Any) -> bool: - r""" - Display a given image. - - :param image: An image object. - :param title: Optional title. Not all viewers can display the title. - :param \**options: Additional viewer options. - :returns: ``True`` if a suitable viewer was found, ``False`` otherwise. - """ - for viewer in _viewers: - if viewer.show(image, title=title, **options): - return True - return False - - -class Viewer: - """Base class for viewers.""" - - # main api - - def show(self, image: Image.Image, **options: Any) -> int: - """ - The main function for displaying an image. - Converts the given image to the target format and displays it. - """ - - if not ( - image.mode in ("1", "RGBA") - or (self.format == "PNG" and image.mode in ("I;16", "LA")) - ): - base = Image.getmodebase(image.mode) - if image.mode != base: - image = image.convert(base) - - return self.show_image(image, **options) - - # hook methods - - format: str | None = None - """The format to convert the image into.""" - options: dict[str, Any] = {} - """Additional options used to convert the image.""" - - def get_format(self, image: Image.Image) -> str | None: - """Return format name, or ``None`` to save as PGM/PPM.""" - return self.format - - def get_command(self, file: str, **options: Any) -> str: - """ - Returns the command used to display the file. - Not implemented in the base class. - """ - msg = "unavailable in base viewer" - raise NotImplementedError(msg) - - def save_image(self, image: Image.Image) -> str: - """Save to temporary file and return filename.""" - return image._dump(format=self.get_format(image), **self.options) - - def show_image(self, image: Image.Image, **options: Any) -> int: - """Display the given image.""" - return self.show_file(self.save_image(image), **options) - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - os.system(self.get_command(path, **options)) # nosec - return 1 - - -# -------------------------------------------------------------------- - - -class WindowsViewer(Viewer): - """The default viewer on Windows is the default system application for PNG files.""" - - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - def get_command(self, file: str, **options: Any) -> str: - return ( - f'start "Pillow" /WAIT "{file}" ' - "&& ping -n 4 127.0.0.1 >NUL " - f'&& del /f "{file}"' - ) - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - subprocess.Popen( - self.get_command(path, **options), - shell=True, - creationflags=getattr(subprocess, "CREATE_NO_WINDOW"), - ) # nosec - return 1 - - -if sys.platform == "win32": - register(WindowsViewer) - - -class MacViewer(Viewer): - """The default viewer on macOS using ``Preview.app``.""" - - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - def get_command(self, file: str, **options: Any) -> str: - # on darwin open returns immediately resulting in the temp - # file removal while app is opening - command = "open -a Preview.app" - command = f"({command} {quote(file)}; sleep 20; rm -f {quote(file)})&" - return command - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - subprocess.call(["open", "-a", "Preview.app", path]) - executable = sys.executable or shutil.which("python3") - if executable: - subprocess.Popen( - [ - executable, - "-c", - "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])", - path, - ] - ) - return 1 - - -if sys.platform == "darwin": - register(MacViewer) - - -class UnixViewer(Viewer): - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - @abc.abstractmethod - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - pass - - def get_command(self, file: str, **options: Any) -> str: - command = self.get_command_ex(file, **options)[0] - return f"({command} {quote(file)}" - - -class XDGViewer(UnixViewer): - """ - The freedesktop.org ``xdg-open`` command. - """ - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - command = executable = "xdg-open" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - subprocess.Popen(["xdg-open", path]) - return 1 - - -class DisplayViewer(UnixViewer): - """ - The ImageMagick ``display`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex( - self, file: str, title: str | None = None, **options: Any - ) -> tuple[str, str]: - command = executable = "display" - if title: - command += f" -title {quote(title)}" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - args = ["display"] - title = options.get("title") - if title: - args += ["-title", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -class GmDisplayViewer(UnixViewer): - """The GraphicsMagick ``gm display`` command.""" - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - executable = "gm" - command = "gm display" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - subprocess.Popen(["gm", "display", path]) - return 1 - - -class EogViewer(UnixViewer): - """The GNOME Image Viewer ``eog`` command.""" - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - executable = "eog" - command = "eog -n" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - subprocess.Popen(["eog", "-n", path]) - return 1 - - -class XVViewer(UnixViewer): - """ - The X Viewer ``xv`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex( - self, file: str, title: str | None = None, **options: Any - ) -> tuple[str, str]: - # note: xv is pretty outdated. most modern systems have - # imagemagick's display command instead. - command = executable = "xv" - if title: - command += f" -name {quote(title)}" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - args = ["xv"] - title = options.get("title") - if title: - args += ["-name", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -if sys.platform not in ("win32", "darwin"): # unixoids - if shutil.which("xdg-open"): - register(XDGViewer) - if shutil.which("display"): - register(DisplayViewer) - if shutil.which("gm"): - register(GmDisplayViewer) - if shutil.which("eog"): - register(EogViewer) - if shutil.which("xv"): - register(XVViewer) - - -class IPythonViewer(Viewer): - """The viewer for IPython frontends.""" - - def show_image(self, image: Image.Image, **options: Any) -> int: - ipython_display(image) - return 1 - - -try: - from IPython.display import display as ipython_display -except ImportError: - pass -else: - register(IPythonViewer) - - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 ImageShow.py imagefile [title]") - sys.exit() - - with Image.open(sys.argv[1]) as im: - print(show(im, *sys.argv[2:])) diff --git a/.flatpak-builder/cache/objects/bc/c6241a5a8b361d97b2013685b2bfbf1b0da2ecc89ee862dacb6677087c1b44.file b/.flatpak-builder/cache/objects/bc/c6241a5a8b361d97b2013685b2bfbf1b0da2ecc89ee862dacb6677087c1b44.file deleted file mode 100644 index 0b10e8f3e62e6fe0a6ace41730dac4e5d8649363..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17853 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 diff --git a/.flatpak-builder/cache/objects/bd/1dfcbd4885b8b4125debe28494ce7bece98d9a4946cd09791b858aaa4f1510.file b/.flatpak-builder/cache/objects/bd/1dfcbd4885b8b4125debe28494ce7bece98d9a4946cd09791b858aaa4f1510.file deleted file mode 100644 index 716f0bb..0000000 --- a/.flatpak-builder/cache/objects/bd/1dfcbd4885b8b4125debe28494ce7bece98d9a4946cd09791b858aaa4f1510.file +++ /dev/null @@ -1,14 +0,0 @@ -certifi-2024.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -certifi-2024.2.2.dist-info/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 -certifi-2024.2.2.dist-info/METADATA,sha256=1noreLRChpOgeSj0uJT1mehiBl8ngh33Guc7KdvzYYM,2170 -certifi-2024.2.2.dist-info/RECORD,, -certifi-2024.2.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -certifi-2024.2.2.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 -certifi/__init__.py,sha256=ljtEx-EmmPpTe2SOd5Kzsujm_lUD0fKJVnE9gzce320,94 -certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 -certifi/__pycache__/__init__.cpython-311.pyc,, -certifi/__pycache__/__main__.cpython-311.pyc,, -certifi/__pycache__/core.cpython-311.pyc,, -certifi/cacert.pem,sha256=ejR8qP724p-CtuR4U1WmY1wX-nVeCUD2XxWqj8e9f5I,292541 -certifi/core.py,sha256=qRDDFyXVJwTB_EmoGppaXU_R9qCZvhl-EzxPMuV3nTA,4426 -certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/.flatpak-builder/cache/objects/bd/a6ceb7ca8b62ce4a96b8871f035f68032105f280e0b77da3e85f3d0dfed31e.file b/.flatpak-builder/cache/objects/bd/a6ceb7ca8b62ce4a96b8871f035f68032105f280e0b77da3e85f3d0dfed31e.file deleted file mode 100644 index 45543b9b297251b90b131e7e492d6309a28d891f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2654 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 OHt;p@r)?uly8jPOX9-yV diff --git a/.flatpak-builder/cache/objects/be/b4bc5708f1ab72863f68ccb858c6cb2e9a3e4c65609c90c206165acdca4abc.file b/.flatpak-builder/cache/objects/be/b4bc5708f1ab72863f68ccb858c6cb2e9a3e4c65609c90c206165acdca4abc.file deleted file mode 100644 index c36ccad2fed96233630f7f275a7d4d0e405a8f49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3335 zcma)8?`s=J8lKTgvb<|6j%>M2QYYg&#TB*XH2!pHFm*4vOMFBLwVR_p4zbpbdeTFjZ#eLhujgk9F%k6D1<`OmK?`@Y>zwc`VSm(s$R@Oz;GN~zo{gJ;7|9?tX7un zmUdXZGnyao{CJ<|nfbWCU)K;qPyYAs^u&9|)Bk~TJ4J#Le*8KVHj#xa?4UAU#8{Ri zPNb|YMpapJV&(W^yxg1Wzt{E z2{PC>OxN{xlF_#y;OCCT``%s=&qQ|HeGSm_8isW94*p<@Q=+4XnxJBx|Ye- za-R5^EC!8V%Y}p6)CFoqnP7&naNJnpTQJ z4(Ea&{|gG6s2A1H-Bwd~b`SpEZ&%HuF(g{YCM!=OreX9Za-*y0y7neo#nRJT?H)g} zzl@Md7OtWn9wU0g{s_W!5B7Dxy|F!2EnMSdb(xA~%7{ry_6l`L(RS#h zV_%~rI3;3pQgA#@t*oxboq@oZW!ZX0{g=KLmg&KP!XpJaM^<&qt!LhF%_WBtsJEz~ ztZciqJ$L+J~VD?f~&>)2IR(+&c@%5{wQw{1fm?dD}TyB-@o|!T$ zl_|$wnyRdcWzU_?zWnkOw*{T7n1yR*iSnr`bD({Csw!+}icwwx^wDf(&F`~$zF5fz z)38DCCl8c=0%ij>2V$}QW*iL+{;u}h+Hc;u{Z2hG^7N5$q=_&zw9R&+?^d*_LEY1* zPn+>*tbgZF>h^j)apZ?Phcnz>d4K5EkMaL)92x0)`qeFcwxQ3~qq95%i@iBGjQ*gH zX&>S-?c;bB{aJrS`zwA$`$u9nfxbxSvuW*%Aq>{4Ru5Ij{xEi zwC=i_*wSubAZ0A{(V2IXlAnfta>WNycfT8vu6;yAa&Leb*ee$!-Fsn?TI2?{qVGy- zx2bmy?enhHG#;s8c37nMeAToX{!^^mpWGX$W89p9V^!3d<(x9nK~={gt%#9jbA^&6 z3dH5rLIEOHtUAsb0gfuhN^+jRE|^(>@zgDVN&@q!MW~cRPKwMc6W~7q0)Xfeuc(HC zUWPNYSby0Cud5yd#qeBmMUje3cT0i6-)OC^swI$*ey^`kdi0JF3#q< zfGt4@gvXEPpso#0NT$pZw zG6`EIhr(?a$)57#mb%usBnTla1=+5C*0H%Lc;(8>dd5@`$Olo+%jiOgvS%HyU^;vT z3SrmFFqEGI15$4=sG7MF#XI2u!mFx^5?uO|5Il zWAG!F*wb2`-(PhDWaTYWm>Gi|gAO1cfok|hr)=~ttW{c)9TiYix>^ozcHbyb0UKF! zJk#=HOKXC1U*m!?0xp>hL?+6HWO)>f-_z=C4hrI-yUW6b263hnr z_BiSrzEk>OwQ=I~mNDHhrlnf{0zXPVQ-Aj2--kXceLnKH5hw=VR&uV9oU141c7~qa zxYSIbzQKpai3i4sEn~D{j5bj;c5*v)Q9WWBEBY2QO4P?NW-lq)$grL?HK6|{;6Qe~10=V#ANGOBuo zA`rYQ_KQfkk+z#X{L%7Yn@DxwkG>rHa{P-9cpkoT9 zjy4XDZp>{P>4(O#2gb22W29k>+#P;kjMt;%DxLs(`HW%mB4N5T2AGfv^6Cg`hl5(V zDmK}!Rek$?J)bXD;b}|rc?R)DzR_{2K0KhLM6>5*OCK$pwv!F?Q%RB%Ctu&wU`0mt z4pNj-`(j7soDzV6SS8MuJ*(=_8TJ#XlQ`lZf&sW)Syu g)w{oD{5kv@FyMflIfW%N4%i~r@rzCLJx1-}|G4N;@&Et; diff --git a/.flatpak-builder/cache/objects/c0/3d55fd88434c145ab5616c7a584bb521de605d836a3662b2d4efe560052741.file b/.flatpak-builder/cache/objects/c0/3d55fd88434c145ab5616c7a584bb521de605d836a3662b2d4efe560052741.file deleted file mode 100644 index d1bb411b4c64989529eac35ee3e53302575ee087..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5748 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 YMTBsHMd`Xf?=O-5GU+cm4^zPZ0h+10h5!Hn diff --git a/.flatpak-builder/cache/objects/c0/3efd32de53393d93fb2be21e6a85f141dcb7079f7d57f6b136c8849a2f247a.dirtree b/.flatpak-builder/cache/objects/c0/3efd32de53393d93fb2be21e6a85f141dcb7079f7d57f6b136c8849a2f247a.dirtree deleted file mode 100644 index f2db8b015d51d504ad853745827acb4f8baaa964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 411 zcmdN(&n(GI&&w}LW%!hs#G;a?yWV=?v>w6t`2sUiO_Vj-@A0~STCza-&L30m+|-i9 zl*E!mhNVpr(VjbM%AWXhZdxj};7G)(&AELu7C4{szkBj+(MEkvm`c5r)TGk%%)GRG z29wC+y3^|_FKB;sjICW%9c7er>P7R)n-h+d%+AnC2o4m6>&eMaPRvPVSQ0m*m?gOT zZF^Fp!$k9k$8W7ozu$H8q5IR>hT%2b9LofB!n$^+RutqHl`!1R-gGc(O6d0UnFm_B znI2CUULBCoxi?z-vqR#dy5Ny?7;7R>fRqfdVUA#>E&$`Xqh w+P>XiRC!Q!QRZ>!$wxa6eqMM&{PR}!vo>XIf`1O#{!SodiVBP8#OwPR08*34Q~&?~ diff --git a/.flatpak-builder/cache/objects/c1/a9ab41abc1f3c7c311b1495cc6feeed36898d600e500317fd5f61b667774dd.file b/.flatpak-builder/cache/objects/c1/a9ab41abc1f3c7c311b1495cc6feeed36898d600e500317fd5f61b667774dd.file deleted file mode 100644 index 94fbb0ca51dc8582282fb8586c8d1d79f5672c9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20316 zcmd6Pd2k%pnP2yujX5xbgE)w500IOC#353oMNzyU61*gWBnXKVEPFgeH-sSvGf;Pf z5MV$?Y-J5Ha0&L3D<(_tVrykB6-fz`vJ>Xml(N~1ovb&RL3#_5PEgCL6q8lupP?yN zDXPu!`(DrVOyiJc?>~8HeEs^}?|a|--uJ%uz4;@*-(%-E?(@C9fBjzjfBnXPgWq&c z!^b~))5dY{a4&HpH_VB=Xp8gXwqYAjetX%YCZ!Vv2*oXA)xPQEKxO6-)92gG{2gl2X%Xm)m$S%YQ@$&JC;R>WL5k2wB z@omG~nBN<(8m}I%=D8A1^bOaD{^44&ba=ZM7_Jk8!}T^!5~POrc#iu3|At#`%=?Pp zV%fS>O~tW!zgYfZg*Dx9$i|)I#LBlgahufq9uW8eA(6S^78X~9xN50oUEB^9SA)3P z4RNjFGh*Xgj^Q?zrU_|6lKtw=e7WmNYG9?yxGtf=wnuF!OH65)wR5YfBVhWWJjmMKylGx+9Xf`aFh);*6lJYgQYLu#Lm!*(AnMhEp zC#I8POq8g-(a@B1g(Z|^wD_Vll1zxyLUk;rgixOnilSFigo&YxV^LWW`(!yf z{ru$Us3eEfBz1=xA62FkBV%$hk(^Y31a)N0lbn#`s2WQqx;=uCp?~4jPVVrQanxrz&aH&3d5k~y9E?0lOrRN zqKr<)F<`lFQZM7lZHubEvEKR3zV_s6sRdQ70m@3biT34M3;>GMxu%YqC62x zpmmHUQMYu3$QnaGH5MBg1Hmy0l8So9=nWkPwlML4p=1I@#?%-P7#pWq3_6-rK_Tck znn6aLeR-VQ+quD(e%$fpo-9JXdnsZQiIAquPN>;TRQU5wG>@j9BmYqiyz6awe+?d|B#X3xy`@B z&Dv(U2>gbdwd2c_LS}h<<#ThYJD-ZK11$Jd2Ogyvo(5_akiMT(EI*g|5xBoY~kM-?R!QD{tvE6;!4-y5Bn=#9s& z^iE8xW68wRJ-c`JDlt{+o&b{qR+ZjKIga?Jd)Zt?!U8Gu8nbI+T5d*xGgX$+>dCj~ z7~+%z0H4is*;1~iX~D7R%hZJM@@J|W>1$2!-*7LwSB07tq2^BI-TJh!QxkTk^3N0G z=42Ax!Y-p*bre8@EY}lY*l3`5Cn197Y9yk2B9ZZ=I2k9uFA{luG8#8xSbITT20})# zc0?lY^YRW9pwLhrm0PLQsyuj}B3=PN7xI5u7uU2S>-0F=vjW$>JJYi#>!lCwHv)27 zzAnq;$gmnjX+(|K;q8(gaSsO7`3)_El5J(~6&)x1Yjj-w1w7L4cG%0HPv#$ui+ zZWnzJnC)Vn7{J>h){A9$J0%x<olK+}@;fsir zIbzgd=YULP_{m?PX+tN%UilEdG0U$gmf7%Po}3ERv-+va^DSFDle>;_+|>H)}?~Ol8r?njHFTls*Ok23^k8 zwSgrEGIcu_9GXy*si|d*I`?Ymq|oh|s(OTaGd=qr@PGf>y=%9XJA0Sg|L);*b*EO{ znX2x5pb}rtRM)ZBcH;Sg%;iIaXqn3(wwdzcW*K4ANUxLw%ySO|6>qjb z5}yc{%53aT;zK?`pui3oxiR7B6h-s_=w2`!^{gQ&vxUjvIU!0w1%_<~Q`rH(LPQms zH`oS6&XjGSggHw0I{*-gK%E6jfB;ldpQ&$HIKFr`|7vW(*SSp7j)mizuRfFetZPE( zi$vP9STkRp($Uc0UJ0tixnn4Vu`!NHpyiciC%{huC7E5+vXCrbS+N`?H zZ&SRPUbJ5$0_2u>c~CWHDTFz5W-ptwn$qPR%E)^;(XNt=k#pACc;eD#xnE-TV?KZR z*}p}L33(gb)-6Vi$sOJUc0VZaIH!Rf*{#ynC+8Rj^B?Gaf$7ZIW}%zS2|fWPN)=%m zoQgIA%q4zz)~1GXA9&^JQ7o-=6_sqa^tCLXbD7qM4bIB@<{Yz*Wm;-CIMh~|4_q$d z!TB&ylYQ2172&NMc+P2|J@>5hcex*8W%yzW6b0adc6`i1=%~*7i{I8>fICBTt?n+Q zKrJSA)u#*L>b`=1_6ye!YtQB&S{C7hw!Ir1QkY|C@w;Y_)>__j5zQ0|vi54uJ?s9W z_5%N|zim5+?6XkS6#6^sngPy6Y=zaC#TVM>9<*FZ9_)-0&+NMBdH z>=5%M6{t)D!=!874Q1)sq%6&p&@M#m#x7K*Y4drVsV0LSPEJmdUeZvH9|)ZYHyCSW z7nQ@7Nw$bSgHPSvXK4MQRY6UX?(ZKQJU18_I(@eP+)G1-jQtYjqrDwlLUjkJ9Ssqj z2!SoedcernfB9Jd`JvP226XQbbo zTvf0WL!=I+vP#jf5qgkWA%4g<3;F$mu{$AzZ(IW@^tUP3=U7#9(rK1+mXxlQH)n!} zGd1;heVN*ZtlLph`j`Xwlt7kq_)D`M&KF!fbf<5{+mQA)Jo1$;o>}$PulVZk4Bd^~ zi~gh`?K`6Rj--4?GD!Hss&B`NZ^w@Y?w@|3YDX@lo*qoMUesDIrhP-2Zz$y(dK4_b z<#{LYgTS)m-N5~_pPc=8@1Gt_2hVH4^O=gqU)cGwrYr~WOBYw&nhNf~p5)fImS5MZ z!waV}f$BTWH)j`SGocO$75+@9nO;l&Oj+#@BP(THsj{w2Lo?cSL2Kw;@;qv2y8HFj zhTfHi-gLumtzq|)CsWt9TGzEw*L815>pryFeQc%s*vEYz&!oEtweG=m-9@eL;*zjd z)t0F|c)uf6c@R&gK6Lj*lneY+mjgf5<-kvMIq*|fo(*!LHWF|k4ZY*}f#>_aTfQZ1 zq-vI4f3%HsV+|kKKRR>&jda&ht?OvIqfhJTOK*E#+xGl|CsR?aRqR-;=vt}hBIKRD zv-j?ydk4~W`yShEm7Y&IfdAnM+-$qizSy31awTO@V)cCGd!D8JX`x;d>hD~*Gjr$F zw9tv|&w_u^e`kAI*g>8R-+|hcP|E~_u+NxHL_lnV%ajDhd^k#BBz`h=fFW@nqfa*L zXn}s;CetoZK2zjB2S2ngMAJ;>Fj7!H2)#Qgw4Fc)fo1{&1V|dzg$bFCztm~@B8AaR zk}nhZDuJ&PxK1EUfObr5LzYwb5l52=yh;(D0DLwN>NftewsPmQSHbPxqC&bpRz;@nQNg0cQ%UUUG!=_mlf2JC+H+nk_%&N*)x+Yi&c_; zk^uW4^_IxrC{p)quE1MHj*YHZ0(p&B%{>~abwvAyofmfSQIn7eB3EH`gG^!QsaN?%>v0&hEB^kdiMMe{bBG1Rd=tzu$%o%Ih4bb>NqT`>u z49{);yWDqiRwB9=xCO_kO?18m9OH{0C8sZ;(pu4NXu5xB-*$e*lJi&l+zqtLI!Ao16Ummn*-x$F>IIr7GmT#3A6wx zR7Ggs*d6Q6Wa6yy+RU*Hq;D$MdJeL)a^-Ljc++@Hk@Cou3o)#apHtz@0N^^A_FYR3 zE!dg~HZ1w?MAN~L77V5G&&Ca)*=?Grq-ptrjy53)+ZbZY&${+4s+jPc+wxPVpv?c9 zcM651sBDtwsZ+uFCEuM3-w)ghEU`ah{csqqAi^(DR@knWfaVNkvR;x*>LcivSxT+9!VF8=-u6g6k1Kv-dX{u0KPm$`ydmK0{}+Hk-eh)D~X= z1l~`~ehc8@I=Z0%8PI&KnYK>D*OKzlV<5(5^pGKjb#onx{PK6G%S>){JP*4CIfie& zDspjXu)pst4v-_4&JDiMKNvZ7?sz|wSathLgD>g<@d3a-A3i6F;v|J8n{tHy?xpM8$y+j7YI6di&Oc@NbY> z`6B=z`e9QmshsN{RoC8{dgq%z_~x2_N6Odwqs0Bu)Zv#?`!1z-UeAb0 z!Iu?EN_J(rEx<3UI21LyTGh2u)phUHbkzZ^>cE0`t+wuNgI3$UTDyCtcK7{V>Dt3u z?O`aaOV`@N@6KuM2UpvVuCyOb^<7A}4{Gg$)T-7Ld)Rmtgc_MPI2PVWn-a`X{>d*u zo5Ymf!V$++1R8F+n1$s7*PR$2U-ylDJzv<-5X z>t1+Hu;e$_$<6h$vu@~=>I)^V*C}mLmbuq07E7N3Ot~gE|AM#$OUN^^6&?yO#ES~b-XUFAFt;Nwd61@{(p|?{z8kzz^sqy z3pb@HwK!$aN?}{)3YQI7HbBIRnW#)s>N{KvinOnly=tQ^39)sx&>HSK{|`$ssJ7p> zEtccht_M+&Qp-;D_Z{yayciie7dd@$;M`z81SVV0Q#yZ5=dT+gYHqRp+;fnO5k`{Z z6NhIyH?Fygln@J&Xd&%?K~2h20FZS!TZN|p{`0olr3-iX2mD|34W{P`ACleMStOU7FXs?8}y9@&Z-40;^W)`%4gmqkWT$yRl znU|2AC9@?U+sI;D-ke34p%$ctR(HY1P@PodyY%79=SwC|ABVU?st4U`q=2;t)Nzzd z{viR9?q=FvN?c2j%Fsw-*t;5nXpt5%yu&Eo30tXg#mG)8ko#81vtfw$D<-A=8?IO{k{AVdXi_Jy?_>Nw|CUX*|Bp7p9rfL)d zME$xiZ{9~HH42Fs5FU%1VQ>RGw}c40Gs98^8qb{Gp@+hCWK#YoCKVIba|E1eXuTU* zZP>HYuqWNHS8LdtwS%@F6M;i`tne(jVa*k+UYuQUWSTpE()Pgdk9Pfd*Uzed-k92U z8P9^};qLuEZu)rl%I@Q--N$e5SQ77Cx*JJXb*0O@wes#%dH2s+7u;)g4O(6AYTeT- zbx+?vnXWsi)g4R;HET87@A_A3!Yei5ROf+o&2w7Ka|?bZd9K!WuGDs>c0KptLb~>d zR(oWj^pW6M^yF;f8t(BQ9ZCz&YQnQA;n_7KrglZBz0-ZKEG_KPgk33N*V^{_yE}is z^Y3*oUwZeeKWX{#uJrc98a>Ar0#M;CmaYmdD?-bfZ~Mc>o=jb5W=A)4kWf03=JB!J z<%gmc;IUmO0XhJ(1b$h`m3S9DZwGD$?)aBq|ET*xbz11tguax}m+{uzDbu`lKb%|f zcBQ;sYvoOu;Io;UrmfY#rFD09YyO5GHLm!3Q~qA4Ah)+eA6pwkPT5sp_&2C!pKb7)7m8spib)z%Y&A+P2OjEx9-dHNQ zAJ50_siDh6il`WXND&p={H4DXxQdoc@XQ1M$5CznsZ{U`o~_Z#c<+Eb1=4@tV0ALh z9b;cjqA0e_J1L-@KtY50Pw11@7Go#VO1^LA!JojRoB%L1p#-zGZO)5)mfHY(PVi2& z{EMJb1uLC2y~OKG=YWsxlV}HNHS8w)vCV-ZdHmi)4tSyc$?4K;5Xo2Aj z=>^J7`v45vVhJ%h#rPrFWRFFasH)0r`)x4Ee}+u!kf_(fnkSZsT)`O>EUY7R*Cb+G zG?D)WlDA^xr}V-@)`8`>_bk1U_J%ZXDCNEIqe~wR-mglx?bq7&&H>#Gjmik@bI8OUmkJa~caX6%AY>Fw z+XB)*1`gzZO@Lo zMV0;i2=|Gzn zXiEugkA$YQ(5wl~DWMtGU^#QD6YNaT!sARVejUYIv8c3(d=zIsb6c2yFH_zPZawY{ z{IHV-`@qo5{!7LUsso|?9t8K4Ad81gTA~|I?EYYm!IQNC%oMObKqx(R?$SWsav*Z4 zZ*Tw_Swmav#-4=kjFIhtoPZ_yb~LRR!P|_n$k|p$awEaC>E{T)&mukMvlq%|yR$jd z3^X=o%3p-wNs=Lx)ZA$yqzR!^{>i$Lk|p0bWlhBX0_CnlY|=z*5eltjrNHW1w3BfM z(C;i@*_ukGRE}J#ElHG><;YOgc%E+XJ!{t zvHLXaW?SwyC`?c`p%u@};gF$n$F;=}sqt~C4A*q%LMSe$S;-AWunT)q;(831KF4ui ztLMbbKMt82Aj8Ndch3}+)2&sa$Z2*xk#56IMH9HI274P^#hXM0>{6(C=#{%eirx|1 z#E#0iLYt6`i+Q;889xweH*VwQE(Z00m|<>mrKfN)sE4scc5`-%>v~KL0K)$dpq8+p zgT1oZQgm{Wn=d3YFj0xI?ZSx%%PIdy%5F2R1W{26vB>->!@r}f1cqtKJb;I$%#JKq z>TJyHXvfURlpny93ACpJVJ#5GQB4VqPAXE>hts~p3n$mSt!eL0&AXE#PVg+IKke&B zOrRwlXw?F(6m!{#xs>)@qCDHv-g?bjzwAtT+wdS464gljV;lrY{KCnHLL(+?@$*m! zyzRT`Te_4M8Z@CHm4C7gXeetfo3X~J0=i;47krqM{F5sVnzkjDb>*s=a`Sb=I-%zH ztyc|Y7wk9rqH7gJmY8yV@reO+i01ScZ5vMvP>LC!=-g_eLZ(973#a1DUenAcm#U`j zd!w~9$}D0UCZ@1TUNuh_;P>WZM2A&t%<3xWuSuP>!C5hPocr2WnCi|(XE4j98+Xf;7N0@tqW%}st8E28dT46=t+=#)L2n-}a?VuWSwL)UtZ_zq4zm`{Uk9w&bdmYlAuBzZ9>x^tTG zDvM6ub+tL40;LMp(Z`8KaS0`63H|vzbYAntB^2wge^pwMn{&PCn&PLpH|(!)Q+(J1 zGe%~8n7a)|_0BY@Fl_9dh+}8_TxbM3KwSDibo%1C?*04sJ=?u|--#J-(HF$dA0bzf z&XtB(_vHjESPUd(`QNjk0SP}SAYWra(6%x~YN_?gJkz4G)uEs;9D;32LI0`;>DLQn z{0PHYSctN?6qW9PnOMTm)&7Cm9wHS|hE5^JJLC_dFS#4Yr?7}3m?UL(FOX?`bqBlW z2kuLzXVi5pr1~~krS`?+gSiXJMoz`JqdGxJ-D;9_p*U-2H>M>+^ZJKWG%+t@TSw|! zV_~DohdW;kQ7-6B-x!lw65WYQlaodIYu%0(vU>?RO{t+J^)YEZFQY#~Y2)CpN-5S# z(&V%`53iL~Xk{&{Wjj~OcBacZw6cx`*P}p3I?$;FI_V(2Bh%8ma6fqwLtnXJvYBedT8S(tQoa+pTy}p4c9Eze*scZJ zQ^EF!Lh0Myo8G09w+5C^zWc)cZE4{dO?W0HJd>$wxqD=_?x~f!r_yzMw7NaehL!AN z;KmCJ$CujZ&dJQpnH#fX}{Z* zu58yT+tWgaCUm5Pjz{HHx37QyjazTz^mSFM;r^9ye>!|p3!h9^pVF#NrOQui<);_i zMF_E%Je#Sgy>(=@qGP3^BVEy{RdlXa>{+SUldjmSRqS0jzHt1Zks!QM5x&=*uGp_t z>|Z#(7HH1YG~V^!n|d(xvuB|23zF_RNV?}Bov@U6J_Ck))mhH%JX`=7Z|UOxr8ifY zL;)4+vi)7}{Y$CxL+SEETKS=r?@-1cT)cb-D%JLszkSmbD7PZCF(ZswKFbDB8{P^r z*>9h8oOE+Pb$d?r*ne8qS92w)$-f`4go6 zAvOPLc>W51=Eiv2T4|M5+LIDCdDuqyVIY6q2Yho6)kJWFGGsNP3Krr{s-joN!X{vdl*BLWyakq zjNkLX4*~R$ZQ!H~Rh8_d#4Z>UVxJ(p@FCN-&fwJE+;89XjE=?(i(tmuSgT3;(#wo| z5v(3kLctAT#W40Q^o6L=V2#9#<&P+rH-Dbhf9?c39AjryxUd|_{ayh&CR|O%5))B% zOfR9WPlOgId69CLnAZY~yZuD3?3~Onjw%_9PMtpYJaliyF&NWPlbV)kE}1sX*oBbh z1h?-aML*~PB$D<+{&NDf#K@$oWZMs!Sgt|JL<{RE=X2qp@goI?<^P3PnoG*>V?45U zp69c+8s3rROt6RJcci$M;^!e(GSB`poOho6Ww@r4^~rE;DeJQ_#7JP4mbE!~8*KW2 zBT$O-BrFnqIOFI@S)Yg8&Xo1Za2+Y@lXck9Yk}L=n&QeHmQ~D`W=eze-b}E3-k&M2 zoDbko$myByU)Ys)RB4W?zjXS)eK}RynRf2doV)(gS^Di)?zrb)NjpOttgYP~U!5)W z^7v_njbQ2YV+#GW5LM6fCDiuyU}+pXIKJf5LX@yE5zDxAc9WESI4$A%bx;`Ld6;K! z4wqVPbvX&uK{ zz(ara!tjk(7hlaf5lx4$&8a{r9ca-4E%T@5Pl375pUS$NhyyVegCMsZbY4Yq&}&&i okgIP_aWz?2kjD<%3U=<~v9wyjAn%~Et)SG&!@7S9z_#T74}#}?@Bjb+ diff --git a/.flatpak-builder/cache/objects/c1/b3f3e6f952ad792903623d27820b032bf2789cc669feeaa65dad490a6f7163.file b/.flatpak-builder/cache/objects/c1/b3f3e6f952ad792903623d27820b032bf2789cc669feeaa65dad490a6f7163.file deleted file mode 100644 index 7dab7ea..0000000 --- a/.flatpak-builder/cache/objects/c1/b3f3e6f952ad792903623d27820b032bf2789cc669feeaa65dad490a6f7163.file +++ /dev/null @@ -1 +0,0 @@ -[MIME Cache] diff --git a/.flatpak-builder/cache/objects/c2/23bf442b5d35d36e99773da868dc0d0e5ff5047d722b50bd5c7e81ab704d84.file b/.flatpak-builder/cache/objects/c2/23bf442b5d35d36e99773da868dc0d0e5ff5047d722b50bd5c7e81ab704d84.file deleted file mode 100644 index 653600379e2300a524455f7c6d10c3b5c30807f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmZ3^%ge>gz`*cQtK-+p=es982D0IR5z6|^1!PQTNMVR#NMQ_S&}6D&Hr6xu(`3BG z9UotoT2!2wpBEp$lHoH*{Vy~9#DW6-oXjNsg36MN{5)elLqq-I%#u{yg2d$P#Prl+ z{mhiSM13ePJ|(dvQLmu#7l%!5eoARhs$CHq&=`>2#e6{G12ZEd;|)IH25t~6VgU*P E03_is>;M1& diff --git a/.flatpak-builder/cache/objects/c2/874fe9b02939f9dc93d28206fccc42b665a6a32610397ff3d060dee14327a1.file b/.flatpak-builder/cache/objects/c2/874fe9b02939f9dc93d28206fccc42b665a6a32610397ff3d060dee14327a1.file deleted file mode 100644 index cf75e44f4a475612748708fcbf29f12ce450df25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3722 zcmc&%-D?}!6~A{hU()EyiR?JG6OXg$vTnR~lU>|dRku7_y zQSV&ENh*OFLaT&@bs-@xwBVPz8@#aj7xuAlQV~=P7#8+r_f0eejGub$9eFHy9mq@R z)y%nH=ia&ZoZtD-KVq>+2qCod?SHI)e)at)-$FYmYyt{?aUbYYWFiyWXcf<6%-Vu2 z%nQ5@&4-{4+2X1+FTtE>N{hn097gPC_L~D{;(;`;boG(Rp9VSpaV7b-Af@up4Ek?3Cq>THy;~St?6gaGUMmMip5=Ww{*c{q`rYrlM5TN|=WC z_ks0FF;rHIxE$`~22}~OdlyzqF4f(lmCfhw>L5hhGGGAYs5?2G$$Vyxl&lGzi=4N| zB`ea z{++23&D&E9T9d`Q-hh9qOaL_>Rb&{pAA{HZJCG`BM^QA{Mp*g)Z%BT<6CbJ%Uu(p# zH{;jq>h)GEQBC_q(HO@_OO1aXdlXwY8|rXV9j>dxEhYMjnU_%%>3cHp_|&HSh5TG@ zgfBJ2m#V*Pof_S^v8nv!)?aTm#Gz`smR?WqXo+>Xp8WB~n?N?x4eeZ0J69Lay?}$F z9&9rNacm<%=%3`*MYkzbL_l_;EK-5(>6hi8eJ=%Q5&_MJIRa$*95m=7v>YIG3%1+d z-xNKPAIh6uNDn5!e#+t&d~-YaF1RMOCg-rJJcw2#8av~>?+5Zo0x{i6AYq6e~`-HQSTiCVW5Y2 z6UKj74m$yETKVr_H*kAm(Xs7uft-eQp2|8IXJOf8=hLfXh>a?ylVKD0e#EB_fpl`( zcCv=;UY_i*{T9}^Zvfe?qLvn|&9tJi_0+@nYFAo`6Q5TeRW?3oBu1Nw(YiWHMu2Zz zY5S!kL4@Ko7dcFKWNSZ9U~4m&3-*G>;Xnii z0de&WL<8eOs5?~TgtLf<7<~-U{U%yNcS0YdH9RiPavPXSgZ7zMzR4&D3XM-XIP z9r8JzF923_>gWrWZrnEVwy|JCDpAl4eKCLAD(Ic8F2ZhigC}aP&N2)=pVR4*)tT4x zF5ir;p3q_EG&sP3r<3>T)}3OWSmq?(Yz}-ZPc&GL@eFf$JrjKCvLWB&b|lJfN*MVa zn>h&tB&wq5Fi6RK4ltc=Xwyw?x-L%t55&ZBssE>#f>ey0XL7i}WWeK5M>@>L2qSmc zOs{n4^N;G5(7MlI&f@i^a zxH0f8j$)5_kxV96g7n_XWC(*{Cwg`MB!qLNLYBf`1lLbSl}yHfc$?vQ9=A!~I=Mk{ z46s{1L;M!p*7nrtRmUvZ)@8zi6LW{I02KTa#w~QF-urxmVpaZY9W+kWQP1;@HdG&( zs7KzeD(#=5V<%ehjOgufKb~l#Bgng5JOdbv_y}?#f>UkOOHOyKOW;dwbObpo;+Zx& Pg2Y99nN7T!a2fp<@%b-# diff --git a/.flatpak-builder/cache/objects/c2/9f4427c806011241969d91b5d08ec2c52a34f11e9deb9a0d5fb5b00b03afa2.dirtree b/.flatpak-builder/cache/objects/c2/9f4427c806011241969d91b5d08ec2c52a34f11e9deb9a0d5fb5b00b03afa2.dirtree deleted file mode 100644 index 8c1d42330102dca7819c68efdb2fb45e0f3d523c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmYew%wt&j!Cl~ZJ-^F0{{vUTSo;-zm;`0miN25G3663%5PUq(C5!K)bj`u^&)b-v zwjO`?Zd>WEB|=x<6o1p~c+H&?(xJkVlbOU|SA2b6&)2puof3uJiGJGae}9{BUWS=x znfkv*_sx>ao)I>sI3uwrmEqVl$5{UFJ13MpHIZar5R0K8#q_y7O^ diff --git a/.flatpak-builder/cache/objects/c2/a63553717cf48b835df8cf9a186adf45962d51a9e91f565c2929f4920257d8.file b/.flatpak-builder/cache/objects/c2/a63553717cf48b835df8cf9a186adf45962d51a9e91f565c2929f4920257d8.file deleted file mode 100644 index 93c8e34..0000000 --- a/.flatpak-builder/cache/objects/c2/a63553717cf48b835df8cf9a186adf45962d51a9e91f565c2929f4920257d8.file +++ /dev/null @@ -1,572 +0,0 @@ -""" -A Pillow loader for .dds files (S3TC-compressed aka DXTC) -Jerome Leclanche - -Documentation: -https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: -https://creativecommons.org/publicdomain/zero/1.0/ -""" - -from __future__ import annotations - -import io -import struct -import sys -from enum import IntEnum, IntFlag - -from . import Image, ImageFile, ImagePalette -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o32le as o32 - -# Magic ("DDS ") -DDS_MAGIC = 0x20534444 - - -# DDS flags -class DDSD(IntFlag): - CAPS = 0x1 - HEIGHT = 0x2 - WIDTH = 0x4 - PITCH = 0x8 - PIXELFORMAT = 0x1000 - MIPMAPCOUNT = 0x20000 - LINEARSIZE = 0x80000 - DEPTH = 0x800000 - - -# DDS caps -class DDSCAPS(IntFlag): - COMPLEX = 0x8 - TEXTURE = 0x1000 - MIPMAP = 0x400000 - - -class DDSCAPS2(IntFlag): - CUBEMAP = 0x200 - CUBEMAP_POSITIVEX = 0x400 - CUBEMAP_NEGATIVEX = 0x800 - CUBEMAP_POSITIVEY = 0x1000 - CUBEMAP_NEGATIVEY = 0x2000 - CUBEMAP_POSITIVEZ = 0x4000 - CUBEMAP_NEGATIVEZ = 0x8000 - VOLUME = 0x200000 - - -# Pixel Format -class DDPF(IntFlag): - ALPHAPIXELS = 0x1 - ALPHA = 0x2 - FOURCC = 0x4 - PALETTEINDEXED8 = 0x20 - RGB = 0x40 - LUMINANCE = 0x20000 - - -# dxgiformat.h -class DXGI_FORMAT(IntEnum): - UNKNOWN = 0 - R32G32B32A32_TYPELESS = 1 - R32G32B32A32_FLOAT = 2 - R32G32B32A32_UINT = 3 - R32G32B32A32_SINT = 4 - R32G32B32_TYPELESS = 5 - R32G32B32_FLOAT = 6 - R32G32B32_UINT = 7 - R32G32B32_SINT = 8 - R16G16B16A16_TYPELESS = 9 - R16G16B16A16_FLOAT = 10 - R16G16B16A16_UNORM = 11 - R16G16B16A16_UINT = 12 - R16G16B16A16_SNORM = 13 - R16G16B16A16_SINT = 14 - R32G32_TYPELESS = 15 - R32G32_FLOAT = 16 - R32G32_UINT = 17 - R32G32_SINT = 18 - R32G8X24_TYPELESS = 19 - D32_FLOAT_S8X24_UINT = 20 - R32_FLOAT_X8X24_TYPELESS = 21 - X32_TYPELESS_G8X24_UINT = 22 - R10G10B10A2_TYPELESS = 23 - R10G10B10A2_UNORM = 24 - R10G10B10A2_UINT = 25 - R11G11B10_FLOAT = 26 - R8G8B8A8_TYPELESS = 27 - R8G8B8A8_UNORM = 28 - R8G8B8A8_UNORM_SRGB = 29 - R8G8B8A8_UINT = 30 - R8G8B8A8_SNORM = 31 - R8G8B8A8_SINT = 32 - R16G16_TYPELESS = 33 - R16G16_FLOAT = 34 - R16G16_UNORM = 35 - R16G16_UINT = 36 - R16G16_SNORM = 37 - R16G16_SINT = 38 - R32_TYPELESS = 39 - D32_FLOAT = 40 - R32_FLOAT = 41 - R32_UINT = 42 - R32_SINT = 43 - R24G8_TYPELESS = 44 - D24_UNORM_S8_UINT = 45 - R24_UNORM_X8_TYPELESS = 46 - X24_TYPELESS_G8_UINT = 47 - R8G8_TYPELESS = 48 - R8G8_UNORM = 49 - R8G8_UINT = 50 - R8G8_SNORM = 51 - R8G8_SINT = 52 - R16_TYPELESS = 53 - R16_FLOAT = 54 - D16_UNORM = 55 - R16_UNORM = 56 - R16_UINT = 57 - R16_SNORM = 58 - R16_SINT = 59 - R8_TYPELESS = 60 - R8_UNORM = 61 - R8_UINT = 62 - R8_SNORM = 63 - R8_SINT = 64 - A8_UNORM = 65 - R1_UNORM = 66 - R9G9B9E5_SHAREDEXP = 67 - R8G8_B8G8_UNORM = 68 - G8R8_G8B8_UNORM = 69 - BC1_TYPELESS = 70 - BC1_UNORM = 71 - BC1_UNORM_SRGB = 72 - BC2_TYPELESS = 73 - BC2_UNORM = 74 - BC2_UNORM_SRGB = 75 - BC3_TYPELESS = 76 - BC3_UNORM = 77 - BC3_UNORM_SRGB = 78 - BC4_TYPELESS = 79 - BC4_UNORM = 80 - BC4_SNORM = 81 - BC5_TYPELESS = 82 - BC5_UNORM = 83 - BC5_SNORM = 84 - B5G6R5_UNORM = 85 - B5G5R5A1_UNORM = 86 - B8G8R8A8_UNORM = 87 - B8G8R8X8_UNORM = 88 - R10G10B10_XR_BIAS_A2_UNORM = 89 - B8G8R8A8_TYPELESS = 90 - B8G8R8A8_UNORM_SRGB = 91 - B8G8R8X8_TYPELESS = 92 - B8G8R8X8_UNORM_SRGB = 93 - BC6H_TYPELESS = 94 - BC6H_UF16 = 95 - BC6H_SF16 = 96 - BC7_TYPELESS = 97 - BC7_UNORM = 98 - BC7_UNORM_SRGB = 99 - AYUV = 100 - Y410 = 101 - Y416 = 102 - NV12 = 103 - P010 = 104 - P016 = 105 - OPAQUE_420 = 106 - YUY2 = 107 - Y210 = 108 - Y216 = 109 - NV11 = 110 - AI44 = 111 - IA44 = 112 - P8 = 113 - A8P8 = 114 - B4G4R4A4_UNORM = 115 - P208 = 130 - V208 = 131 - V408 = 132 - SAMPLER_FEEDBACK_MIN_MIP_OPAQUE = 189 - SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE = 190 - - -class D3DFMT(IntEnum): - UNKNOWN = 0 - R8G8B8 = 20 - A8R8G8B8 = 21 - X8R8G8B8 = 22 - R5G6B5 = 23 - X1R5G5B5 = 24 - A1R5G5B5 = 25 - A4R4G4B4 = 26 - R3G3B2 = 27 - A8 = 28 - A8R3G3B2 = 29 - X4R4G4B4 = 30 - A2B10G10R10 = 31 - A8B8G8R8 = 32 - X8B8G8R8 = 33 - G16R16 = 34 - A2R10G10B10 = 35 - A16B16G16R16 = 36 - A8P8 = 40 - P8 = 41 - L8 = 50 - A8L8 = 51 - A4L4 = 52 - V8U8 = 60 - L6V5U5 = 61 - X8L8V8U8 = 62 - Q8W8V8U8 = 63 - V16U16 = 64 - A2W10V10U10 = 67 - D16_LOCKABLE = 70 - D32 = 71 - D15S1 = 73 - D24S8 = 75 - D24X8 = 77 - D24X4S4 = 79 - D16 = 80 - D32F_LOCKABLE = 82 - D24FS8 = 83 - D32_LOCKABLE = 84 - S8_LOCKABLE = 85 - L16 = 81 - VERTEXDATA = 100 - INDEX16 = 101 - INDEX32 = 102 - Q16W16V16U16 = 110 - R16F = 111 - G16R16F = 112 - A16B16G16R16F = 113 - R32F = 114 - G32R32F = 115 - A32B32G32R32F = 116 - CxV8U8 = 117 - A1 = 118 - A2B10G10R10_XR_BIAS = 119 - BINARYBUFFER = 199 - - UYVY = i32(b"UYVY") - R8G8_B8G8 = i32(b"RGBG") - YUY2 = i32(b"YUY2") - G8R8_G8B8 = i32(b"GRGB") - DXT1 = i32(b"DXT1") - DXT2 = i32(b"DXT2") - DXT3 = i32(b"DXT3") - DXT4 = i32(b"DXT4") - DXT5 = i32(b"DXT5") - DX10 = i32(b"DX10") - BC4S = i32(b"BC4S") - BC4U = i32(b"BC4U") - BC5S = i32(b"BC5S") - BC5U = i32(b"BC5U") - ATI1 = i32(b"ATI1") - ATI2 = i32(b"ATI2") - MULTI2_ARGB8 = i32(b"MET1") - - -# Backward compatibility layer -module = sys.modules[__name__] -for item in DDSD: - assert item.name is not None - setattr(module, "DDSD_" + item.name, item.value) -for item1 in DDSCAPS: - assert item1.name is not None - setattr(module, "DDSCAPS_" + item1.name, item1.value) -for item2 in DDSCAPS2: - assert item2.name is not None - setattr(module, "DDSCAPS2_" + item2.name, item2.value) -for item3 in DDPF: - assert item3.name is not None - setattr(module, "DDPF_" + item3.name, item3.value) - -DDS_FOURCC = DDPF.FOURCC -DDS_RGB = DDPF.RGB -DDS_RGBA = DDPF.RGB | DDPF.ALPHAPIXELS -DDS_LUMINANCE = DDPF.LUMINANCE -DDS_LUMINANCEA = DDPF.LUMINANCE | DDPF.ALPHAPIXELS -DDS_ALPHA = DDPF.ALPHA -DDS_PAL8 = DDPF.PALETTEINDEXED8 - -DDS_HEADER_FLAGS_TEXTURE = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PIXELFORMAT -DDS_HEADER_FLAGS_MIPMAP = DDSD.MIPMAPCOUNT -DDS_HEADER_FLAGS_VOLUME = DDSD.DEPTH -DDS_HEADER_FLAGS_PITCH = DDSD.PITCH -DDS_HEADER_FLAGS_LINEARSIZE = DDSD.LINEARSIZE - -DDS_HEIGHT = DDSD.HEIGHT -DDS_WIDTH = DDSD.WIDTH - -DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS.TEXTURE -DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS.COMPLEX | DDSCAPS.MIPMAP -DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS.COMPLEX - -DDS_CUBEMAP_POSITIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEX -DDS_CUBEMAP_NEGATIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEX -DDS_CUBEMAP_POSITIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEY -DDS_CUBEMAP_NEGATIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEY -DDS_CUBEMAP_POSITIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEZ -DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEZ - -DXT1_FOURCC = D3DFMT.DXT1 -DXT3_FOURCC = D3DFMT.DXT3 -DXT5_FOURCC = D3DFMT.DXT5 - -DXGI_FORMAT_R8G8B8A8_TYPELESS = DXGI_FORMAT.R8G8B8A8_TYPELESS -DXGI_FORMAT_R8G8B8A8_UNORM = DXGI_FORMAT.R8G8B8A8_UNORM -DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = DXGI_FORMAT.R8G8B8A8_UNORM_SRGB -DXGI_FORMAT_BC5_TYPELESS = DXGI_FORMAT.BC5_TYPELESS -DXGI_FORMAT_BC5_UNORM = DXGI_FORMAT.BC5_UNORM -DXGI_FORMAT_BC5_SNORM = DXGI_FORMAT.BC5_SNORM -DXGI_FORMAT_BC6H_UF16 = DXGI_FORMAT.BC6H_UF16 -DXGI_FORMAT_BC6H_SF16 = DXGI_FORMAT.BC6H_SF16 -DXGI_FORMAT_BC7_TYPELESS = DXGI_FORMAT.BC7_TYPELESS -DXGI_FORMAT_BC7_UNORM = DXGI_FORMAT.BC7_UNORM -DXGI_FORMAT_BC7_UNORM_SRGB = DXGI_FORMAT.BC7_UNORM_SRGB - - -class DdsImageFile(ImageFile.ImageFile): - format = "DDS" - format_description = "DirectDraw Surface" - - def _open(self): - if not _accept(self.fp.read(4)): - msg = "not a DDS file" - raise SyntaxError(msg) - (header_size,) = struct.unpack("> (offset + 1) << (offset + 1) == mask: - offset += 1 - mask_offsets.append(offset) - mask_totals.append(mask >> offset) - - data = bytearray() - bytecount = bitcount // 8 - dest_length = self.state.xsize * self.state.ysize * len(masks) - while len(data) < dest_length: - value = int.from_bytes(self.fd.read(bytecount), "little") - for i, mask in enumerate(masks): - masked_value = value & mask - # Remove the zero padding, and scale it to 8 bits - data += o8( - int(((masked_value >> mask_offsets[i]) / mask_totals[i]) * 255) - ) - self.set_as_raw(data) - return -1, 0 - - -def _save(im, fp, filename): - if im.mode not in ("RGB", "RGBA", "L", "LA"): - msg = f"cannot write mode {im.mode} as DDS" - raise OSError(msg) - - alpha = im.mode[-1] == "A" - if im.mode[0] == "L": - pixel_flags = DDPF.LUMINANCE - rawmode = im.mode - if alpha: - rgba_mask = [0x000000FF, 0x000000FF, 0x000000FF] - else: - rgba_mask = [0xFF000000, 0xFF000000, 0xFF000000] - else: - pixel_flags = DDPF.RGB - rawmode = im.mode[::-1] - rgba_mask = [0x00FF0000, 0x0000FF00, 0x000000FF] - - if alpha: - r, g, b, a = im.split() - im = Image.merge("RGBA", (a, r, g, b)) - if alpha: - pixel_flags |= DDPF.ALPHAPIXELS - rgba_mask.append(0xFF000000 if alpha else 0) - - flags = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PITCH | DDSD.PIXELFORMAT - bitcount = len(im.getbands()) * 8 - pitch = (im.width * bitcount + 7) // 8 - - fp.write( - o32(DDS_MAGIC) - + struct.pack( - "<7I", - 124, # header size - flags, # flags - im.height, - im.width, - pitch, - 0, # depth - 0, # mipmaps - ) - + struct.pack("11I", *((0,) * 11)) # reserved - # pfsize, pfflags, fourcc, bitcount - + struct.pack("<4I", 32, pixel_flags, 0, bitcount) - + struct.pack("<4I", *rgba_mask) # dwRGBABitMask - + struct.pack("<5I", DDSCAPS.TEXTURE, 0, 0, 0, 0) - ) - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))] - ) - - -def _accept(prefix): - return prefix[:4] == b"DDS " - - -Image.register_open(DdsImageFile.format, DdsImageFile, _accept) -Image.register_decoder("dds_rgb", DdsRgbDecoder) -Image.register_save(DdsImageFile.format, _save) -Image.register_extension(DdsImageFile.format, ".dds") diff --git a/.flatpak-builder/cache/objects/c3/635b4880eedf1d24490e94a7b448a7478af597a74c359e5462ee15be302ae3.dirtree b/.flatpak-builder/cache/objects/c3/635b4880eedf1d24490e94a7b448a7478af597a74c359e5462ee15be302ae3.dirtree deleted file mode 100644 index 55c3704f0c71a240946e39a2877a29387de775fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5864 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 z 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 A%m4rY diff --git a/.flatpak-builder/cache/objects/c4/39852bdc84512611fb6972749b0a65cc9bd4d3399bff0d0a28be4f0cf1235b.file b/.flatpak-builder/cache/objects/c4/39852bdc84512611fb6972749b0a65cc9bd4d3399bff0d0a28be4f0cf1235b.file deleted file mode 100644 index 0b31f60..0000000 --- a/.flatpak-builder/cache/objects/c4/39852bdc84512611fb6972749b0a65cc9bd4d3399bff0d0a28be4f0cf1235b.file +++ /dev/null @@ -1,96 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard mode descriptors -# -# History: -# 2006-03-20 fl Added -# -# Copyright (c) 2006 by Secret Labs AB. -# Copyright (c) 2006 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import sys -from functools import lru_cache - - -class ModeDescriptor: - """Wrapper for mode strings.""" - - def __init__( - self, - mode: str, - bands: tuple[str, ...], - basemode: str, - basetype: str, - typestr: str, - ) -> None: - self.mode = mode - self.bands = bands - self.basemode = basemode - self.basetype = basetype - self.typestr = typestr - - def __str__(self) -> str: - return self.mode - - -@lru_cache -def getmode(mode: str) -> ModeDescriptor: - """Gets a mode descriptor for the given mode.""" - # initialize mode cache - endian = "<" if sys.byteorder == "little" else ">" - - modes = { - # core modes - # Bits need to be extended to bytes - "1": ("L", "L", ("1",), "|b1"), - "L": ("L", "L", ("L",), "|u1"), - "I": ("L", "I", ("I",), endian + "i4"), - "F": ("L", "F", ("F",), endian + "f4"), - "P": ("P", "L", ("P",), "|u1"), - "RGB": ("RGB", "L", ("R", "G", "B"), "|u1"), - "RGBX": ("RGB", "L", ("R", "G", "B", "X"), "|u1"), - "RGBA": ("RGB", "L", ("R", "G", "B", "A"), "|u1"), - "CMYK": ("RGB", "L", ("C", "M", "Y", "K"), "|u1"), - "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr"), "|u1"), - # UNDONE - unsigned |u1i1i1 - "LAB": ("RGB", "L", ("L", "A", "B"), "|u1"), - "HSV": ("RGB", "L", ("H", "S", "V"), "|u1"), - # extra experimental modes - "RGBa": ("RGB", "L", ("R", "G", "B", "a"), "|u1"), - "BGR;15": ("RGB", "L", ("B", "G", "R"), "|u1"), - "BGR;16": ("RGB", "L", ("B", "G", "R"), "|u1"), - "BGR;24": ("RGB", "L", ("B", "G", "R"), "|u1"), - "LA": ("L", "L", ("L", "A"), "|u1"), - "La": ("L", "L", ("L", "a"), "|u1"), - "PA": ("RGB", "L", ("P", "A"), "|u1"), - } - if mode in modes: - base_mode, base_type, bands, type_str = modes[mode] - return ModeDescriptor(mode, bands, base_mode, base_type, type_str) - - mapping_modes = { - # I;16 == I;16L, and I;32 == I;32L - "I;16": "u2", - "I;16BS": ">i2", - "I;16N": endian + "u2", - "I;16NS": endian + "i2", - "I;32": "u4", - "I;32L": "i4", - "I;32LS": "iPX8^A0GHgbp#^4t>x7|@pwf*bsQfb^x Q8Qfat1I=s_6j&EHIo{(LTmS$7 diff --git a/.flatpak-builder/cache/objects/c5/190a45bfdd44f82065f26cef395ac07fc516cca04766b930d60cf853604a3f.file b/.flatpak-builder/cache/objects/c5/190a45bfdd44f82065f26cef395ac07fc516cca04766b930d60cf853604a3f.file deleted file mode 100644 index 887b656..0000000 --- a/.flatpak-builder/cache/objects/c5/190a45bfdd44f82065f26cef395ac07fc516cca04766b930d60cf853604a3f.file +++ /dev/null @@ -1,72 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PIXAR raster support for PIL -# -# history: -# 97-01-29 fl Created -# -# notes: -# This is incomplete; it is based on a few samples created with -# Photoshop 2.5 and 3.0, and a summary description provided by -# Greg Coats . Hopefully, "L" and -# "RGBA" support will be added in future versions. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i16le as i16 - -# -# helpers - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"\200\350\000\000" - - -## -# Image plugin for PIXAR raster images. - - -class PixarImageFile(ImageFile.ImageFile): - format = "PIXAR" - format_description = "PIXAR raster image" - - def _open(self) -> None: - # assuming a 4-byte magic label - assert self.fp is not None - - s = self.fp.read(4) - if not _accept(s): - msg = "not a PIXAR file" - raise SyntaxError(msg) - - # read rest of header - s = s + self.fp.read(508) - - self._size = i16(s, 418), i16(s, 416) - - # get channel/depth descriptions - mode = i16(s, 424), i16(s, 426) - - if mode == (14, 2): - self._mode = "RGB" - # FIXME: to be continued... - - # create tile descriptor (assuming "dumped") - self.tile = [("raw", (0, 0) + self.size, 1024, (self.mode, 0, 1))] - - -# -# -------------------------------------------------------------------- - -Image.register_open(PixarImageFile.format, PixarImageFile, _accept) - -Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/.flatpak-builder/cache/objects/c5/965c5925db363a86f5c354e18a1734ce56e8896c7cf5b06875530bde4f78d9.file b/.flatpak-builder/cache/objects/c5/965c5925db363a86f5c354e18a1734ce56e8896c7cf5b06875530bde4f78d9.file deleted file mode 100644 index 95e8077..0000000 --- a/.flatpak-builder/cache/objects/c5/965c5925db363a86f5c354e18a1734ce56e8896c7cf5b06875530bde4f78d9.file +++ /dev/null @@ -1,476 +0,0 @@ -""" -Blizzard Mipmap Format (.blp) -Jerome Leclanche - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ - -BLP1 files, used mostly in Warcraft III, are not fully supported. -All types of BLP2 files used in World of Warcraft are supported. - -The BLP file structure consists of a header, up to 16 mipmaps of the -texture - -Texture sizes must be powers of two, though the two dimensions do -not have to be equal; 512x256 is valid, but 512x200 is not. -The first mipmap (mipmap #0) is the full size image; each subsequent -mipmap halves both dimensions. The final mipmap should be 1x1. - -BLP files come in many different flavours: -* JPEG-compressed (type == 0) - only supported for BLP1. -* RAW images (type == 1, encoding == 1). Each mipmap is stored as an - array of 8-bit values, one per pixel, left to right, top to bottom. - Each value is an index to the palette. -* DXT-compressed (type == 1, encoding == 2): -- DXT1 compression is used if alpha_encoding == 0. - - An additional alpha bit is used if alpha_depth == 1. - - DXT3 compression is used if alpha_encoding == 1. - - DXT5 compression is used if alpha_encoding == 7. -""" - -from __future__ import annotations - -import os -import struct -from enum import IntEnum -from io import BytesIO - -from . import Image, ImageFile - - -class Format(IntEnum): - JPEG = 0 - - -class Encoding(IntEnum): - UNCOMPRESSED = 1 - DXT = 2 - UNCOMPRESSED_RAW_BGRA = 3 - - -class AlphaEncoding(IntEnum): - DXT1 = 0 - DXT3 = 1 - DXT5 = 7 - - -def unpack_565(i): - return ((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3 - - -def decode_dxt1(data, alpha=False): - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 8 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block in range(blocks): - # Decode next 8-byte block. - idx = block * 8 - color0, color1, bits = struct.unpack_from("> 2 - - a = 0xFF - if control == 0: - r, g, b = r0, g0, b0 - elif control == 1: - r, g, b = r1, g1, b1 - elif control == 2: - if color0 > color1: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - else: - r = (r0 + r1) // 2 - g = (g0 + g1) // 2 - b = (b0 + b1) // 2 - elif control == 3: - if color0 > color1: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - else: - r, g, b, a = 0, 0, 0, 0 - - if alpha: - ret[j].extend([r, g, b, a]) - else: - ret[j].extend([r, g, b]) - - return ret - - -def decode_dxt3(data): - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block in range(blocks): - idx = block * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - bits = struct.unpack_from("<8B", block) - color0, color1 = struct.unpack_from(">= 4 - else: - high = True - a &= 0xF - a *= 17 # We get a value between 0 and 15 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -def decode_dxt5(data): - """ - input: one "row" of data (i.e. will produce 4 * width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block in range(blocks): - idx = block * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 - elif alphacode_index == 15: - alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) - else: # alphacode_index >= 18 and alphacode_index <= 45 - alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 - - if alphacode == 0: - a = a0 - elif alphacode == 1: - a = a1 - elif a0 > a1: - a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 - elif alphacode == 6: - a = 0 - elif alphacode == 7: - a = 255 - else: - a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -class BLPFormatError(NotImplementedError): - pass - - -def _accept(prefix): - return prefix[:4] in (b"BLP1", b"BLP2") - - -class BlpImageFile(ImageFile.ImageFile): - """ - Blizzard Mipmap Format - """ - - format = "BLP" - format_description = "Blizzard Mipmap Format" - - def _open(self): - self.magic = self.fp.read(4) - - self.fp.seek(5, os.SEEK_CUR) - (self._blp_alpha_depth,) = struct.unpack("vWJI3?p8r18xMQv0wCrlJ&dt;inW{F+3qVYqQEWVG@H3!o_ zZ)1Midi>qHZKc1K2wiAFJDJY&*QmYSICp z9^Yqa<(7UsMBIAMZaj6@N}P~Unw&tRax#+>OEUBGiW$n@@&B4}GttFWy6;j-xadZP zQ18G)O@}l(4b-FF%%9m$$T(fz^qkBjT_ZgM2G8aX@7<4yUpTFB**8Grd*@nTNxh4a z>E?B7%p%_`>M$f^lqP3pGRR5clJUGHmu=?v3g|vwqS5a&)%c-7-}H>rpSPRdRVlKX zO~@QIww(Or#GF)yAk9AB28+jgWI9beqNUgPal0K0`)_zgoTKijhuq^!lL#54&YqiE zk_ZmQPA}6h?xU_~NDl9fo&9x=&j1g~s&S!NtKgJNr>x7KbGMH$Dd=NFfMKHJoxyo{ozL&58T;gKrjuBp8NoKKm@TUCzkOklr2nd+=i%Tre;t! zk3l?s=EZmdyd-)C5pj|DEpqWE5)Aw}4e9mTLF_e^dr4g&yhKr!2j znvC{hy}PHY}5nxCr*K1GM_n9Ae4(y-oasJv-{@OVC-bmXC zj3Dmp@PmU~%XA3{$V3Ok1{O6Ai%a`mP!&|s*+dy&EXD6EeUdL=pb*)Z6((2LhK&(hi)_r+ri{iun38#j)7UD;E`(?~xQIqI ziLy0&aD_lNiN{wh%)W6VkPISHi?n3#I)T1~aL@32C=-~|f>e-|5b!XZCT~X@aYx<& z7w=i{9l+G2luk%_G;hbGGP=l)$@S5^P2O9M%X%GNVC-Ln7bc9`U;W=mUEqJ0 C?3kzk diff --git a/.flatpak-builder/cache/objects/c7/6a0784442e766d7780632f126542dd1d8714a9bb87d0d65cfcf209c49ceff4.file b/.flatpak-builder/cache/objects/c7/6a0784442e766d7780632f126542dd1d8714a9bb87d0d65cfcf209c49ceff4.file deleted file mode 100644 index b5c43268979a18db4d0164d450a2e1ca73a27a5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 NEB`|g#I;=3e*+E56Gi|4 diff --git a/.flatpak-builder/cache/objects/c8/f2e9a88b9d8de791dd66803b6e5ce83be7eca96685cc489ff5660ae07f4779.file b/.flatpak-builder/cache/objects/c8/f2e9a88b9d8de791dd66803b6e5ce83be7eca96685cc489ff5660ae07f4779.file deleted file mode 100644 index aefe25e9147edf5b8ca75e937c93a956bad515b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2691 zcmZt{U2hXdaQE)~?Zm_+ae_?ZI-p=wVkJc?3D62?Q&NhHh}s9gSQpN%R@E$LA_AnO%~DlYh1RMoTKKfqO2=Nd}5 zbk~7Io3wXZ0R7M#tts2xnzw6K4#_IgEQ$GEqi~E`J~^K+7_yNqAA0R#Ovc!u6OXn1`nJlC03$SQ z8$=~Zs*t3h(4+`mQUpk3hav)W@<*?_x2 zERmG6C80<#bG2qAvSr^6EgFt*ol`7{EL0M=+V*xJT_T;k1dC*r_n0HW0wA~?NED2S z+^Dh)hJsGV1cu4PLCk9jnW7~bs;2RTu_UI-ishTVn>Xa8PZ=vPOVU;Kw&h6W3W^GY zo?XU4D}bC-D609Ggd$qTauzZfT{SE*r_WnX6i^w@SG)xp+385(isjIu92w(`Q?N1p zX8@3|J$>t;jqua(lcDvY73V*J{xxI$&PM5JY3tIH`|I~BfzfJUv`z%iNG&+Ba%DGo zd^24MMytW7>5uNY{j09W{zv|`uPg3w)g3n7;kuLb53We7-dZ0Y_Imm@jy*m0B)lG8 zaYA|23H1!s{K3c99$nj%D*oeD|8cYR*F|7*iAIgssRWxvoG0@UKsJa0u+^Y~X@X&- zW0buILtCk`VVJ+u73jK26vlKZlifgQCBV%lVlKGwQh7P2rc#zSg)v#w5cj82-z>^n zljF=3SWY&qU}H=vs-9-qBHrrkBN6XW-!C_PC zuS)?3c)|uz>KFjW90Co^s4v}KlXm5A0;khi-}f19lI?DU`t5k(c*TkxcYxSg3lC`f z`mHv-V7A#xq(q_8fp_pWH)<#*CLpKfZ`I{t{y-txdWs_OK1Q;QH%(Py62scWr$?6! zgITUGXL;GMGeCyY5VAQofD&%3Ka39>f$5>TKoe{NIOur&695o+SHN_Ie!278(u@Ae z@VV;nIhfYE<16BBci&q2Cv8_#p&YI-x9vMK!fH`=&IynB~!wNZHCFjl7&%^RR7HLa_ diff --git a/.flatpak-builder/cache/objects/c9/d893a3d4528acc4369b3e6d9f6b28e59c323a378a107c90a4a5e7f9309f9b1.file b/.flatpak-builder/cache/objects/c9/d893a3d4528acc4369b3e6d9f6b28e59c323a378a107c90a4a5e7f9309f9b1.file deleted file mode 100644 index 2decb6e208fb96cd9b9dc7e50fcd78f924697dc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6074 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 SZQ2YJ`3FM%@fl6}4*n0A_9o^4 diff --git a/.flatpak-builder/cache/objects/c9/eec5934c7ed61f0e156e75f8441ed50b7fd8bc261bae1493785a825f5c7001.file b/.flatpak-builder/cache/objects/c9/eec5934c7ed61f0e156e75f8441ed50b7fd8bc261bae1493785a825f5c7001.file deleted file mode 100644 index d922bac..0000000 --- a/.flatpak-builder/cache/objects/c9/eec5934c7ed61f0e156e75f8441ed50b7fd8bc261bae1493785a825f5c7001.file +++ /dev/null @@ -1,1470 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PNG support code -# -# See "PNG (Portable Network Graphics) Specification, version 1.0; -# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). -# -# history: -# 1996-05-06 fl Created (couldn't resist it) -# 1996-12-14 fl Upgraded, added read and verify support (0.2) -# 1996-12-15 fl Separate PNG stream parser -# 1996-12-29 fl Added write support, added getchunks -# 1996-12-30 fl Eliminated circular references in decoder (0.3) -# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) -# 2001-02-08 fl Added transparency support (from Zircon) (0.5) -# 2001-04-16 fl Don't close data source in "open" method (0.6) -# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) -# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) -# 2004-09-20 fl Added PngInfo chunk container -# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) -# 2008-08-13 fl Added tRNS support for RGB images -# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) -# 2009-03-08 fl Added zTXT support (from Lowell Alleman) -# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) -# -# Copyright (c) 1997-2009 by Secret Labs AB -# Copyright (c) 1996 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import itertools -import logging -import re -import struct -import warnings -import zlib -from enum import IntEnum - -from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._binary import o16be as o16 -from ._binary import o32be as o32 - -logger = logging.getLogger(__name__) - -is_cid = re.compile(rb"\w\w\w\w").match - - -_MAGIC = b"\211PNG\r\n\032\n" - - -_MODES = { - # supported bits/color combinations, and corresponding modes/rawmodes - # Grayscale - (1, 0): ("1", "1"), - (2, 0): ("L", "L;2"), - (4, 0): ("L", "L;4"), - (8, 0): ("L", "L"), - (16, 0): ("I;16", "I;16B"), - # Truecolour - (8, 2): ("RGB", "RGB"), - (16, 2): ("RGB", "RGB;16B"), - # Indexed-colour - (1, 3): ("P", "P;1"), - (2, 3): ("P", "P;2"), - (4, 3): ("P", "P;4"), - (8, 3): ("P", "P"), - # Grayscale with alpha - (8, 4): ("LA", "LA"), - (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available - # Truecolour with alpha - (8, 6): ("RGBA", "RGBA"), - (16, 6): ("RGBA", "RGBA;16B"), -} - - -_simple_palette = re.compile(b"^\xff*\x00\xff*$") - -MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK -""" -Maximum decompressed size for a iTXt or zTXt chunk. -Eliminates decompression bombs where compressed chunks can expand 1000x. -See :ref:`Text in PNG File Format`. -""" -MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK -""" -Set the maximum total text chunk size. -See :ref:`Text in PNG File Format`. -""" - - -# APNG frame disposal modes -class Disposal(IntEnum): - OP_NONE = 0 - """ - No disposal is done on this frame before rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_BACKGROUND = 1 - """ - This frame’s modified region is cleared to fully transparent black before rendering - the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_PREVIOUS = 2 - """ - This frame’s modified region is reverted to the previous frame’s contents before - rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - - -# APNG frame blend modes -class Blend(IntEnum): - OP_SOURCE = 0 - """ - All color components of this frame, including alpha, overwrite the previous output - image contents. - See :ref:`Saving APNG sequences`. - """ - OP_OVER = 1 - """ - This frame should be alpha composited with the previous output image contents. - See :ref:`Saving APNG sequences`. - """ - - -def _safe_zlib_decompress(s): - dobj = zlib.decompressobj() - plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) - if dobj.unconsumed_tail: - msg = "Decompressed Data Too Large" - raise ValueError(msg) - return plaintext - - -def _crc32(data, seed=0): - return zlib.crc32(data, seed) & 0xFFFFFFFF - - -# -------------------------------------------------------------------- -# Support classes. Suitable for PNG and related formats like MNG etc. - - -class ChunkStream: - def __init__(self, fp): - self.fp = fp - self.queue = [] - - def read(self): - """Fetch a new chunk. Returns header information.""" - cid = None - - if self.queue: - cid, pos, length = self.queue.pop() - self.fp.seek(pos) - else: - s = self.fp.read(8) - cid = s[4:] - pos = self.fp.tell() - length = i32(s) - - if not is_cid(cid): - if not ImageFile.LOAD_TRUNCATED_IMAGES: - msg = f"broken PNG file (chunk {repr(cid)})" - raise SyntaxError(msg) - - return cid, pos, length - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def close(self): - self.queue = self.fp = None - - def push(self, cid, pos, length): - self.queue.append((cid, pos, length)) - - def call(self, cid, pos, length): - """Call the appropriate chunk handler""" - - logger.debug("STREAM %r %s %s", cid, pos, length) - return getattr(self, "chunk_" + cid.decode("ascii"))(pos, length) - - def crc(self, cid, data): - """Read and verify checksum""" - - # Skip CRC checks for ancillary chunks if allowed to load truncated - # images - # 5th byte of first char is 1 [specs, section 5.4] - if ImageFile.LOAD_TRUNCATED_IMAGES and (cid[0] >> 5 & 1): - self.crc_skip(cid, data) - return - - try: - crc1 = _crc32(data, _crc32(cid)) - crc2 = i32(self.fp.read(4)) - if crc1 != crc2: - msg = f"broken PNG file (bad header checksum in {repr(cid)})" - raise SyntaxError(msg) - except struct.error as e: - msg = f"broken PNG file (incomplete checksum in {repr(cid)})" - raise SyntaxError(msg) from e - - def crc_skip(self, cid, data): - """Read checksum""" - - self.fp.read(4) - - def verify(self, endchunk=b"IEND"): - # Simple approach; just calculate checksum for all remaining - # blocks. Must be called directly after open. - - cids = [] - - while True: - try: - cid, pos, length = self.read() - except struct.error as e: - msg = "truncated PNG file" - raise OSError(msg) from e - - if cid == endchunk: - break - self.crc(cid, ImageFile._safe_read(self.fp, length)) - cids.append(cid) - - return cids - - -class iTXt(str): - """ - Subclass of string to allow iTXt chunks to look like strings while - keeping their extra information - - """ - - @staticmethod - def __new__(cls, text, lang=None, tkey=None): - """ - :param cls: the class to use when creating the instance - :param text: value for this key - :param lang: language code - :param tkey: UTF-8 version of the key name - """ - - self = str.__new__(cls, text) - self.lang = lang - self.tkey = tkey - return self - - -class PngInfo: - """ - PNG chunk container (for use with save(pnginfo=)) - - """ - - def __init__(self): - self.chunks = [] - - def add(self, cid, data, after_idat=False): - """Appends an arbitrary chunk. Use with caution. - - :param cid: a byte string, 4 bytes long. - :param data: a byte string of the encoded data - :param after_idat: for use with private chunks. Whether the chunk - should be written after IDAT - - """ - - chunk = [cid, data] - if after_idat: - chunk.append(True) - self.chunks.append(tuple(chunk)) - - def add_itxt(self, key, value, lang="", tkey="", zip=False): - """Appends an iTXt chunk. - - :param key: latin-1 encodable text key name - :param value: value for this key - :param lang: language code - :param tkey: UTF-8 version of the key name - :param zip: compression flag - - """ - - if not isinstance(key, bytes): - key = key.encode("latin-1", "strict") - if not isinstance(value, bytes): - value = value.encode("utf-8", "strict") - if not isinstance(lang, bytes): - lang = lang.encode("utf-8", "strict") - if not isinstance(tkey, bytes): - tkey = tkey.encode("utf-8", "strict") - - if zip: - self.add( - b"iTXt", - key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value), - ) - else: - self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + value) - - def add_text(self, key, value, zip=False): - """Appends a text chunk. - - :param key: latin-1 encodable text key name - :param value: value for this key, text or an - :py:class:`PIL.PngImagePlugin.iTXt` instance - :param zip: compression flag - - """ - if isinstance(value, iTXt): - return self.add_itxt(key, value, value.lang, value.tkey, zip=zip) - - # The tEXt chunk stores latin-1 text - if not isinstance(value, bytes): - try: - value = value.encode("latin-1", "strict") - except UnicodeError: - return self.add_itxt(key, value, zip=zip) - - if not isinstance(key, bytes): - key = key.encode("latin-1", "strict") - - if zip: - self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) - else: - self.add(b"tEXt", key + b"\0" + value) - - -# -------------------------------------------------------------------- -# PNG image stream (IHDR/IEND) - - -class PngStream(ChunkStream): - def __init__(self, fp): - super().__init__(fp) - - # local copies of Image attributes - self.im_info = {} - self.im_text = {} - self.im_size = (0, 0) - self.im_mode = None - self.im_tile = None - self.im_palette = None - self.im_custom_mimetype = None - self.im_n_frames = None - self._seq_num = None - self.rewind_state = None - - self.text_memory = 0 - - def check_text_memory(self, chunklen): - self.text_memory += chunklen - if self.text_memory > MAX_TEXT_MEMORY: - msg = ( - "Too much memory used in text chunks: " - f"{self.text_memory}>MAX_TEXT_MEMORY" - ) - raise ValueError(msg) - - def save_rewind(self): - self.rewind_state = { - "info": self.im_info.copy(), - "tile": self.im_tile, - "seq_num": self._seq_num, - } - - def rewind(self): - self.im_info = self.rewind_state["info"].copy() - self.im_tile = self.rewind_state["tile"] - self._seq_num = self.rewind_state["seq_num"] - - def chunk_iCCP(self, pos, length): - # ICC profile - s = ImageFile._safe_read(self.fp, length) - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - i = s.find(b"\0") - logger.debug("iCCP profile name %r", s[:i]) - comp_method = s[i + 1] - logger.debug("Compression method %s", comp_method) - if comp_method != 0: - msg = f"Unknown compression method {comp_method} in iCCP chunk" - raise SyntaxError(msg) - try: - icc_profile = _safe_zlib_decompress(s[i + 2 :]) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - icc_profile = None - else: - raise - except zlib.error: - icc_profile = None # FIXME - self.im_info["icc_profile"] = icc_profile - return s - - def chunk_IHDR(self, pos, length): - # image header - s = ImageFile._safe_read(self.fp, length) - if length < 13: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated IHDR chunk" - raise ValueError(msg) - self.im_size = i32(s, 0), i32(s, 4) - try: - self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] - except Exception: - pass - if s[12]: - self.im_info["interlace"] = 1 - if s[11]: - msg = "unknown filter category" - raise SyntaxError(msg) - return s - - def chunk_IDAT(self, pos, length): - # image data - if "bbox" in self.im_info: - tile = [("zip", self.im_info["bbox"], pos, self.im_rawmode)] - else: - if self.im_n_frames is not None: - self.im_info["default_image"] = True - tile = [("zip", (0, 0) + self.im_size, pos, self.im_rawmode)] - self.im_tile = tile - self.im_idat = length - msg = "image data found" - raise EOFError(msg) - - def chunk_IEND(self, pos, length): - msg = "end of PNG image" - raise EOFError(msg) - - def chunk_PLTE(self, pos, length): - # palette - s = ImageFile._safe_read(self.fp, length) - if self.im_mode == "P": - self.im_palette = "RGB", s - return s - - def chunk_tRNS(self, pos, length): - # transparency - s = ImageFile._safe_read(self.fp, length) - if self.im_mode == "P": - if _simple_palette.match(s): - # tRNS contains only one full-transparent entry, - # other entries are full opaque - i = s.find(b"\0") - if i >= 0: - self.im_info["transparency"] = i - else: - # otherwise, we have a byte string with one alpha value - # for each palette entry - self.im_info["transparency"] = s - elif self.im_mode in ("1", "L", "I;16"): - self.im_info["transparency"] = i16(s) - elif self.im_mode == "RGB": - self.im_info["transparency"] = i16(s), i16(s, 2), i16(s, 4) - return s - - def chunk_gAMA(self, pos, length): - # gamma setting - s = ImageFile._safe_read(self.fp, length) - self.im_info["gamma"] = i32(s) / 100000.0 - return s - - def chunk_cHRM(self, pos, length): - # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 - # WP x,y, Red x,y, Green x,y Blue x,y - - s = ImageFile._safe_read(self.fp, length) - raw_vals = struct.unpack(">%dI" % (len(s) // 4), s) - self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals) - return s - - def chunk_sRGB(self, pos, length): - # srgb rendering intent, 1 byte - # 0 perceptual - # 1 relative colorimetric - # 2 saturation - # 3 absolute colorimetric - - s = ImageFile._safe_read(self.fp, length) - if length < 1: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated sRGB chunk" - raise ValueError(msg) - self.im_info["srgb"] = s[0] - return s - - def chunk_pHYs(self, pos, length): - # pixels per unit - s = ImageFile._safe_read(self.fp, length) - if length < 9: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated pHYs chunk" - raise ValueError(msg) - px, py = i32(s, 0), i32(s, 4) - unit = s[8] - if unit == 1: # meter - dpi = px * 0.0254, py * 0.0254 - self.im_info["dpi"] = dpi - elif unit == 0: - self.im_info["aspect"] = px, py - return s - - def chunk_tEXt(self, pos, length): - # text - s = ImageFile._safe_read(self.fp, length) - try: - k, v = s.split(b"\0", 1) - except ValueError: - # fallback for broken tEXt tags - k = s - v = b"" - if k: - k = k.decode("latin-1", "strict") - v_str = v.decode("latin-1", "replace") - - self.im_info[k] = v if k == "exif" else v_str - self.im_text[k] = v_str - self.check_text_memory(len(v_str)) - - return s - - def chunk_zTXt(self, pos, length): - # compressed text - s = ImageFile._safe_read(self.fp, length) - try: - k, v = s.split(b"\0", 1) - except ValueError: - k = s - v = b"" - if v: - comp_method = v[0] - else: - comp_method = 0 - if comp_method != 0: - msg = f"Unknown compression method {comp_method} in zTXt chunk" - raise SyntaxError(msg) - try: - v = _safe_zlib_decompress(v[1:]) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - v = b"" - else: - raise - except zlib.error: - v = b"" - - if k: - k = k.decode("latin-1", "strict") - v = v.decode("latin-1", "replace") - - self.im_info[k] = self.im_text[k] = v - self.check_text_memory(len(v)) - - return s - - def chunk_iTXt(self, pos, length): - # international text - r = s = ImageFile._safe_read(self.fp, length) - try: - k, r = r.split(b"\0", 1) - except ValueError: - return s - if len(r) < 2: - return s - cf, cm, r = r[0], r[1], r[2:] - try: - lang, tk, v = r.split(b"\0", 2) - except ValueError: - return s - if cf != 0: - if cm == 0: - try: - v = _safe_zlib_decompress(v) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - else: - raise - except zlib.error: - return s - else: - return s - try: - k = k.decode("latin-1", "strict") - lang = lang.decode("utf-8", "strict") - tk = tk.decode("utf-8", "strict") - v = v.decode("utf-8", "strict") - except UnicodeError: - return s - - self.im_info[k] = self.im_text[k] = iTXt(v, lang, tk) - self.check_text_memory(len(v)) - - return s - - def chunk_eXIf(self, pos, length): - s = ImageFile._safe_read(self.fp, length) - self.im_info["exif"] = b"Exif\x00\x00" + s - return s - - # APNG chunks - def chunk_acTL(self, pos, length): - s = ImageFile._safe_read(self.fp, length) - if length < 8: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "APNG contains truncated acTL chunk" - raise ValueError(msg) - if self.im_n_frames is not None: - self.im_n_frames = None - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - n_frames = i32(s) - if n_frames == 0 or n_frames > 0x80000000: - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - self.im_n_frames = n_frames - self.im_info["loop"] = i32(s, 4) - self.im_custom_mimetype = "image/apng" - return s - - def chunk_fcTL(self, pos, length): - s = ImageFile._safe_read(self.fp, length) - if length < 26: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "APNG contains truncated fcTL chunk" - raise ValueError(msg) - seq = i32(s) - if (self._seq_num is None and seq != 0) or ( - self._seq_num is not None and self._seq_num != seq - 1 - ): - msg = "APNG contains frame sequence errors" - raise SyntaxError(msg) - self._seq_num = seq - width, height = i32(s, 4), i32(s, 8) - px, py = i32(s, 12), i32(s, 16) - im_w, im_h = self.im_size - if px + width > im_w or py + height > im_h: - msg = "APNG contains invalid frames" - raise SyntaxError(msg) - self.im_info["bbox"] = (px, py, px + width, py + height) - delay_num, delay_den = i16(s, 20), i16(s, 22) - if delay_den == 0: - delay_den = 100 - self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 - self.im_info["disposal"] = s[24] - self.im_info["blend"] = s[25] - return s - - def chunk_fdAT(self, pos, length): - if length < 4: - if ImageFile.LOAD_TRUNCATED_IMAGES: - s = ImageFile._safe_read(self.fp, length) - return s - msg = "APNG contains truncated fDAT chunk" - raise ValueError(msg) - s = ImageFile._safe_read(self.fp, 4) - seq = i32(s) - if self._seq_num != seq - 1: - msg = "APNG contains frame sequence errors" - raise SyntaxError(msg) - self._seq_num = seq - return self.chunk_IDAT(pos + 4, length - 4) - - -# -------------------------------------------------------------------- -# PNG reader - - -def _accept(prefix): - return prefix[:8] == _MAGIC - - -## -# Image plugin for PNG images. - - -class PngImageFile(ImageFile.ImageFile): - format = "PNG" - format_description = "Portable network graphics" - - def _open(self): - if not _accept(self.fp.read(8)): - msg = "not a PNG file" - raise SyntaxError(msg) - self._fp = self.fp - self.__frame = 0 - - # - # Parse headers up to the first IDAT or fDAT chunk - - self.private_chunks = [] - self.png = PngStream(self.fp) - - while True: - # - # get next chunk - - cid, pos, length = self.png.read() - - try: - s = self.png.call(cid, pos, length) - except EOFError: - break - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s)) - - self.png.crc(cid, s) - - # - # Copy relevant attributes from the PngStream. An alternative - # would be to let the PngStream class modify these attributes - # directly, but that introduces circular references which are - # difficult to break if things go wrong in the decoder... - # (believe me, I've tried ;-) - - self._mode = self.png.im_mode - self._size = self.png.im_size - self.info = self.png.im_info - self._text = None - self.tile = self.png.im_tile - self.custom_mimetype = self.png.im_custom_mimetype - self.n_frames = self.png.im_n_frames or 1 - self.default_image = self.info.get("default_image", False) - - if self.png.im_palette: - rawmode, data = self.png.im_palette - self.palette = ImagePalette.raw(rawmode, data) - - if cid == b"fdAT": - self.__prepare_idat = length - 4 - else: - self.__prepare_idat = length # used by load_prepare() - - if self.png.im_n_frames is not None: - self._close_exclusive_fp_after_loading = False - self.png.save_rewind() - self.__rewind_idat = self.__prepare_idat - self.__rewind = self._fp.tell() - if self.default_image: - # IDAT chunk contains default image and not first animation frame - self.n_frames += 1 - self._seek(0) - self.is_animated = self.n_frames > 1 - - @property - def text(self): - # experimental - if self._text is None: - # iTxt, tEXt and zTXt chunks may appear at the end of the file - # So load the file to ensure that they are read - if self.is_animated: - frame = self.__frame - # for APNG, seek to the final frame before loading - self.seek(self.n_frames - 1) - self.load() - if self.is_animated: - self.seek(frame) - return self._text - - def verify(self): - """Verify PNG file""" - - if self.fp is None: - msg = "verify must be called directly after open" - raise RuntimeError(msg) - - # back up to beginning of IDAT block - self.fp.seek(self.tile[0][2] - 8) - - self.png.verify() - self.png.close() - - if self._exclusive_fp: - self.fp.close() - self.fp = None - - def seek(self, frame): - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0, True) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - msg = "no more images in APNG file" - raise EOFError(msg) from e - - def _seek(self, frame, rewind=False): - if frame == 0: - if rewind: - self._fp.seek(self.__rewind) - self.png.rewind() - self.__prepare_idat = self.__rewind_idat - self.im = None - if self.pyaccess: - self.pyaccess = None - self.info = self.png.im_info - self.tile = self.png.im_tile - self.fp = self._fp - self._prev_im = None - self.dispose = None - self.default_image = self.info.get("default_image", False) - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - self.dispose_extent = self.info.get("bbox") - self.__frame = 0 - else: - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - - # ensure previous frame was loaded - self.load() - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - self._prev_im = self.im.copy() - - self.fp = self._fp - - # advance to the next frame - if self.__prepare_idat: - ImageFile._safe_read(self.fp, self.__prepare_idat) - self.__prepare_idat = 0 - frame_start = False - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - msg = "No more images in APNG file" - raise EOFError(msg) - if cid == b"fcTL": - if frame_start: - # there must be at least one fdAT chunk between fcTL chunks - msg = "APNG missing frame data" - raise SyntaxError(msg) - frame_start = True - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - if frame_start: - self.__prepare_idat = length - break - ImageFile._safe_read(self.fp, length) - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - ImageFile._safe_read(self.fp, length) - - self.__frame = frame - self.tile = self.png.im_tile - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - self.dispose_extent = self.info.get("bbox") - - if not self.tile: - msg = "image not found in APNG frame" - raise EOFError(msg) - - # setup frame disposal (actual disposal done when needed in the next _seek()) - if self._prev_im is None and self.dispose_op == Disposal.OP_PREVIOUS: - self.dispose_op = Disposal.OP_BACKGROUND - - if self.dispose_op == Disposal.OP_PREVIOUS: - self.dispose = self._prev_im.copy() - self.dispose = self._crop(self.dispose, self.dispose_extent) - elif self.dispose_op == Disposal.OP_BACKGROUND: - self.dispose = Image.core.fill(self.mode, self.size) - self.dispose = self._crop(self.dispose, self.dispose_extent) - else: - self.dispose = None - - def tell(self): - return self.__frame - - def load_prepare(self): - """internal: prepare to read PNG file""" - - if self.info.get("interlace"): - self.decoderconfig = self.decoderconfig + (1,) - - self.__idat = self.__prepare_idat # used by load_read() - ImageFile.ImageFile.load_prepare(self) - - def load_read(self, read_bytes): - """internal: read more image data""" - - while self.__idat == 0: - # end of chunk, skip forward to next one - - self.fp.read(4) # CRC - - cid, pos, length = self.png.read() - - if cid not in [b"IDAT", b"DDAT", b"fdAT"]: - self.png.push(cid, pos, length) - return b"" - - if cid == b"fdAT": - try: - self.png.call(cid, pos, length) - except EOFError: - pass - self.__idat = length - 4 # sequence_num has already been read - else: - self.__idat = length # empty chunks are allowed - - # read more data from this chunk - if read_bytes <= 0: - read_bytes = self.__idat - else: - read_bytes = min(read_bytes, self.__idat) - - self.__idat = self.__idat - read_bytes - - return self.fp.read(read_bytes) - - def load_end(self): - """internal: finished reading image data""" - if self.__idat != 0: - self.fp.read(self.__idat) - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - break - elif cid == b"fcTL" and self.is_animated: - # start of the next frame, stop reading - self.__prepare_idat = 0 - self.png.push(cid, pos, length) - break - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - try: - ImageFile._safe_read(self.fp, length) - except OSError as e: - if ImageFile.LOAD_TRUNCATED_IMAGES: - break - else: - raise e - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s, True)) - self._text = self.png.im_text - if not self.is_animated: - self.png.close() - self.png = None - else: - if self._prev_im and self.blend_op == Blend.OP_OVER: - updated = self._crop(self.im, self.dispose_extent) - if self.im.mode == "RGB" and "transparency" in self.info: - mask = updated.convert_transparent( - "RGBA", self.info["transparency"] - ) - else: - mask = updated.convert("RGBA") - self._prev_im.paste(updated, self.dispose_extent, mask) - self.im = self._prev_im - if self.pyaccess: - self.pyaccess = None - - def _getexif(self): - if "exif" not in self.info: - self.load() - if "exif" not in self.info and "Raw profile type exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def getexif(self): - if "exif" not in self.info: - self.load() - - return super().getexif() - - def getxmp(self): - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - return ( - self._getxmp(self.info["XML:com.adobe.xmp"]) - if "XML:com.adobe.xmp" in self.info - else {} - ) - - -# -------------------------------------------------------------------- -# PNG writer - -_OUTMODES = { - # supported PIL modes, and corresponding rawmodes/bits/color combinations - "1": ("1", b"\x01\x00"), - "L;1": ("L;1", b"\x01\x00"), - "L;2": ("L;2", b"\x02\x00"), - "L;4": ("L;4", b"\x04\x00"), - "L": ("L", b"\x08\x00"), - "LA": ("LA", b"\x08\x04"), - "I": ("I;16B", b"\x10\x00"), - "I;16": ("I;16B", b"\x10\x00"), - "I;16B": ("I;16B", b"\x10\x00"), - "P;1": ("P;1", b"\x01\x03"), - "P;2": ("P;2", b"\x02\x03"), - "P;4": ("P;4", b"\x04\x03"), - "P": ("P", b"\x08\x03"), - "RGB": ("RGB", b"\x08\x02"), - "RGBA": ("RGBA", b"\x08\x06"), -} - - -def putchunk(fp, cid, *data): - """Write a PNG chunk (including CRC field)""" - - data = b"".join(data) - - fp.write(o32(len(data)) + cid) - fp.write(data) - crc = _crc32(data, _crc32(cid)) - fp.write(o32(crc)) - - -class _idat: - # wrap output from the encoder in IDAT chunks - - def __init__(self, fp, chunk): - self.fp = fp - self.chunk = chunk - - def write(self, data): - self.chunk(self.fp, b"IDAT", data) - - -class _fdat: - # wrap encoder output in fdAT chunks - - def __init__(self, fp, chunk, seq_num): - self.fp = fp - self.chunk = chunk - self.seq_num = seq_num - - def write(self, data): - self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) - self.seq_num += 1 - - -def _write_multiple_frames(im, fp, chunk, rawmode, default_image, append_images): - duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) - loop = im.encoderinfo.get("loop", im.info.get("loop", 0)) - disposal = im.encoderinfo.get("disposal", im.info.get("disposal", Disposal.OP_NONE)) - blend = im.encoderinfo.get("blend", im.info.get("blend", Blend.OP_SOURCE)) - - if default_image: - chain = itertools.chain(append_images) - else: - chain = itertools.chain([im], append_images) - - im_frames = [] - frame_count = 0 - for im_seq in chain: - for im_frame in ImageSequence.Iterator(im_seq): - if im_frame.mode == rawmode: - im_frame = im_frame.copy() - else: - im_frame = im_frame.convert(rawmode) - encoderinfo = im.encoderinfo.copy() - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - if isinstance(blend, (list, tuple)): - encoderinfo["blend"] = blend[frame_count] - frame_count += 1 - - if im_frames: - previous = im_frames[-1] - prev_disposal = previous["encoderinfo"].get("disposal") - prev_blend = previous["encoderinfo"].get("blend") - if prev_disposal == Disposal.OP_PREVIOUS and len(im_frames) < 2: - prev_disposal = Disposal.OP_BACKGROUND - - if prev_disposal == Disposal.OP_BACKGROUND: - base_im = previous["im"].copy() - dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0)) - bbox = previous["bbox"] - if bbox: - dispose = dispose.crop(bbox) - else: - bbox = (0, 0) + im.size - base_im.paste(dispose, bbox) - elif prev_disposal == Disposal.OP_PREVIOUS: - base_im = im_frames[-2]["im"] - else: - base_im = previous["im"] - delta = ImageChops.subtract_modulo( - im_frame.convert("RGBA"), base_im.convert("RGBA") - ) - bbox = delta.getbbox(alpha_only=False) - if ( - not bbox - and prev_disposal == encoderinfo.get("disposal") - and prev_blend == encoderinfo.get("blend") - ): - previous["encoderinfo"]["duration"] += encoderinfo.get( - "duration", duration - ) - continue - else: - bbox = None - if "duration" not in encoderinfo: - encoderinfo["duration"] = duration - im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) - - if len(im_frames) == 1 and not default_image: - return im_frames[0]["im"] - - # animation control - chunk( - fp, - b"acTL", - o32(len(im_frames)), # 0: num_frames - o32(loop), # 4: num_plays - ) - - # default image IDAT (if it exists) - if default_image: - if im.mode != rawmode: - im = im.convert(rawmode) - ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) - - seq_num = 0 - for frame, frame_data in enumerate(im_frames): - im_frame = frame_data["im"] - if not frame_data["bbox"]: - bbox = (0, 0) + im_frame.size - else: - bbox = frame_data["bbox"] - im_frame = im_frame.crop(bbox) - size = im_frame.size - encoderinfo = frame_data["encoderinfo"] - frame_duration = int(round(encoderinfo["duration"])) - frame_disposal = encoderinfo.get("disposal", disposal) - frame_blend = encoderinfo.get("blend", blend) - # frame control - chunk( - fp, - b"fcTL", - o32(seq_num), # sequence_number - o32(size[0]), # width - o32(size[1]), # height - o32(bbox[0]), # x_offset - o32(bbox[1]), # y_offset - o16(frame_duration), # delay_numerator - o16(1000), # delay_denominator - o8(frame_disposal), # dispose_op - o8(frame_blend), # blend_op - ) - seq_num += 1 - # frame data - if frame == 0 and not default_image: - # first frame must be in IDAT chunks for backwards compatibility - ImageFile._save( - im_frame, - _idat(fp, chunk), - [("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - else: - fdat_chunks = _fdat(fp, chunk, seq_num) - ImageFile._save( - im_frame, - fdat_chunks, - [("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - seq_num = fdat_chunks.seq_num - - -def _save_all(im, fp, filename): - _save(im, fp, filename, save_all=True) - - -def _save(im, fp, filename, chunk=putchunk, save_all=False): - # save an image to disk (called by the save method) - - if save_all: - default_image = im.encoderinfo.get( - "default_image", im.info.get("default_image") - ) - modes = set() - sizes = set() - append_images = im.encoderinfo.get("append_images", []) - for im_seq in itertools.chain([im], append_images): - for im_frame in ImageSequence.Iterator(im_seq): - modes.add(im_frame.mode) - sizes.add(im_frame.size) - for mode in ("RGBA", "RGB", "P"): - if mode in modes: - break - else: - mode = modes.pop() - size = tuple(max(frame_size[i] for frame_size in sizes) for i in range(2)) - else: - size = im.size - mode = im.mode - - if mode == "P": - # - # attempt to minimize storage requirements for palette images - if "bits" in im.encoderinfo: - # number of bits specified by user - colors = min(1 << im.encoderinfo["bits"], 256) - else: - # check palette contents - if im.palette: - colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 1) - else: - colors = 256 - - if colors <= 16: - if colors <= 2: - bits = 1 - elif colors <= 4: - bits = 2 - else: - bits = 4 - mode = f"{mode};{bits}" - - # encoder options - im.encoderconfig = ( - im.encoderinfo.get("optimize", False), - im.encoderinfo.get("compress_level", -1), - im.encoderinfo.get("compress_type", -1), - im.encoderinfo.get("dictionary", b""), - ) - - # get the corresponding PNG mode - try: - rawmode, mode = _OUTMODES[mode] - except KeyError as e: - msg = f"cannot write mode {mode} as PNG" - raise OSError(msg) from e - - # - # write minimal PNG file - - fp.write(_MAGIC) - - chunk( - fp, - b"IHDR", - o32(size[0]), # 0: size - o32(size[1]), - mode, # 8: depth/type - b"\0", # 10: compression - b"\0", # 11: filter category - b"\0", # 12: interlace flag - ) - - chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"] - - icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - # ICC profile - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - name = b"ICC Profile" - data = name + b"\0\0" + zlib.compress(icc) - chunk(fp, b"iCCP", data) - - # You must either have sRGB or iCCP. - # Disallow sRGB chunks when an iCCP-chunk has been emitted. - chunks.remove(b"sRGB") - - info = im.encoderinfo.get("pnginfo") - if info: - chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - elif cid in chunks_multiple_allowed: - chunk(fp, cid, data) - elif cid[1:2].islower(): - # Private chunk - after_idat = info_chunk[2:3] - if not after_idat: - chunk(fp, cid, data) - - if im.mode == "P": - palette_byte_number = colors * 3 - palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] - while len(palette_bytes) < palette_byte_number: - palette_bytes += b"\0" - chunk(fp, b"PLTE", palette_bytes) - - transparency = im.encoderinfo.get("transparency", im.info.get("transparency", None)) - - if transparency or transparency == 0: - if im.mode == "P": - # limit to actual palette size - alpha_bytes = colors - if isinstance(transparency, bytes): - chunk(fp, b"tRNS", transparency[:alpha_bytes]) - else: - transparency = max(0, min(255, transparency)) - alpha = b"\xFF" * transparency + b"\0" - chunk(fp, b"tRNS", alpha[:alpha_bytes]) - elif im.mode in ("1", "L", "I", "I;16"): - transparency = max(0, min(65535, transparency)) - chunk(fp, b"tRNS", o16(transparency)) - elif im.mode == "RGB": - red, green, blue = transparency - chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) - else: - if "transparency" in im.encoderinfo: - # don't bother with transparency if it's an RGBA - # and it's in the info dict. It's probably just stale. - msg = "cannot use transparency for this mode" - raise OSError(msg) - else: - if im.mode == "P" and im.im.getpalettemode() == "RGBA": - alpha = im.im.getpalette("RGBA", "A") - alpha_bytes = colors - chunk(fp, b"tRNS", alpha[:alpha_bytes]) - - dpi = im.encoderinfo.get("dpi") - if dpi: - chunk( - fp, - b"pHYs", - o32(int(dpi[0] / 0.0254 + 0.5)), - o32(int(dpi[1] / 0.0254 + 0.5)), - b"\x01", - ) - - if info: - chunks = [b"bKGD", b"hIST"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - - exif = im.encoderinfo.get("exif") - if exif: - if isinstance(exif, Image.Exif): - exif = exif.tobytes(8) - if exif.startswith(b"Exif\x00\x00"): - exif = exif[6:] - chunk(fp, b"eXIf", exif) - - if save_all: - im = _write_multiple_frames( - im, fp, chunk, rawmode, default_image, append_images - ) - if im: - ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) - - if info: - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid[1:2].islower(): - # Private chunk - after_idat = info_chunk[2:3] - if after_idat: - chunk(fp, cid, data) - - chunk(fp, b"IEND", b"") - - if hasattr(fp, "flush"): - fp.flush() - - -# -------------------------------------------------------------------- -# PNG chunk converter - - -def getchunks(im, **params): - """Return a list of PNG chunks representing this image.""" - - class collector: - data = [] - - def write(self, data): - pass - - def append(self, chunk): - self.data.append(chunk) - - def append(fp, cid, *data): - data = b"".join(data) - crc = o32(_crc32(data, _crc32(cid))) - fp.append((cid, data, crc)) - - fp = collector() - - try: - im.encoderinfo = params - _save(im, fp, None, append) - finally: - del im.encoderinfo - - return fp.data - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(PngImageFile.format, PngImageFile, _accept) -Image.register_save(PngImageFile.format, _save) -Image.register_save_all(PngImageFile.format, _save_all) - -Image.register_extensions(PngImageFile.format, [".png", ".apng"]) - -Image.register_mime(PngImageFile.format, "image/png") diff --git a/.flatpak-builder/cache/objects/ca/5094939afbc20a7ab07f42a2285075428826d5f1c80c01b305647688b97530.file b/.flatpak-builder/cache/objects/ca/5094939afbc20a7ab07f42a2285075428826d5f1c80c01b305647688b97530.file deleted file mode 100644 index 7978ee22d26e68834e6d0b41f8c4c245bc711481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4155 zcmd5<|8G;*6~Fg=iJu)iCQhjB5Woo`iD^k15JTG-Gz3C3LFhz(XkATjp5JqDc(J|v zUP?%vDnd*%C=#he1(Q&0YEfswS~>uI*)Yy^6;DV2Y-9^uZ@2I?=-o_(Va)Y+$9>(s6iHJ zj8fzULx>5Qs7Z#nAjPBwIVOW#zCmIg0y#&tjvGXC>GHg*q3=E{^Z*y*Ev5)Wm*(A# zcU_tHGNgo}Xm>4%x zmVP)JPh0^*&GGkU&W~S6C0cA9%U-ixYCMt9vljD#o__e5K_IK7(%HQ}xIVEyxb~AT zf*X6cI){tW@D6m51d>LpV@7wTLGnBBQ718~5!hE66Ez_wX<|&)B-~TJvo74#n35++ zs=00`F*oNF;5>P3pb$Nh6oF;P>rq#mJ>&W_vanWg^q^K*5`eAdEf}nkoI@5%*h1M=CjNJe zuEUPNY{wI;$5{leax}f*2T`4Tf>92yNmmeM)aal9{SKZW_crwBNCD&OrKZX4YhgWr zo$r`k9)L`X#M2Sj^9Tm~Pa~=H$8jU2MJ}E{%O!35jTHvGp*u-n?vgpM>X&0HGzT7Q zv^CS%Ajn!W59&@^KX}DG_+td;HZxR{>+-j9^fO^?9Ia&N|187tPyhY=`SWFIY;tOb zp)FrwvI=8w+fp`eT{dw@B*GAnA3P_FlxZa(Y)>u^w+8r_n#tFjbh^IKMf))qkYe zf8>$%r^#=x{$*tA_)PKmOjRbn?rqM(8|wn?uK+!riKMW;Mf9}AQo6}q<{n487?xby zebLY{J!dZ3LNaTMP@rtr#Y<-y%P_n1(zUb|U#h*h&>t<+HdwB;m=FF;-!dfIlY zX_dd4c4x{|<7pUU>6+cGwnC(;u!Lml`jx1NPa|nlP_SUmnV3_NI>xrlp-RylBECnaZ!HN8twRiLHK6~PSqe=w#p(d#Wj^(GG1oqxb zlmdh0z~Ck=dZW*vRb?25&#uPKY=`sVd&gw3* zt9R`a)PLYb)kW{%_U#>hMjt+Nq}>`yaukYKv*2NA5@wfukQC-( z;&Oz?YqZnuR52pe#AQ8kh3yATwr3`->GiNz&R(463BdO7E=+RMVtRam^?`t)t+vm( zK42~}j8YZ>5|!C-gSQndglR|_HiEKIASNOLVP6k?b`V~dyW7GZZJWWNUjTsv-QV-r zzkkcWzaW?V!)5<)l~8w2#T&>^R|UyEQVH(4^GV@YIT+2?5+RH+I?^PSzyKyf-@T)s z9lmq8@Qb2%xRC}Um<9^z3Emlf95}cYI9Rw`3XGQn;}D{*e=5PUa`3V8=9cp2=9!W* zQC233%Eb2WK8*A{e9T_3@b|tE@}*}|5x)*hisD~I8Q8W`j}gaXb{8-hv-9w*wM*nH zIvb@m9qU6HP3MfrzY_97&;MSraqL3hY#-C-;8p~P z;jzF@qAcLZ^d$?<3V@pJ#u<2))$WkWiQ0CZWYZu+)XcAeR7FZ@b%@XdMKaj>-6mbD z{IgAlim&=sy_7L>*ve8Bb)t?u9nED gGC5Twr?yE5dqVg6%i*^+lO=MjOpX;BU+&U>0DeYwr2qf` diff --git a/.flatpak-builder/cache/objects/cb/4e1c3041a5ac66d7664a1fe01549257c689e60286537ec37cfa329405ad5f5.file b/.flatpak-builder/cache/objects/cb/4e1c3041a5ac66d7664a1fe01549257c689e60286537ec37cfa329405ad5f5.file deleted file mode 100644 index 75910d2..0000000 --- a/.flatpak-builder/cache/objects/cb/4e1c3041a5ac66d7664a1fe01549257c689e60286537ec37cfa329405ad5f5.file +++ /dev/null @@ -1,231 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Windows DIB display interface -# -# History: -# 1996-05-20 fl Created -# 1996-09-20 fl Fixed subregion exposure -# 1997-09-21 fl Added draw primitive (for tzPrint) -# 2003-05-21 fl Added experimental Window/ImageWindow classes -# 2003-09-05 fl Added fromstring/tostring methods -# -# Copyright (c) Secret Labs AB 1997-2003. -# Copyright (c) Fredrik Lundh 1996-2003. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image - - -class HDC: - """ - Wraps an HDC integer. The resulting object can be passed to the - :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` - methods. - """ - - def __init__(self, dc): - self.dc = dc - - def __int__(self): - return self.dc - - -class HWND: - """ - Wraps an HWND integer. The resulting object can be passed to the - :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` - methods, instead of a DC. - """ - - def __init__(self, wnd): - self.wnd = wnd - - def __int__(self): - return self.wnd - - -class Dib: - """ - A Windows bitmap with the given mode and size. The mode can be one of "1", - "L", "P", or "RGB". - - If the display requires a palette, this constructor creates a suitable - palette and associates it with the image. For an "L" image, 128 graylevels - are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together - with 20 graylevels. - - To make sure that palettes work properly under Windows, you must call the - ``palette`` method upon certain events from Windows. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. The mode can be one of "1", - "L", "P", or "RGB". - :param size: If the first argument is a mode string, this - defines the size of the image. - """ - - def __init__(self, image, size=None): - if hasattr(image, "mode") and hasattr(image, "size"): - mode = image.mode - size = image.size - else: - mode = image - image = None - if mode not in ["1", "L", "P", "RGB"]: - mode = Image.getmodebase(mode) - self.image = Image.core.display(mode, size) - self.mode = mode - self.size = size - if image: - self.paste(image) - - def expose(self, handle): - """ - Copy the bitmap contents to a device context. - - :param handle: Device context (HDC), cast to a Python integer, or an - HDC or HWND instance. In PythonWin, you can use - ``CDC.GetHandleAttrib()`` to get a suitable handle. - """ - if isinstance(handle, HWND): - dc = self.image.getdc(handle) - try: - result = self.image.expose(dc) - finally: - self.image.releasedc(handle, dc) - else: - result = self.image.expose(handle) - return result - - def draw(self, handle, dst, src=None): - """ - Same as expose, but allows you to specify where to draw the image, and - what part of it to draw. - - The destination and source areas are given as 4-tuple rectangles. If - the source is omitted, the entire image is copied. If the source and - the destination have different sizes, the image is resized as - necessary. - """ - if not src: - src = (0, 0) + self.size - if isinstance(handle, HWND): - dc = self.image.getdc(handle) - try: - result = self.image.draw(dc, dst, src) - finally: - self.image.releasedc(handle, dc) - else: - result = self.image.draw(handle, dst, src) - return result - - def query_palette(self, handle): - """ - Installs the palette associated with the image in the given device - context. - - This method should be called upon **QUERYNEWPALETTE** and - **PALETTECHANGED** events from Windows. If this method returns a - non-zero value, one or more display palette entries were changed, and - the image should be redrawn. - - :param handle: Device context (HDC), cast to a Python integer, or an - HDC or HWND instance. - :return: A true value if one or more entries were changed (this - indicates that the image should be redrawn). - """ - if isinstance(handle, HWND): - handle = self.image.getdc(handle) - try: - result = self.image.query_palette(handle) - finally: - self.image.releasedc(handle, handle) - else: - result = self.image.query_palette(handle) - return result - - def paste(self, im, box=None): - """ - Paste a PIL image into the bitmap image. - - :param im: A PIL image. The size must match the target region. - If the mode does not match, the image is converted to the - mode of the bitmap image. - :param box: A 4-tuple defining the left, upper, right, and - lower pixel coordinate. See :ref:`coordinate-system`. If - None is given instead of a tuple, all of the image is - assumed. - """ - im.load() - if self.mode != im.mode: - im = im.convert(self.mode) - if box: - self.image.paste(im.im, box) - else: - self.image.paste(im.im) - - def frombytes(self, buffer): - """ - Load display memory contents from byte data. - - :param buffer: A buffer containing display data (usually - data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) - """ - return self.image.frombytes(buffer) - - def tobytes(self): - """ - Copy display memory contents to bytes object. - - :return: A bytes object containing display data. - """ - return self.image.tobytes() - - -class Window: - """Create a Window with the given title size.""" - - def __init__(self, title="PIL", width=None, height=None): - self.hwnd = Image.core.createwindow( - title, self.__dispatcher, width or 0, height or 0 - ) - - def __dispatcher(self, action, *args): - return getattr(self, "ui_handle_" + action)(*args) - - def ui_handle_clear(self, dc, x0, y0, x1, y1): - pass - - def ui_handle_damage(self, x0, y0, x1, y1): - pass - - def ui_handle_destroy(self): - pass - - def ui_handle_repair(self, dc, x0, y0, x1, y1): - pass - - def ui_handle_resize(self, width, height): - pass - - def mainloop(self): - Image.core.eventloop() - - -class ImageWindow(Window): - """Create an image window which displays the given image.""" - - def __init__(self, image, title="PIL"): - if not isinstance(image, Dib): - image = Dib(image) - self.image = image - width, height = image.size - super().__init__(title, width=width, height=height) - - def ui_handle_repair(self, dc, x0, y0, x1, y1): - self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/.flatpak-builder/cache/objects/cb/5ac10e2021d640632a7479940ec64c11bf924bf52347e8e7222414b149bfe3.file b/.flatpak-builder/cache/objects/cb/5ac10e2021d640632a7479940ec64c11bf924bf52347e8e7222414b149bfe3.file deleted file mode 100644 index a99ef5d..0000000 --- a/.flatpak-builder/cache/objects/cb/5ac10e2021d640632a7479940ec64c11bf924bf52347e8e7222414b149bfe3.file +++ /dev/null @@ -1,92 +0,0 @@ -# available_models.py -# There isn't an API to do this, sorry -available_models = { - "llama3":"Meta Llama 3: The most capable openly available LLM to date", - "phi3":"Phi-3 Mini is a 3.8B parameters, lightweight, state-of-the-art open model by Microsoft.", - "wizardlm2":"State of the art large language model from Microsoft AI with improved performance on complex chat, multilingual, reasoning and agent use cases.", - "mistral":"The 7B model released by Mistral AI, updated to version 0.2.", - "gemma":"Gemma is a family of lightweight, state-of-the-art open models built by Google DeepMind. Updated to version 1.1", - "mixtral":"A set of Mixture of Experts (MoE) model with open weights by Mistral AI in 8x7b and 8x22b parameter sizes.", - "llama2":"Llama 2 is a collection of foundation language models ranging from 7B to 70B parameters.", - "codegemma":"CodeGemma is a collection of powerful, lightweight models that can perform a variety of coding tasks like fill-in-the-middle code completion, code generation, natural language understanding, mathematical reasoning, and instruction following.", - "command-r":"Command R is a Large Language Model optimized for conversational interaction and long context tasks.", - "command-r-plus":"Command R+ is a powerful, scalable large language model purpose-built to excel at real-world enterprise use cases.", - "llava":"🌋 LLaVA is a novel end-to-end trained large multimodal model that combines a vision encoder and Vicuna for general-purpose visual and language understanding. Updated to version 1.6.", - "dbrx":"DBRX is an open, general-purpose LLM created by Databricks.", - "codellama":"A large language model that can use text prompts to generate and discuss code.", - "qwen":"Qwen 1.5 is a series of large language models by Alibaba Cloud spanning from 0.5B to 110B parameters", - "dolphin-mixtral":"Uncensored, 8x7b and 8x22b fine-tuned models based on the Mixtral mixture of experts models that excels at coding tasks. Created by Eric Hartford.", - "llama2-uncensored":"Uncensored Llama 2 model by George Sung and Jarrad Hope.", - "deepseek-coder":"DeepSeek Coder is a capable coding model trained on two trillion code and natural language tokens.", - "mistral-openorca":"Mistral OpenOrca is a 7 billion parameter model, fine-tuned on top of the Mistral 7B model using the OpenOrca dataset.", - "nomic-embed-text":"A high-performing open embedding model with a large token context window.", - "phi":"Phi-2: a 2.7B language model by Microsoft Research that demonstrates outstanding reasoning and language understanding capabilities.", - "dolphin-mistral":"The uncensored Dolphin model based on Mistral that excels at coding tasks. Updated to version 2.8.", - "orca-mini":"A general-purpose model ranging from 3 billion parameters to 70 billion, suitable for entry-level hardware.", - "nous-hermes2":"The powerful family of models by Nous Research that excels at scientific discussion and coding tasks.", - "zephyr":"Zephyr is a series of fine-tuned versions of the Mistral and Mixtral models that are trained to act as helpful assistants.", - "llama2-chinese":"Llama 2 based model fine tuned to improve Chinese dialogue ability.", - "wizard-vicuna-uncensored":"Wizard Vicuna Uncensored is a 7B, 13B, and 30B parameter model based on Llama 2 uncensored by Eric Hartford.", - "vicuna":"General use chat model based on Llama and Llama 2 with 2K to 16K context sizes.", - "starcoder2":"StarCoder2 is the next generation of transparently trained open code LLMs that comes in three sizes: 3B, 7B and 15B parameters.", - "openhermes":"OpenHermes 2.5 is a 7B model fine-tuned by Teknium on Mistral with fully open datasets.", - "tinyllama":"The TinyLlama project is an open endeavor to train a compact 1.1B Llama model on 3 trillion tokens.", - "openchat":"A family of open-source models trained on a wide variety of data, surpassing ChatGPT on various benchmarks. Updated to version 3.5-0106.", - "tinydolphin":"An experimental 1.1B parameter model trained on the new Dolphin 2.8 dataset by Eric Hartford and based on TinyLlama.", - "starcoder":"StarCoder is a code generation model trained on 80+ programming languages.", - "wizardcoder":"State-of-the-art code generation model", - "stable-code":"Stable Code 3B is a coding model with instruct and code completion variants on par with models such as Code Llama 7B that are 2.5x larger.", - "dolphin-llama3":"Dolphin 2.9 is a new model with 8B and 70B sizes by Eric Hartford based on Llama 3 that has a variety of instruction, conversational, and coding skills.", - "yi":"A high-performing, bilingual language model.", - "mxbai-embed-large":"State-of-the-art large embedding model from mixedbread.ai", - "neural-chat":"A fine-tuned model based on Mistral with good coverage of domain and language.", - "phind-codellama":"Code generation model based on Code Llama.", - "wizard-math":"Model focused on math and logic problems", - "starling-lm":"Starling is a large language model trained by reinforcement learning from AI feedback focused on improving chatbot helpfulness.", - "falcon":"A large language model built by the Technology Innovation Institute (TII) for use in summarization, text generation, and chat bots.", - "orca2":"Orca 2 is built by Microsoft research, and are a fine-tuned version of Meta's Llama 2 models. The model is designed to excel particularly in reasoning.", - "dolphincoder":"A 7B and 15B uncensored variant of the Dolphin model family that excels at coding, based on StarCoder2.", - "dolphin-phi":"2.7B uncensored Dolphin model by Eric Hartford, based on the Phi language model by Microsoft Research.", - "nous-hermes":"General use models based on Llama and Llama 2 from Nous Research.", - "sqlcoder":"SQLCoder is a code completion model fined-tuned on StarCoder for SQL generation tasks", - "solar":"A compact, yet powerful 10.7B large language model designed for single-turn conversation.", - "stablelm2":"Stable LM 2 is a state-of-the-art 1.6B and 12B parameter language model trained on multilingual data in English, Spanish, German, Italian, French, Portuguese, and Dutch.", - "bakllava":"BakLLaVA is a multimodal model consisting of the Mistral 7B base model augmented with the LLaVA architecture.", - "medllama2":"Fine-tuned Llama 2 model to answer medical questions based on an open source medical dataset.", - "yarn-llama2":"An extension of Llama 2 that supports a context of up to 128k tokens.", - "deepseek-llm":"An advanced language model crafted with 2 trillion bilingual tokens.", - "nous-hermes2-mixtral":"The Nous Hermes 2 model from Nous Research, now trained over Mixtral.", - "wizardlm-uncensored":"Uncensored version of Wizard LM model", - "codeqwen":"CodeQwen1.5 is a large language model pretrained on a large amount of code data.", - "all-minilm":"Embedding models on very large sentence level datasets.", - "samantha-mistral":"A companion assistant trained in philosophy, psychology, and personal relationships. Based on Mistral.", - "codeup":"Great code generation model based on Llama2.", - "stable-beluga":"Llama 2 based model fine tuned on an Orca-style dataset. Originally called Free Willy.", - "llama3-gradient":"This model extends LLama-3 8B's context length from 8k to over 1m tokens.", - "everythinglm":"Uncensored Llama2 based model with support for a 16K context window.", - "xwinlm":"Conversational model based on Llama 2 that performs competitively on various benchmarks.", - "yarn-mistral":"An extension of Mistral to support context windows of 64K or 128K.", - "meditron":"Open-source medical large language model adapted from Llama 2 to the medical domain.", - "wizardlm":"General use model based on Llama 2.", - "llama-pro":"An expansion of Llama 2 that specializes in integrating both general language understanding and domain-specific knowledge, particularly in programming and mathematics.", - "magicoder":"🎩 Magicoder is a family of 7B parameter models trained on 75K synthetic instruction data using OSS-Instruct, a novel approach to enlightening LLMs with open-source code snippets.", - "stablelm-zephyr":"A lightweight chat model allowing accurate, and responsive output without requiring high-end hardware.", - "codebooga":"A high-performing code instruct model created by merging two existing code models.", - "nexusraven":"Nexus Raven is a 13B instruction tuned model for function calling tasks.", - "mistrallite":"MistralLite is a fine-tuned model based on Mistral with enhanced capabilities of processing long contexts.", - "wizard-vicuna":"Wizard Vicuna is a 13B parameter model based on Llama 2 trained by MelodysDreamj.", - "goliath":"A language model created by combining two fine-tuned Llama 2 70B models into one.", - "open-orca-platypus2":"Merge of the Open Orca OpenChat model and the Garage-bAInd Platypus 2 model. Designed for chat and code generation.", - "notux":"A top-performing mixture of experts model, fine-tuned with high-quality data.", - "megadolphin":"MegaDolphin-2.2-120b is a transformation of Dolphin-2.2-70b created by interleaving the model with itself.", - "snowflake-arctic-embed":"A suite of text embedding models by Snowflake, optimized for performance.", - "duckdb-nsql":"7B parameter text-to-SQL model made by MotherDuck and Numbers Station.", - "moondream":"moondream is a small vision language model designed to run efficiently on edge devices.", - "notus":"A 7B chat model fine-tuned with high-quality data and based on Zephyr.", - "alfred":"A robust conversational model designed to be used for both chat and instruct use cases.", - "llava-llama3":"A LLaVA model fine-tuned from Llama 3 Instruct with better scores in several benchmarks.", - "llama3-chatqa":"A model from NVIDIA based on Llama 3 that excels at conversational question answering (QA) and retrieval-augmented generation (RAG).", - "llava-phi3":"A new small LLaVA model fine-tuned from Phi 3 Mini." -} - - diff --git a/.flatpak-builder/cache/objects/cb/6cb0dca60c45dd952cdbdad97d808c1f34e51e4d39e7927f64e241a8d2e5f8.file b/.flatpak-builder/cache/objects/cb/6cb0dca60c45dd952cdbdad97d808c1f34e51e4d39e7927f64e241a8d2e5f8.file deleted file mode 100644 index 7909a5e733efd584c68af405b2d8554e8919fc5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19291 zcmc&*Yiu0Xb)MOsC6{lCq$$yQjbuqAEo!NUC0mp%%cdwwmPE;<*p!xn&BYVOzIl(gtSZxK-QKmE*KEilRt=H9*n+=#OF?sOWZp04@UmFwh?qD4>CU z^*iUz&d!Un*#_-!=J4*E`#AU9bM8I&+%tdP($W}}BC@c-y!l>aM}3jRlPv3%WR9p_PU_4)W@gDh#$Hyf+< z>RU3gOkJ)i-#pojT(L}jt|i|(*~;m7t}Wj_+0N;P+@^fTWQQz8q){o;__ma3(mFo? zxgQb9d`)&St{J!%?Fk>Q8?A1x=0ti+HJxeIdZr^i)t^LNEniQj)s1tfC!gfj+R$3N z*5zw$E8{i+*P(6o;kGfZ6S%HGx$TU50=Vt~ZU^Hw1GgoB+sU{d;GPWNR85`S#rUnj zZ_~E<=-JJ7EOFKSgVPI$yMxsS1Xf!(L= z^-kW5#Y{hs&>FPPR}uR6xeft9v)}h zdEj2wy0ivg$v9�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 diff --git a/.flatpak-builder/cache/objects/44/99d4a699306c1af5c0d956935961e6cef36473ccbd18d6cd463e90d6993b0c.file b/.flatpak-builder/cache/objects/44/99d4a699306c1af5c0d956935961e6cef36473ccbd18d6cd463e90d6993b0c.file deleted file mode 100644 index 848fc2f..0000000 --- a/.flatpak-builder/cache/objects/44/99d4a699306c1af5c0d956935961e6cef36473ccbd18d6cd463e90d6993b0c.file +++ /dev/null @@ -1,230 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# Simple PostScript graphics interface -# -# History: -# 1996-04-20 fl Created -# 1999-01-10 fl Added gsave/grestore to image method -# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) -# -# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. -# Copyright (c) 1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import sys - -from . import EpsImagePlugin - -## -# Simple PostScript graphics interface. - - -class PSDraw: - """ - Sets up printing to the given file. If ``fp`` is omitted, - ``sys.stdout.buffer`` or ``sys.stdout`` is assumed. - """ - - def __init__(self, fp=None): - if not fp: - try: - fp = sys.stdout.buffer - except AttributeError: - fp = sys.stdout - self.fp = fp - - def begin_document(self, id=None): - """Set up printing of a document. (Write PostScript DSC header.)""" - # FIXME: incomplete - self.fp.write( - b"%!PS-Adobe-3.0\n" - b"save\n" - b"/showpage { } def\n" - b"%%EndComments\n" - b"%%BeginDocument\n" - ) - # self.fp.write(ERROR_PS) # debugging! - self.fp.write(EDROFF_PS) - self.fp.write(VDI_PS) - self.fp.write(b"%%EndProlog\n") - self.isofont = {} - - def end_document(self): - """Ends printing. (Write PostScript DSC footer.)""" - self.fp.write(b"%%EndDocument\nrestore showpage\n%%End\n") - if hasattr(self.fp, "flush"): - self.fp.flush() - - def setfont(self, font, size): - """ - Selects which font to use. - - :param font: A PostScript font name - :param size: Size in points. - """ - font = bytes(font, "UTF-8") - if font not in self.isofont: - # reencode font - self.fp.write(b"/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font, font)) - self.isofont[font] = 1 - # rough - self.fp.write(b"/F0 %d /PSDraw-%s F\n" % (size, font)) - - def line(self, xy0, xy1): - """ - Draws a line between the two points. Coordinates are given in - PostScript point coordinates (72 points per inch, (0, 0) is the lower - left corner of the page). - """ - self.fp.write(b"%d %d %d %d Vl\n" % (*xy0, *xy1)) - - def rectangle(self, box): - """ - Draws a rectangle. - - :param box: A tuple of four integers, specifying left, bottom, width and - height. - """ - self.fp.write(b"%d %d M 0 %d %d Vr\n" % box) - - def text(self, xy, text): - """ - Draws text at the given position. You must use - :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. - """ - text = bytes(text, "UTF-8") - text = b"\\(".join(text.split(b"(")) - text = b"\\)".join(text.split(b")")) - xy += (text,) - self.fp.write(b"%d %d M (%s) S\n" % xy) - - def image(self, box, im, dpi=None): - """Draw a PIL image, centered in the given box.""" - # default resolution depends on mode - if not dpi: - if im.mode == "1": - dpi = 200 # fax - else: - dpi = 100 # grayscale - # image size (on paper) - x = im.size[0] * 72 / dpi - y = im.size[1] * 72 / dpi - # max allowed size - xmax = float(box[2] - box[0]) - ymax = float(box[3] - box[1]) - if x > xmax: - y = y * xmax / x - x = xmax - if y > ymax: - x = x * ymax / y - y = ymax - dx = (xmax - x) / 2 + box[0] - dy = (ymax - y) / 2 + box[1] - self.fp.write(b"gsave\n%f %f translate\n" % (dx, dy)) - if (x, y) != im.size: - # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) - sx = x / im.size[0] - sy = y / im.size[1] - self.fp.write(b"%f %f scale\n" % (sx, sy)) - EpsImagePlugin._save(im, self.fp, None, 0) - self.fp.write(b"\ngrestore\n") - - -# -------------------------------------------------------------------- -# PostScript driver - -# -# EDROFF.PS -- PostScript driver for Edroff 2 -# -# History: -# 94-01-25 fl: created (edroff 2.04) -# -# Copyright (c) Fredrik Lundh 1994. -# - - -EDROFF_PS = b"""\ -/S { show } bind def -/P { moveto show } bind def -/M { moveto } bind def -/X { 0 rmoveto } bind def -/Y { 0 exch rmoveto } bind def -/E { findfont - dup maxlength dict begin - { - 1 index /FID ne { def } { pop pop } ifelse - } forall - /Encoding exch def - dup /FontName exch def - currentdict end definefont pop -} bind def -/F { findfont exch scalefont dup setfont - [ exch /setfont cvx ] cvx bind def -} bind def -""" - -# -# VDI.PS -- PostScript driver for VDI meta commands -# -# History: -# 94-01-25 fl: created (edroff 2.04) -# -# Copyright (c) Fredrik Lundh 1994. -# - -VDI_PS = b"""\ -/Vm { moveto } bind def -/Va { newpath arcn stroke } bind def -/Vl { moveto lineto stroke } bind def -/Vc { newpath 0 360 arc closepath } bind def -/Vr { exch dup 0 rlineto - exch dup 0 exch rlineto - exch neg 0 rlineto - 0 exch neg rlineto - setgray fill } bind def -/Tm matrix def -/Ve { Tm currentmatrix pop - translate scale newpath 0 0 .5 0 360 arc closepath - Tm setmatrix -} bind def -/Vf { currentgray exch setgray fill setgray } bind def -""" - -# -# ERROR.PS -- Error handler -# -# History: -# 89-11-21 fl: created (pslist 1.10) -# - -ERROR_PS = b"""\ -/landscape false def -/errorBUF 200 string def -/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def -errordict begin /handleerror { - initmatrix /Courier findfont 10 scalefont setfont - newpath 72 720 moveto $error begin /newerror false def - (PostScript Error) show errorNL errorNL - (Error: ) show - /errorname load errorBUF cvs show errorNL errorNL - (Command: ) show - /command load dup type /stringtype ne { errorBUF cvs } if show - errorNL errorNL - (VMstatus: ) show - vmstatus errorBUF cvs show ( bytes available, ) show - errorBUF cvs show ( bytes used at level ) show - errorBUF cvs show errorNL errorNL - (Operand stargck: ) show errorNL /ostargck load { - dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL - } forall errorNL - (Execution stargck: ) show errorNL /estargck load { - dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL - } forall - end showpage -} def end -""" diff --git a/.flatpak-builder/cache/objects/44/aa45297fc373024a45d7d712fca521ec0bad68286150de6f947397413beed5.file b/.flatpak-builder/cache/objects/44/aa45297fc373024a45d7d712fca521ec0bad68286150de6f947397413beed5.file deleted file mode 100644 index 7075e86..0000000 --- a/.flatpak-builder/cache/objects/44/aa45297fc373024a45d7d712fca521ec0bad68286150de6f947397413beed5.file +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -import os -import sys -from typing import Protocol, Sequence, TypeVar, Union - -if sys.version_info >= (3, 10): - from typing import TypeGuard -else: - try: - from typing_extensions import TypeGuard - except ImportError: - from typing import Any - - class TypeGuard: # type: ignore[no-redef] - def __class_getitem__(cls, item: Any) -> type[bool]: - return bool - - -Coords = Union[Sequence[float], Sequence[Sequence[float]]] - - -_T_co = TypeVar("_T_co", covariant=True) - - -class SupportsRead(Protocol[_T_co]): - def read(self, __length: int = ...) -> _T_co: ... - - -StrOrBytesPath = Union[str, bytes, "os.PathLike[str]", "os.PathLike[bytes]"] - - -__all__ = ["TypeGuard", "StrOrBytesPath", "SupportsRead"] diff --git a/.flatpak-builder/cache/objects/44/d1d4f191641e3d500e77559f481e1187d36bcd6248ef7022860d2c3d9ec04b.file b/.flatpak-builder/cache/objects/44/d1d4f191641e3d500e77559f481e1187d36bcd6248ef7022860d2c3d9ec04b.file deleted file mode 100644 index dbed769..0000000 --- a/.flatpak-builder/cache/objects/44/d1d4f191641e3d500e77559f481e1187d36bcd6248ef7022860d2c3d9ec04b.file +++ /dev/null @@ -1,4 +0,0 @@ -# Master version for Pillow -from __future__ import annotations - -__version__ = "10.3.0" diff --git a/.flatpak-builder/cache/objects/45/ba7752686b8143341190da165b26f65cf44abd91b99964a7d0c92e387d9604.file b/.flatpak-builder/cache/objects/45/ba7752686b8143341190da165b26f65cf44abd91b99964a7d0c92e387d9604.file deleted file mode 100644 index 75680a9..0000000 --- a/.flatpak-builder/cache/objects/45/ba7752686b8143341190da165b26f65cf44abd91b99964a7d0c92e387d9604.file +++ /dev/null @@ -1,255 +0,0 @@ -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library. -# $Id$ -# -# FlashPix support for PIL -# -# History: -# 97-01-25 fl Created (reads uncompressed RGB images only) -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import olefile - -from . import Image, ImageFile -from ._binary import i32le as i32 - -# we map from colour field tuples to (mode, rawmode) descriptors -MODES = { - # opacity - (0x00007FFE,): ("A", "L"), - # monochrome - (0x00010000,): ("L", "L"), - (0x00018000, 0x00017FFE): ("RGBA", "LA"), - # photo YCC - (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), - (0x00028000, 0x00028001, 0x00028002, 0x00027FFE): ("RGBA", "YCCA;P"), - # standard RGB (NIFRGB) - (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), - (0x00038000, 0x00038001, 0x00038002, 0x00037FFE): ("RGBA", "RGBA"), -} - - -# -# -------------------------------------------------------------------- - - -def _accept(prefix): - return prefix[:8] == olefile.MAGIC - - -## -# Image plugin for the FlashPix images. - - -class FpxImageFile(ImageFile.ImageFile): - format = "FPX" - format_description = "FlashPix" - - def _open(self): - # - # read the OLE directory and see if this is a likely - # to be a FlashPix file - - try: - self.ole = olefile.OleFileIO(self.fp) - except OSError as e: - msg = "not an FPX file; invalid OLE file" - raise SyntaxError(msg) from e - - if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": - msg = "not an FPX file; bad root CLSID" - raise SyntaxError(msg) - - self._open_index(1) - - def _open_index(self, index=1): - # - # get the Image Contents Property Set - - prop = self.ole.getproperties( - [f"Data Object Store {index:06d}", "\005Image Contents"] - ) - - # size (highest resolution) - - self._size = prop[0x1000002], prop[0x1000003] - - size = max(self.size) - i = 1 - while size > 64: - size = size / 2 - i += 1 - self.maxid = i - 1 - - # mode. instead of using a single field for this, flashpix - # requires you to specify the mode for each channel in each - # resolution subimage, and leaves it to the decoder to make - # sure that they all match. for now, we'll cheat and assume - # that this is always the case. - - id = self.maxid << 16 - - s = prop[0x2000002 | id] - - bands = i32(s, 4) - if bands > 4: - msg = "Invalid number of bands" - raise OSError(msg) - - # note: for now, we ignore the "uncalibrated" flag - colors = tuple(i32(s, 8 + i * 4) & 0x7FFFFFFF for i in range(bands)) - - self._mode, self.rawmode = MODES[colors] - - # load JPEG tables, if any - self.jpeg = {} - for i in range(256): - id = 0x3000001 | (i << 16) - if id in prop: - self.jpeg[i] = prop[id] - - self._open_subimage(1, self.maxid) - - def _open_subimage(self, index=1, subimage=0): - # - # setup tile descriptors for a given subimage - - stream = [ - f"Data Object Store {index:06d}", - f"Resolution {subimage:04d}", - "Subimage 0000 Header", - ] - - fp = self.ole.openstream(stream) - - # skip prefix - fp.read(28) - - # header stream - s = fp.read(36) - - size = i32(s, 4), i32(s, 8) - # tilecount = i32(s, 12) - tilesize = i32(s, 16), i32(s, 20) - # channels = i32(s, 24) - offset = i32(s, 28) - length = i32(s, 32) - - if size != self.size: - msg = "subimage mismatch" - raise OSError(msg) - - # get tile descriptors - fp.seek(28 + offset) - s = fp.read(i32(s, 12) * length) - - x = y = 0 - xsize, ysize = size - xtile, ytile = tilesize - self.tile = [] - - for i in range(0, len(s), length): - x1 = min(xsize, x + xtile) - y1 = min(ysize, y + ytile) - - compression = i32(s, i + 8) - - if compression == 0: - self.tile.append( - ( - "raw", - (x, y, x1, y1), - i32(s, i) + 28, - (self.rawmode,), - ) - ) - - elif compression == 1: - # FIXME: the fill decoder is not implemented - self.tile.append( - ( - "fill", - (x, y, x1, y1), - i32(s, i) + 28, - (self.rawmode, s[12:16]), - ) - ) - - elif compression == 2: - internal_color_conversion = s[14] - jpeg_tables = s[15] - rawmode = self.rawmode - - if internal_color_conversion: - # The image is stored as usual (usually YCbCr). - if rawmode == "RGBA": - # For "RGBA", data is stored as YCbCrA based on - # negative RGB. The following trick works around - # this problem : - jpegmode, rawmode = "YCbCrK", "CMYK" - else: - jpegmode = None # let the decoder decide - - else: - # The image is stored as defined by rawmode - jpegmode = rawmode - - self.tile.append( - ( - "jpeg", - (x, y, x1, y1), - i32(s, i) + 28, - (rawmode, jpegmode), - ) - ) - - # FIXME: jpeg tables are tile dependent; the prefix - # data must be placed in the tile descriptor itself! - - if jpeg_tables: - self.tile_prefix = self.jpeg[jpeg_tables] - - else: - msg = "unknown/invalid compression" - raise OSError(msg) - - x = x + xtile - if x >= xsize: - x, y = 0, y + ytile - if y >= ysize: - break # isn't really required - - self.stream = stream - self._fp = self.fp - self.fp = None - - def load(self): - if not self.fp: - self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"]) - - return ImageFile.ImageFile.load(self) - - def close(self): - self.ole.close() - super().close() - - def __exit__(self, *args): - self.ole.close() - super().__exit__() - - -# -# -------------------------------------------------------------------- - - -Image.register_open(FpxImageFile.format, FpxImageFile, _accept) - -Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/.flatpak-builder/cache/objects/47/33b2a2cfcaa3c6f3dad5f08f78d40f38f6c80f4907f8ec7356756ad3d0640e.file b/.flatpak-builder/cache/objects/47/33b2a2cfcaa3c6f3dad5f08f78d40f38f6c80f4907f8ec7356756ad3d0640e.file deleted file mode 100644 index ac07bdeddaf05626b6e755cf77354680906e00e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5109 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 diff --git a/.flatpak-builder/cache/objects/48/64004ea946d77698d71f6eb6958b61f2ba7e0396ac9be43033faf455961896.file b/.flatpak-builder/cache/objects/48/64004ea946d77698d71f6eb6958b61f2ba7e0396ac9be43033faf455961896.file deleted file mode 100644 index 9458254d674be0ab206a9e3438c6bc61a47d3ff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1061 zcmdUtJ&)5c7{~24O`E3aTY5bP#D=&GchLc2LP&5h+;R(>7vmT;z&2YKso)2oHIpi@L%`zUZNz2v8vUs4oU+ zAckltMrb6)Xe>e$iV2!j@tS;3OwkmAIY^!N5bdX}=OA)_K$ARz+Q)cJRlzceaWvM! z>C>~vPgu&HDU~VhS+kbIQ@JLbr6*ZR^Nh(-?_c+vWU{2MOYIU)W|Zr0vY^Ql&rCQy zsP$r#FQ~-XQcr6KldNQf<0KO^CaKbX?XM$vwIN?7+D&O2qGkXP62OpojL)t{JCIWHGFtbIkPn4IsNW-ueuq9Srmiz*ypG76PrhNfB; zu0`9TW8qnJEqsffMPSjl7+6d#h881>u|;SxvDh;>i*D#%PLd^=Q=F2LD0_yqlVpni zQ|iBF)!tR7RgJohG2tBJPvF9&2bXtalIJmJvpC=twqdINn(uc zW@3DlZ!S9zMV78OeWY%g5caGU9m8!CLii2bKL2xV8zF3L!T*l~0Hbqo@cY_26W{dq N3vb)@RyWN=egZBd6MO&w diff --git a/.flatpak-builder/cache/objects/49/83f0ef47c617d0cb20d34d5028f789ad4d192ed15967377eac3659eca28831.dirtree b/.flatpak-builder/cache/objects/49/83f0ef47c617d0cb20d34d5028f789ad4d192ed15967377eac3659eca28831.dirtree deleted file mode 100644 index 3dc0708bf39492423171baaebe8bba4c254c4f20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmV-S0JHydV`yb m[0] and s[1] > m[1]: - m = s - if not m: - msg = "No cursors were found" - raise TypeError(msg) - - # load as bitmap - self._bitmap(i32(m, 12) + offset) - - # patch up the bitmap height - self._size = self.size[0], self.size[1] // 2 - d, e, o, a = self.tile[0] - self.tile[0] = d, (0, 0) + self.size, o, a - - -# -# -------------------------------------------------------------------- - -Image.register_open(CurImageFile.format, CurImageFile, _accept) - -Image.register_extension(CurImageFile.format, ".cur") diff --git a/.flatpak-builder/cache/objects/4b/20aa8fa92802badae65fbe92313b696e70a23364a391933f2221ce45d480c5.file b/.flatpak-builder/cache/objects/4b/20aa8fa92802badae65fbe92313b696e70a23364a391933f2221ce45d480c5.file deleted file mode 100644 index d674b33c34f22ac9ab4006420dfd125e7a3c8eea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6634 zcmb6-TWlLwb~EG*-xNuaqC{DgC0P&C4{Bvg-dJ_q$g!j-Ycq00JBe&BOKFBOZHi=O zMzPJ3hOo#2gdrewphCnVi{%DsqDA`Qj}}ndAAJ<)qCcGx2Jm1218R%?(4PWrfBci4 zGkl1ooHTnmJagyVbI-kV<~;8=cDqGS5X9~OSpC=k{L(M{5ADjQJQfy!LPH&I!11WVtyR!3RWecNH5H8xU{ghp+zQZOy7-jMb#<`?xre}0>M4)vKCj>~<8cilsLR5&Sl6+_n1VjXMDm}9tU1C+UcAJVP zSk;i`*jW6LN-sPXSY9=7tgyl*RcaxXN-W~6YD00rpFHS>&IXay#QkfXuR0C_f1qt1 zHlYvgp)3y&%*|Y%y*Bv=*b--iM;>|hyn16enobWV;tRv+$HKi-@_cY)WSEZ&?Adg5 z@d50SAD*4LHary8Y9ugMK&#PPGIClj%@%|3B~Fv^c6-5eQV=I z-;T9Ur1}nEfLKIOZ58Q~2SLDW5G*lIG6ZM|2^vDqQ%nm(fmYBUUkls~jFYjUmN0gB zDVJ)mZATLwH8m5S<4_$`DwImH4dTLA*Ti)XAd2gLbq~aO|R<+HH#pKLknw|hk9|OHSUKo zXMj)Ry8#Z~yb(tdSv~K|5+&0ShJeVDjnsEQ5;=X&m^0y*So^oEo+H=(9VBL8hz5z( zY`&f=V`=2ZSPzZiC&}2HHJ2>)9IJiC*2tOb%97c2w@>KoClv4Lg8rq~ zUtD~aSWk$~KE>Nre7_hizQ2C|g?DhrJ1BWi%HEUtX~p3cJI{#@yp(|ekRr9KW1q0t zePZufKQwkT=nlH`9= z_P@DJN&c&nb5eFriq1);{lq>&xdwg3?GL1p>+;BT$rCJGD-CY;?+%>8 zg`FL{j$`-=zFp{gI*TL4bH#J(@4oQ#?|Ax4Vaan!_MF-rkv(T$c+T&5&P$##*)x`( zR2-fcj^jIy<0VRR49JcFSkQh->F~o#FBBKPF#pc+8;8^pkUIheT5)&c8bg0Sy*VxQ zkIMa{+T#|z?fDn`mR<1>U)HgUa##{B&VjvUPp;CWwCjEs}6{!6b8^ z(%PGU`(@R8Ji zVau>hiEWdjXDUyvne*`DT=4O^VF0gMnfRh`TT3_2^k}!cT4unZJ-+e^E9nG#JDwEI z^Z>ZqlkL%BYrVIt#n%6Z85@L9i;3vrvk=YEM;yAbMvs@%gGZ^PDjej8a}Y5YeI=fC zGWsLjs2}4NgPiLxn{kAi{{Q#~3?Uvvd}!jsnYpreL4U-f7&P3-VfP$letM8wfZ{O4 z(Il=(SEZBDM{%CVnP{?QYc)rfSRsNABh%hwvDJZhaH%H%R*C;L5H3$)x;Rz(Q0h7> zdxDa4SauHQX~pU+OgtUWk1Ou>!szbdljrXii$h=l7p1;YxpPeNUXZ;PME3>JcHvKM zZ{cC_lTEX9d_-Ff-U7Jq zR$dm<9+kYdhs92Yn)$1d3wu2pY9^qI?|%RN_wj82Dmk?Wx9c}p?{c>xxL<#{d1mE{G<3{tVk0_=}FgOnEl@R$*! zAJLlTOt>LHWxAT&NJBCc#+i4u3}D|tw6;OiXz$9~6jy8BuxoRF_KT;#C|V_3zijK@ zwC~u)MBA9+Y~QecZY|D8&OzA;p>)R?6rDjp7p<}r$(&=Nb8Oe&`@3KM=9in(&u>Zo zOS1ox=%3m)*+Fy_#SabwLQ$SPQ5M;Ud zjX1211BP-SxQGa>wzODV9v{bXs%~7H_1B0ssiugQ6hYiY>v2hiW zSi1|su68(gNJ$X&g)AHeVQPryT=cK&0_xQt{T9t@F$T~YW2o%S@gwYElxsLDLIg;W zJm`YX2C)RvziZBsSrQ~n<#buyGyNL9W|^zl4;oQGuj+z7gYcAksM6{9BQ~KGu;7d} zSNzIyDG}#|#nf{8a^_T%!UoIbUhq;PwHQtCm!VUoeG07k0RXFn*nO>hZMy%cFZZ@q ziYqlVbjpS_gWJ(@c+*}o&;ms-qf!{kR12=P3=xIrxgMZ^sxqF`0*Fd;(Igy2LNyE} zx=KIR;*=TdfhfmCAFK2u4P$_FLN>`j{R@d|l#gIQMun_IG1aiJ5{t1M_jBY^FhkH5IHc|-CCpOcdBoa{T7Z+YqR7KHVT+&(0^PRg#6`vh(FYal=I zvh~=r)9a_9;A-nEj(#yNA3H6zosrwlVEu;mn7yk&Do%G{1)TlIo0p}bi;{nQ>(+Mk zpXWvYwA}uVXJ_lkGFdQ^#-V^2dBmJrBc= zdmjEr3t*(~Ycjx&>vG3+$rO@JA<-0q`ZK>$i7PaR$1B_o1n;AC&5`sL|n`;|Y?Hs!VHi3x`C?7Wm)T*eJ??t5Q)C}YnQODYComg z*(JKg*IoMtlEia|24MOdl7z_jdRUl|JwxAVgMY3knbNyRkpEFoh|Au@2e2DZF&&r*_=iaS$ S@n;hfaYZJsh}BE`&i@A|$I3|n diff --git a/.flatpak-builder/cache/objects/4c/1e7752a33ad1ef4632f267b2d366f3dc748edd1592490c6e326c363623ce99.file b/.flatpak-builder/cache/objects/4c/1e7752a33ad1ef4632f267b2d366f3dc748edd1592490c6e326c363623ce99.file deleted file mode 100644 index ee9369c05a843b90a6f6c2c96ba5f3e65b0d8505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18863 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 diff --git a/.flatpak-builder/cache/objects/4d/0f3ebe1ba7ed971e2b634022cdf31ca4a6e50475c37628feeb040a9eb39560.file b/.flatpak-builder/cache/objects/4d/0f3ebe1ba7ed971e2b634022cdf31ca4a6e50475c37628feeb040a9eb39560.file deleted file mode 100644 index 1c90a21..0000000 --- a/.flatpak-builder/cache/objects/4d/0f3ebe1ba7ed971e2b634022cdf31ca4a6e50475c37628feeb040a9eb39560.file +++ /dev/null @@ -1,89 +0,0 @@ -from __future__ import annotations - -import binascii -import codecs -import os -import typing -from io import BytesIO - -from .fields import _TYPE_FIELD_VALUE_TUPLE, RequestField - -writer = codecs.lookup("utf-8")[3] - -_TYPE_FIELDS_SEQUENCE = typing.Sequence[ - typing.Union[typing.Tuple[str, _TYPE_FIELD_VALUE_TUPLE], RequestField] -] -_TYPE_FIELDS = typing.Union[ - _TYPE_FIELDS_SEQUENCE, - typing.Mapping[str, _TYPE_FIELD_VALUE_TUPLE], -] - - -def choose_boundary() -> str: - """ - Our embarrassingly-simple replacement for mimetools.choose_boundary. - """ - return binascii.hexlify(os.urandom(16)).decode() - - -def iter_field_objects(fields: _TYPE_FIELDS) -> typing.Iterable[RequestField]: - """ - Iterate over fields. - - Supports list of (k, v) tuples and dicts, and lists of - :class:`~urllib3.fields.RequestField`. - - """ - iterable: typing.Iterable[RequestField | tuple[str, _TYPE_FIELD_VALUE_TUPLE]] - - if isinstance(fields, typing.Mapping): - iterable = fields.items() - else: - iterable = fields - - for field in iterable: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) - - -def encode_multipart_formdata( - fields: _TYPE_FIELDS, boundary: str | None = None -) -> tuple[bytes, str]: - """ - Encode a dictionary of ``fields`` using the multipart/form-data MIME format. - - :param fields: - Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). - Values are processed by :func:`urllib3.fields.RequestField.from_tuples`. - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`urllib3.filepost.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for field in iter_field_objects(fields): - body.write(f"--{boundary}\r\n".encode("latin-1")) - - writer(body).write(field.render_headers()) - data = field.data - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, str): - writer(body).write(data) - else: - body.write(data) - - body.write(b"\r\n") - - body.write(f"--{boundary}--\r\n".encode("latin-1")) - - content_type = f"multipart/form-data; boundary={boundary}" - - return body.getvalue(), content_type diff --git a/.flatpak-builder/cache/objects/4d/450ddb5485c14c3bf06a3373769afad2ddedf51c69ae0cb2f2f630669a1f56.file b/.flatpak-builder/cache/objects/4d/450ddb5485c14c3bf06a3373769afad2ddedf51c69ae0cb2f2f630669a1f56.file deleted file mode 100644 index 67db858..0000000 --- a/.flatpak-builder/cache/objects/4d/450ddb5485c14c3bf06a3373769afad2ddedf51c69ae0cb2f2f630669a1f56.file +++ /dev/null @@ -1,175 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. diff --git a/.flatpak-builder/cache/objects/4d/6f617c5ac14efc51c6b89bf9c2f6b7492734664471011677188e49de621134.file b/.flatpak-builder/cache/objects/4d/6f617c5ac14efc51c6b89bf9c2f6b7492734664471011677188e49de621134.file deleted file mode 100644 index 2542d4e..0000000 --- a/.flatpak-builder/cache/objects/4d/6f617c5ac14efc51c6b89bf9c2f6b7492734664471011677188e49de621134.file +++ /dev/null @@ -1,1008 +0,0 @@ -from __future__ import annotations - -import calendar -import codecs -import collections -import mmap -import os -import re -import time -import zlib -from typing import TYPE_CHECKING, Any, List, NamedTuple, Union - - -# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set -# on page 656 -def encode_text(s): - return codecs.BOM_UTF16_BE + s.encode("utf_16_be") - - -PDFDocEncoding = { - 0x16: "\u0017", - 0x18: "\u02D8", - 0x19: "\u02C7", - 0x1A: "\u02C6", - 0x1B: "\u02D9", - 0x1C: "\u02DD", - 0x1D: "\u02DB", - 0x1E: "\u02DA", - 0x1F: "\u02DC", - 0x80: "\u2022", - 0x81: "\u2020", - 0x82: "\u2021", - 0x83: "\u2026", - 0x84: "\u2014", - 0x85: "\u2013", - 0x86: "\u0192", - 0x87: "\u2044", - 0x88: "\u2039", - 0x89: "\u203A", - 0x8A: "\u2212", - 0x8B: "\u2030", - 0x8C: "\u201E", - 0x8D: "\u201C", - 0x8E: "\u201D", - 0x8F: "\u2018", - 0x90: "\u2019", - 0x91: "\u201A", - 0x92: "\u2122", - 0x93: "\uFB01", - 0x94: "\uFB02", - 0x95: "\u0141", - 0x96: "\u0152", - 0x97: "\u0160", - 0x98: "\u0178", - 0x99: "\u017D", - 0x9A: "\u0131", - 0x9B: "\u0142", - 0x9C: "\u0153", - 0x9D: "\u0161", - 0x9E: "\u017E", - 0xA0: "\u20AC", -} - - -def decode_text(b): - if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: - return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be") - else: - return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) - - -class PdfFormatError(RuntimeError): - """An error that probably indicates a syntactic or semantic error in the - PDF file structure""" - - pass - - -def check_format_condition(condition, error_message): - if not condition: - raise PdfFormatError(error_message) - - -class IndirectReferenceTuple(NamedTuple): - object_id: int - generation: int - - -class IndirectReference(IndirectReferenceTuple): - def __str__(self): - return f"{self.object_id} {self.generation} R" - - def __bytes__(self): - return self.__str__().encode("us-ascii") - - def __eq__(self, other): - return ( - other.__class__ is self.__class__ - and other.object_id == self.object_id - and other.generation == self.generation - ) - - def __ne__(self, other): - return not (self == other) - - def __hash__(self): - return hash((self.object_id, self.generation)) - - -class IndirectObjectDef(IndirectReference): - def __str__(self): - return f"{self.object_id} {self.generation} obj" - - -class XrefTable: - def __init__(self): - self.existing_entries = {} # object ID => (offset, generation) - self.new_entries = {} # object ID => (offset, generation) - self.deleted_entries = {0: 65536} # object ID => generation - self.reading_finished = False - - def __setitem__(self, key, value): - if self.reading_finished: - self.new_entries[key] = value - else: - self.existing_entries[key] = value - if key in self.deleted_entries: - del self.deleted_entries[key] - - def __getitem__(self, key): - try: - return self.new_entries[key] - except KeyError: - return self.existing_entries[key] - - def __delitem__(self, key): - if key in self.new_entries: - generation = self.new_entries[key][1] + 1 - del self.new_entries[key] - self.deleted_entries[key] = generation - elif key in self.existing_entries: - generation = self.existing_entries[key][1] + 1 - self.deleted_entries[key] = generation - elif key in self.deleted_entries: - generation = self.deleted_entries[key] - else: - msg = ( - "object ID " + str(key) + " cannot be deleted because it doesn't exist" - ) - raise IndexError(msg) - - def __contains__(self, key): - return key in self.existing_entries or key in self.new_entries - - def __len__(self): - return len( - set(self.existing_entries.keys()) - | set(self.new_entries.keys()) - | set(self.deleted_entries.keys()) - ) - - def keys(self): - return ( - set(self.existing_entries.keys()) - set(self.deleted_entries.keys()) - ) | set(self.new_entries.keys()) - - def write(self, f): - keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) - deleted_keys = sorted(set(self.deleted_entries.keys())) - startxref = f.tell() - f.write(b"xref\n") - while keys: - # find a contiguous sequence of object IDs - prev = None - for index, key in enumerate(keys): - if prev is None or prev + 1 == key: - prev = key - else: - contiguous_keys = keys[:index] - keys = keys[index:] - break - else: - contiguous_keys = keys - keys = None - f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) - for object_id in contiguous_keys: - if object_id in self.new_entries: - f.write(b"%010d %05d n \n" % self.new_entries[object_id]) - else: - this_deleted_object_id = deleted_keys.pop(0) - check_format_condition( - object_id == this_deleted_object_id, - f"expected the next deleted object ID to be {object_id}, " - f"instead found {this_deleted_object_id}", - ) - try: - next_in_linked_list = deleted_keys[0] - except IndexError: - next_in_linked_list = 0 - f.write( - b"%010d %05d f \n" - % (next_in_linked_list, self.deleted_entries[object_id]) - ) - return startxref - - -class PdfName: - def __init__(self, name): - if isinstance(name, PdfName): - self.name = name.name - elif isinstance(name, bytes): - self.name = name - else: - self.name = name.encode("us-ascii") - - def name_as_str(self): - return self.name.decode("us-ascii") - - def __eq__(self, other): - return ( - isinstance(other, PdfName) and other.name == self.name - ) or other == self.name - - def __hash__(self): - return hash(self.name) - - def __repr__(self): - return f"PdfName({repr(self.name)})" - - @classmethod - def from_pdf_stream(cls, data): - return cls(PdfParser.interpret_name(data)) - - allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"} - - def __bytes__(self): - result = bytearray(b"/") - for b in self.name: - if b in self.allowed_chars: - result.append(b) - else: - result.extend(b"#%02X" % b) - return bytes(result) - - -class PdfArray(List[Any]): - def __bytes__(self): - return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" - - -if TYPE_CHECKING: - _DictBase = collections.UserDict[Union[str, bytes], Any] -else: - _DictBase = collections.UserDict - - -class PdfDict(_DictBase): - def __setattr__(self, key, value): - if key == "data": - collections.UserDict.__setattr__(self, key, value) - else: - self[key.encode("us-ascii")] = value - - def __getattr__(self, key): - try: - value = self[key.encode("us-ascii")] - except KeyError as e: - raise AttributeError(key) from e - if isinstance(value, bytes): - value = decode_text(value) - if key.endswith("Date"): - if value.startswith("D:"): - value = value[2:] - - relationship = "Z" - if len(value) > 17: - relationship = value[14] - offset = int(value[15:17]) * 60 - if len(value) > 20: - offset += int(value[18:20]) - - format = "%Y%m%d%H%M%S"[: len(value) - 2] - value = time.strptime(value[: len(format) + 2], format) - if relationship in ["+", "-"]: - offset *= 60 - if relationship == "+": - offset *= -1 - value = time.gmtime(calendar.timegm(value) + offset) - return value - - def __bytes__(self): - out = bytearray(b"<<") - for key, value in self.items(): - if value is None: - continue - value = pdf_repr(value) - out.extend(b"\n") - out.extend(bytes(PdfName(key))) - out.extend(b" ") - out.extend(value) - out.extend(b"\n>>") - return bytes(out) - - -class PdfBinary: - def __init__(self, data): - self.data = data - - def __bytes__(self): - return b"<%s>" % b"".join(b"%02X" % b for b in self.data) - - -class PdfStream: - def __init__(self, dictionary, buf): - self.dictionary = dictionary - self.buf = buf - - def decode(self): - try: - filter = self.dictionary.Filter - except AttributeError: - return self.buf - if filter == b"FlateDecode": - try: - expected_length = self.dictionary.DL - except AttributeError: - expected_length = self.dictionary.Length - return zlib.decompress(self.buf, bufsize=int(expected_length)) - else: - msg = f"stream filter {repr(self.dictionary.Filter)} unknown/unsupported" - raise NotImplementedError(msg) - - -def pdf_repr(x): - if x is True: - return b"true" - elif x is False: - return b"false" - elif x is None: - return b"null" - elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)): - return bytes(x) - elif isinstance(x, (int, float)): - return str(x).encode("us-ascii") - elif isinstance(x, time.struct_time): - return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" - elif isinstance(x, dict): - return bytes(PdfDict(x)) - elif isinstance(x, list): - return bytes(PdfArray(x)) - elif isinstance(x, str): - return pdf_repr(encode_text(x)) - elif isinstance(x, bytes): - # XXX escape more chars? handle binary garbage - x = x.replace(b"\\", b"\\\\") - x = x.replace(b"(", b"\\(") - x = x.replace(b")", b"\\)") - return b"(" + x + b")" - else: - return bytes(x) - - -class PdfParser: - """Based on - https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf - Supports PDF up to 1.4 - """ - - def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): - if buf and f: - msg = "specify buf or f or filename, but not both buf and f" - raise RuntimeError(msg) - self.filename = filename - self.buf = buf - self.f = f - self.start_offset = start_offset - self.should_close_buf = False - self.should_close_file = False - if filename is not None and f is None: - self.f = f = open(filename, mode) - self.should_close_file = True - if f is not None: - self.buf = buf = self.get_buf_from_file(f) - self.should_close_buf = True - if not filename and hasattr(f, "name"): - self.filename = f.name - self.cached_objects = {} - if buf: - self.read_pdf_info() - else: - self.file_size_total = self.file_size_this = 0 - self.root = PdfDict() - self.root_ref = None - self.info = PdfDict() - self.info_ref = None - self.page_tree_root = {} - self.pages = [] - self.orig_pages = [] - self.pages_ref = None - self.last_xref_section_offset = None - self.trailer_dict = {} - self.xref_table = XrefTable() - self.xref_table.reading_finished = True - if f: - self.seek_end() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - self.close() - return False # do not suppress exceptions - - def start_writing(self): - self.close_buf() - self.seek_end() - - def close_buf(self): - try: - self.buf.close() - except AttributeError: - pass - self.buf = None - - def close(self): - if self.should_close_buf: - self.close_buf() - if self.f is not None and self.should_close_file: - self.f.close() - self.f = None - - def seek_end(self): - self.f.seek(0, os.SEEK_END) - - def write_header(self): - self.f.write(b"%PDF-1.4\n") - - def write_comment(self, s): - self.f.write(f"% {s}\n".encode()) - - def write_catalog(self): - self.del_root() - self.root_ref = self.next_object_id(self.f.tell()) - self.pages_ref = self.next_object_id(0) - self.rewrite_pages() - self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) - self.write_obj( - self.pages_ref, - Type=PdfName(b"Pages"), - Count=len(self.pages), - Kids=self.pages, - ) - return self.root_ref - - def rewrite_pages(self): - pages_tree_nodes_to_delete = [] - for i, page_ref in enumerate(self.orig_pages): - page_info = self.cached_objects[page_ref] - del self.xref_table[page_ref.object_id] - pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) - if page_ref not in self.pages: - # the page has been deleted - continue - # make dict keys into strings for passing to write_page - stringified_page_info = {} - for key, value in page_info.items(): - # key should be a PdfName - stringified_page_info[key.name_as_str()] = value - stringified_page_info["Parent"] = self.pages_ref - new_page_ref = self.write_page(None, **stringified_page_info) - for j, cur_page_ref in enumerate(self.pages): - if cur_page_ref == page_ref: - # replace the page reference with the new one - self.pages[j] = new_page_ref - # delete redundant Pages tree nodes from xref table - for pages_tree_node_ref in pages_tree_nodes_to_delete: - while pages_tree_node_ref: - pages_tree_node = self.cached_objects[pages_tree_node_ref] - if pages_tree_node_ref.object_id in self.xref_table: - del self.xref_table[pages_tree_node_ref.object_id] - pages_tree_node_ref = pages_tree_node.get(b"Parent", None) - self.orig_pages = [] - - def write_xref_and_trailer(self, new_root_ref=None): - if new_root_ref: - self.del_root() - self.root_ref = new_root_ref - if self.info: - self.info_ref = self.write_obj(None, self.info) - start_xref = self.xref_table.write(self.f) - num_entries = len(self.xref_table) - trailer_dict = {b"Root": self.root_ref, b"Size": num_entries} - if self.last_xref_section_offset is not None: - trailer_dict[b"Prev"] = self.last_xref_section_offset - if self.info: - trailer_dict[b"Info"] = self.info_ref - self.last_xref_section_offset = start_xref - self.f.write( - b"trailer\n" - + bytes(PdfDict(trailer_dict)) - + b"\nstartxref\n%d\n%%%%EOF" % start_xref - ) - - def write_page(self, ref, *objs, **dict_obj): - if isinstance(ref, int): - ref = self.pages[ref] - if "Type" not in dict_obj: - dict_obj["Type"] = PdfName(b"Page") - if "Parent" not in dict_obj: - dict_obj["Parent"] = self.pages_ref - return self.write_obj(ref, *objs, **dict_obj) - - def write_obj(self, ref, *objs, **dict_obj): - f = self.f - if ref is None: - ref = self.next_object_id(f.tell()) - else: - self.xref_table[ref.object_id] = (f.tell(), ref.generation) - f.write(bytes(IndirectObjectDef(*ref))) - stream = dict_obj.pop("stream", None) - if stream is not None: - dict_obj["Length"] = len(stream) - if dict_obj: - f.write(pdf_repr(dict_obj)) - for obj in objs: - f.write(pdf_repr(obj)) - if stream is not None: - f.write(b"stream\n") - f.write(stream) - f.write(b"\nendstream\n") - f.write(b"endobj\n") - return ref - - def del_root(self): - if self.root_ref is None: - return - del self.xref_table[self.root_ref.object_id] - del self.xref_table[self.root[b"Pages"].object_id] - - @staticmethod - def get_buf_from_file(f): - if hasattr(f, "getbuffer"): - return f.getbuffer() - elif hasattr(f, "getvalue"): - return f.getvalue() - else: - try: - return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - except ValueError: # cannot mmap an empty file - return b"" - - def read_pdf_info(self): - self.file_size_total = len(self.buf) - self.file_size_this = self.file_size_total - self.start_offset - self.read_trailer() - self.root_ref = self.trailer_dict[b"Root"] - self.info_ref = self.trailer_dict.get(b"Info", None) - self.root = PdfDict(self.read_indirect(self.root_ref)) - if self.info_ref is None: - self.info = PdfDict() - else: - self.info = PdfDict(self.read_indirect(self.info_ref)) - check_format_condition(b"Type" in self.root, "/Type missing in Root") - check_format_condition( - self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog" - ) - check_format_condition(b"Pages" in self.root, "/Pages missing in Root") - check_format_condition( - isinstance(self.root[b"Pages"], IndirectReference), - "/Pages in Root is not an indirect reference", - ) - self.pages_ref = self.root[b"Pages"] - self.page_tree_root = self.read_indirect(self.pages_ref) - self.pages = self.linearize_page_tree(self.page_tree_root) - # save the original list of page references - # in case the user modifies, adds or deletes some pages - # and we need to rewrite the pages and their list - self.orig_pages = self.pages[:] - - def next_object_id(self, offset=None): - try: - # TODO: support reuse of deleted objects - reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) - except ValueError: - reference = IndirectReference(1, 0) - if offset is not None: - self.xref_table[reference.object_id] = (offset, 0) - return reference - - delimiter = rb"[][()<>{}/%]" - delimiter_or_ws = rb"[][()<>{}/%\000\011\012\014\015\040]" - whitespace = rb"[\000\011\012\014\015\040]" - whitespace_or_hex = rb"[\000\011\012\014\015\0400-9a-fA-F]" - whitespace_optional = whitespace + b"*" - whitespace_mandatory = whitespace + b"+" - # No "\012" aka "\n" or "\015" aka "\r": - whitespace_optional_no_nl = rb"[\000\011\014\040]*" - newline_only = rb"[\r\n]+" - newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl - re_trailer_end = re.compile( - whitespace_mandatory - + rb"trailer" - + whitespace_optional - + rb"<<(.*>>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional - + rb"$", - re.DOTALL, - ) - re_trailer_prev = re.compile( - whitespace_optional - + rb"trailer" - + whitespace_optional - + rb"<<(.*?>>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional, - re.DOTALL, - ) - - def read_trailer(self): - search_start_offset = len(self.buf) - 16384 - if search_start_offset < self.start_offset: - search_start_offset = self.start_offset - m = self.re_trailer_end.search(self.buf, search_start_offset) - check_format_condition(m, "trailer end not found") - # make sure we found the LAST trailer - last_match = m - while m: - last_match = m - m = self.re_trailer_end.search(self.buf, m.start() + 16) - if not m: - m = last_match - trailer_data = m.group(1) - self.last_xref_section_offset = int(m.group(2)) - self.trailer_dict = self.interpret_trailer(trailer_data) - self.xref_table = XrefTable() - self.read_xref_table(xref_section_offset=self.last_xref_section_offset) - if b"Prev" in self.trailer_dict: - self.read_prev_trailer(self.trailer_dict[b"Prev"]) - - def read_prev_trailer(self, xref_section_offset): - trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) - m = self.re_trailer_prev.search( - self.buf[trailer_offset : trailer_offset + 16384] - ) - check_format_condition(m, "previous trailer not found") - trailer_data = m.group(1) - check_format_condition( - int(m.group(2)) == xref_section_offset, - "xref section offset in previous trailer doesn't match what was expected", - ) - trailer_dict = self.interpret_trailer(trailer_data) - if b"Prev" in trailer_dict: - self.read_prev_trailer(trailer_dict[b"Prev"]) - - re_whitespace_optional = re.compile(whitespace_optional) - re_name = re.compile( - whitespace_optional - + rb"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" - + delimiter_or_ws - + rb")" - ) - re_dict_start = re.compile(whitespace_optional + rb"<<") - re_dict_end = re.compile(whitespace_optional + rb">>" + whitespace_optional) - - @classmethod - def interpret_trailer(cls, trailer_data): - trailer = {} - offset = 0 - while True: - m = cls.re_name.match(trailer_data, offset) - if not m: - m = cls.re_dict_end.match(trailer_data, offset) - check_format_condition( - m and m.end() == len(trailer_data), - "name not found in trailer, remaining data: " - + repr(trailer_data[offset:]), - ) - break - key = cls.interpret_name(m.group(1)) - value, offset = cls.get_value(trailer_data, m.end()) - trailer[key] = value - check_format_condition( - b"Size" in trailer and isinstance(trailer[b"Size"], int), - "/Size not in trailer or not an integer", - ) - check_format_condition( - b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), - "/Root not in trailer or not an indirect reference", - ) - return trailer - - re_hashes_in_name = re.compile(rb"([^#]*)(#([0-9a-fA-F]{2}))?") - - @classmethod - def interpret_name(cls, raw, as_text=False): - name = b"" - for m in cls.re_hashes_in_name.finditer(raw): - if m.group(3): - name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) - else: - name += m.group(1) - if as_text: - return name.decode("utf-8") - else: - return bytes(name) - - re_null = re.compile(whitespace_optional + rb"null(?=" + delimiter_or_ws + rb")") - re_true = re.compile(whitespace_optional + rb"true(?=" + delimiter_or_ws + rb")") - re_false = re.compile(whitespace_optional + rb"false(?=" + delimiter_or_ws + rb")") - re_int = re.compile( - whitespace_optional + rb"([-+]?[0-9]+)(?=" + delimiter_or_ws + rb")" - ) - re_real = re.compile( - whitespace_optional - + rb"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" - + delimiter_or_ws - + rb")" - ) - re_array_start = re.compile(whitespace_optional + rb"\[") - re_array_end = re.compile(whitespace_optional + rb"]") - re_string_hex = re.compile( - whitespace_optional + rb"<(" + whitespace_or_hex + rb"*)>" - ) - re_string_lit = re.compile(whitespace_optional + rb"\(") - re_indirect_reference = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"R(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_start = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"obj(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_end = re.compile( - whitespace_optional + rb"endobj(?=" + delimiter_or_ws + rb")" - ) - re_comment = re.compile( - rb"(" + whitespace_optional + rb"%[^\r\n]*" + newline + rb")*" - ) - re_stream_start = re.compile(whitespace_optional + rb"stream\r?\n") - re_stream_end = re.compile( - whitespace_optional + rb"endstream(?=" + delimiter_or_ws + rb")" - ) - - @classmethod - def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): - if max_nesting == 0: - return None, None - m = cls.re_comment.match(data, offset) - if m: - offset = m.end() - m = cls.re_indirect_def_start.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object definition: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object definition: generation must be non-negative", - ) - check_format_condition( - expect_indirect is None - or expect_indirect - == IndirectReference(int(m.group(1)), int(m.group(2))), - "indirect object definition different than expected", - ) - object, offset = cls.get_value(data, m.end(), max_nesting=max_nesting - 1) - if offset is None: - return object, None - m = cls.re_indirect_def_end.match(data, offset) - check_format_condition(m, "indirect object definition end not found") - return object, m.end() - check_format_condition( - not expect_indirect, "indirect object definition not found" - ) - m = cls.re_indirect_reference.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object reference: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object reference: generation must be non-negative", - ) - return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() - m = cls.re_dict_start.match(data, offset) - if m: - offset = m.end() - result = {} - m = cls.re_dict_end.match(data, offset) - while not m: - key, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - if offset is None: - return result, None - value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - result[key] = value - if offset is None: - return result, None - m = cls.re_dict_end.match(data, offset) - offset = m.end() - m = cls.re_stream_start.match(data, offset) - if m: - try: - stream_len = int(result[b"Length"]) - except (TypeError, KeyError, ValueError) as e: - msg = "bad or missing Length in stream dict (%r)" % result.get( - b"Length", None - ) - raise PdfFormatError(msg) from e - stream_data = data[m.end() : m.end() + stream_len] - m = cls.re_stream_end.match(data, m.end() + stream_len) - check_format_condition(m, "stream end not found") - offset = m.end() - result = PdfStream(PdfDict(result), stream_data) - else: - result = PdfDict(result) - return result, offset - m = cls.re_array_start.match(data, offset) - if m: - offset = m.end() - result = [] - m = cls.re_array_end.match(data, offset) - while not m: - value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - result.append(value) - if offset is None: - return result, None - m = cls.re_array_end.match(data, offset) - return result, m.end() - m = cls.re_null.match(data, offset) - if m: - return None, m.end() - m = cls.re_true.match(data, offset) - if m: - return True, m.end() - m = cls.re_false.match(data, offset) - if m: - return False, m.end() - m = cls.re_name.match(data, offset) - if m: - return PdfName(cls.interpret_name(m.group(1))), m.end() - m = cls.re_int.match(data, offset) - if m: - return int(m.group(1)), m.end() - m = cls.re_real.match(data, offset) - if m: - # XXX Decimal instead of float??? - return float(m.group(1)), m.end() - m = cls.re_string_hex.match(data, offset) - if m: - # filter out whitespace - hex_string = bytearray( - b for b in m.group(1) if b in b"0123456789abcdefABCDEF" - ) - if len(hex_string) % 2 == 1: - # append a 0 if the length is not even - yes, at the end - hex_string.append(ord(b"0")) - return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() - m = cls.re_string_lit.match(data, offset) - if m: - return cls.get_literal_string(data, m.end()) - # return None, offset # fallback (only for debugging) - msg = "unrecognized object: " + repr(data[offset : offset + 32]) - raise PdfFormatError(msg) - - re_lit_str_token = re.compile( - rb"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))" - ) - escaped_chars = { - b"n": b"\n", - b"r": b"\r", - b"t": b"\t", - b"b": b"\b", - b"f": b"\f", - b"(": b"(", - b")": b")", - b"\\": b"\\", - ord(b"n"): b"\n", - ord(b"r"): b"\r", - ord(b"t"): b"\t", - ord(b"b"): b"\b", - ord(b"f"): b"\f", - ord(b"("): b"(", - ord(b")"): b")", - ord(b"\\"): b"\\", - } - - @classmethod - def get_literal_string(cls, data, offset): - nesting_depth = 0 - result = bytearray() - for m in cls.re_lit_str_token.finditer(data, offset): - result.extend(data[offset : m.start()]) - if m.group(1): - result.extend(cls.escaped_chars[m.group(1)[1]]) - elif m.group(2): - result.append(int(m.group(2)[1:], 8)) - elif m.group(3): - pass - elif m.group(5): - result.extend(b"\n") - elif m.group(6): - result.extend(b"(") - nesting_depth += 1 - elif m.group(7): - if nesting_depth == 0: - return bytes(result), m.end() - result.extend(b")") - nesting_depth -= 1 - offset = m.end() - msg = "unfinished literal string" - raise PdfFormatError(msg) - - re_xref_section_start = re.compile(whitespace_optional + rb"xref" + newline) - re_xref_subsection_start = re.compile( - whitespace_optional - + rb"([0-9]+)" - + whitespace_mandatory - + rb"([0-9]+)" - + whitespace_optional - + newline_only - ) - re_xref_entry = re.compile(rb"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") - - def read_xref_table(self, xref_section_offset): - subsection_found = False - m = self.re_xref_section_start.match( - self.buf, xref_section_offset + self.start_offset - ) - check_format_condition(m, "xref section start not found") - offset = m.end() - while True: - m = self.re_xref_subsection_start.match(self.buf, offset) - if not m: - check_format_condition( - subsection_found, "xref subsection start not found" - ) - break - subsection_found = True - offset = m.end() - first_object = int(m.group(1)) - num_objects = int(m.group(2)) - for i in range(first_object, first_object + num_objects): - m = self.re_xref_entry.match(self.buf, offset) - check_format_condition(m, "xref entry not found") - offset = m.end() - is_free = m.group(3) == b"f" - if not is_free: - generation = int(m.group(2)) - new_entry = (int(m.group(1)), generation) - if i not in self.xref_table: - self.xref_table[i] = new_entry - return offset - - def read_indirect(self, ref, max_nesting=-1): - offset, generation = self.xref_table[ref[0]] - check_format_condition( - generation == ref[1], - f"expected to find generation {ref[1]} for object ID {ref[0]} in xref " - f"table, instead found generation {generation} at offset {offset}", - ) - value = self.get_value( - self.buf, - offset + self.start_offset, - expect_indirect=IndirectReference(*ref), - max_nesting=max_nesting, - )[0] - self.cached_objects[ref] = value - return value - - def linearize_page_tree(self, node=None): - if node is None: - node = self.page_tree_root - check_format_condition( - node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages" - ) - pages = [] - for kid in node[b"Kids"]: - kid_object = self.read_indirect(kid) - if kid_object[b"Type"] == b"Page": - pages.append(kid) - else: - pages.extend(self.linearize_page_tree(node=kid_object)) - return pages diff --git a/.flatpak-builder/cache/objects/4d/e9418f1f2a24e95b21f535706b252d03baa8cacf5c930d54d2a19584fe9282.file b/.flatpak-builder/cache/objects/4d/e9418f1f2a24e95b21f535706b252d03baa8cacf5c930d54d2a19584fe9282.file deleted file mode 100644 index f2cf635..0000000 --- a/.flatpak-builder/cache/objects/4d/e9418f1f2a24e95b21f535706b252d03baa8cacf5c930d54d2a19584fe9282.file +++ /dev/null @@ -1,50 +0,0 @@ -""" -requests._internal_utils -~~~~~~~~~~~~~~ - -Provides utility functions that are consumed internally by Requests -which depend on extremely few external helpers (such as compat) -""" -import re - -from .compat import builtin_str - -_VALID_HEADER_NAME_RE_BYTE = re.compile(rb"^[^:\s][^:\r\n]*$") -_VALID_HEADER_NAME_RE_STR = re.compile(r"^[^:\s][^:\r\n]*$") -_VALID_HEADER_VALUE_RE_BYTE = re.compile(rb"^\S[^\r\n]*$|^$") -_VALID_HEADER_VALUE_RE_STR = re.compile(r"^\S[^\r\n]*$|^$") - -_HEADER_VALIDATORS_STR = (_VALID_HEADER_NAME_RE_STR, _VALID_HEADER_VALUE_RE_STR) -_HEADER_VALIDATORS_BYTE = (_VALID_HEADER_NAME_RE_BYTE, _VALID_HEADER_VALUE_RE_BYTE) -HEADER_VALIDATORS = { - bytes: _HEADER_VALIDATORS_BYTE, - str: _HEADER_VALIDATORS_STR, -} - - -def to_native_string(string, encoding="ascii"): - """Given a string object, regardless of type, returns a representation of - that string in the native string type, encoding and decoding where - necessary. This assumes ASCII unless told otherwise. - """ - if isinstance(string, builtin_str): - out = string - else: - out = string.decode(encoding) - - return out - - -def unicode_is_ascii(u_string): - """Determine if unicode string only contains ASCII characters. - - :param str u_string: unicode string to check. Must be unicode - and not Python 2 `str`. - :rtype: bool - """ - assert isinstance(u_string, str) - try: - u_string.encode("ascii") - return True - except UnicodeEncodeError: - return False diff --git a/.flatpak-builder/cache/objects/4e/303c49c60d15801002820651e98eeb26fe5dc09b8c9bb3516d3438e2450ebe.file b/.flatpak-builder/cache/objects/4e/303c49c60d15801002820651e98eeb26fe5dc09b8c9bb3516d3438e2450ebe.file deleted file mode 100644 index 0db510965b003ec972c75bcb6b8eaa2e53f03391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15364 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 diff --git a/.flatpak-builder/cache/objects/4e/aabb3c0cdf232058bbccbc58e51ccc7f8ccc7eca4916b433e5090b6dc0e4d4.file b/.flatpak-builder/cache/objects/4e/aabb3c0cdf232058bbccbc58e51ccc7f8ccc7eca4916b433e5090b6dc0e4d4.file deleted file mode 100644 index c910ca6..0000000 --- a/.flatpak-builder/cache/objects/4e/aabb3c0cdf232058bbccbc58e51ccc7f8ccc7eca4916b433e5090b6dc0e4d4.file +++ /dev/null @@ -1,214 +0,0 @@ -PIL/BdfFontFile.py,sha256=CgWJtLCciuqgkpRedO-0xvIYsEe-AGUxs5k9AGbllPg,3469 -PIL/BlpImagePlugin.py,sha256=EUG7Z0Ub01IojONKCwgV8hnLRA4wpG3ugnF09NPFet0,15556 -PIL/BmpImagePlugin.py,sha256=umQd5qExzXgvyqrEKOMVYftObW71BWKCrmXAv0pp3Rs,17733 -PIL/BufrStubImagePlugin.py,sha256=6b85Pu28dcbLAaCCZHWfhRkAU5-_J7lMWVRi-C6QnPc,1592 -PIL/ContainerIO.py,sha256=0lHPzJmOqWx2XK_oBQeiwBbr8Y6xT182Y72q_yj6wIo,3181 -PIL/CurImagePlugin.py,sha256=9aIXiNuTVkA0WlcPb5q5C5ZiDVcGBeI-EfsP5FjtP8U,1741 -PIL/DcxImagePlugin.py,sha256=A3Av_UXMGR51I8TmBQTJIQUyLbLUwUho0gHKDEQIIp0,1993 -PIL/DdsImagePlugin.py,sha256=_Nn_lmoa0zHhcKx2o6A3bkktQaXxKMraf_dfPVMOkUU,16711 -PIL/EpsImagePlugin.py,sha256=X0R_sgNv3rLKjesLEh0F-dhD7kSl0BvJw_yX3Y8-hfA,15809 -PIL/ExifTags.py,sha256=zuMaexyJLTtuVZlOv43_P7qR7YMgjHffu7SOpPdvN3E,9753 -PIL/FitsImagePlugin.py,sha256=_3lMteXeNGGVmyJ7lcngKreyxcJ0vTm3Z_0pygZuWzM,4490 -PIL/FliImagePlugin.py,sha256=6w9Ygb4wzUCHillPVHUG62xPfoQenoj_oGBacLX4zDU,4563 -PIL/FontFile.py,sha256=St7MxO5Q-oakCLWn3ZrgrtaT3wSsmAarxm8AU-G8Moc,3577 -PIL/FpxImagePlugin.py,sha256=mXaNTmqTRx8v2YrA5ujT31Ph92pdQo082fqStGLLQTg,6983 -PIL/FtexImagePlugin.py,sha256=rOCpWFSUFhf3E9I8e7SNyo6fsK_pwe7nmCUKJ6e7aSQ,3466 -PIL/GbrImagePlugin.py,sha256=eMCpGbv7k1kO-o0LxfWbPivVOW85sxzhj80m79KQqlY,2945 -PIL/GdImageFile.py,sha256=bHdFfO9rqxiBI9hLpJQVRv0rLj1boWc-nea9rFgIBVs,2795 -PIL/GifImagePlugin.py,sha256=V0Ng9zC0ohcmRvBXT_hm8OGGaDejJ34sUDqQsZjLj3o,37720 -PIL/GimpGradientFile.py,sha256=tsjtwjYF66-bf1XNsTM5wI6Ix_wDODDO4TsDAhVhA4U,3430 -PIL/GimpPaletteFile.py,sha256=cEgzwxWE7Un4ecteOuKQtOCzXKnDZB1XBUPr8eOFymw,1380 -PIL/GribStubImagePlugin.py,sha256=_RF5KKShDil6f1ZBppBxZ9ZDzLzA4SfF8NU0O3sxqWk,1586 -PIL/Hdf5StubImagePlugin.py,sha256=Ryc2pROK1Zv67JOsNqWNc69qjX4EefdnLZolryEW4ZI,1589 -PIL/IcnsImagePlugin.py,sha256=KvI7GUIPjUHvjgFib08Xnr-S95jJE47flrpEaKGGfCk,11996 -PIL/IcoImagePlugin.py,sha256=bKKxLV8rspe0BLCA-u0_e4QmJ6xqI-NXOn7ypW6k_t8,11640 -PIL/ImImagePlugin.py,sha256=cUR0hNu8GtFed5lc3_C7q_xQNINC9DUNpJMymwwWbbg,10904 -PIL/Image.py,sha256=ccaq8zMwhi9G6e_Tdbwuc14iCxDowyexx5O6cCLDvaQ,137068 -PIL/ImageChops.py,sha256=GEjlymcoDtA5OOeIxQVIX96BD-s6AXhb7TmSLYn2tUg,7946 -PIL/ImageCms.py,sha256=0uG9vycWQXDU-g_o_c5XPnPMReBIyojvluihuJJb-_4,41353 -PIL/ImageColor.py,sha256=hzIxLczMm2xIHOqh4omU0DxXoc4_-UV7jppatfBMiek,9197 -PIL/ImageDraw.py,sha256=ZbNdtxKUiFW7UWeYnqZ-aPGJp1n-H1_tbd6Utd5boKc,37762 -PIL/ImageDraw2.py,sha256=mbG4zwC6tCpMwea4fzXLCO2dT7D4FS5Qu4C5n1XupE0,5535 -PIL/ImageEnhance.py,sha256=2sC99It-If3s69RzTdDVV0lLscdE0P5ZbNflOzm6FPE,3225 -PIL/ImageFile.py,sha256=GZWPddFu9y2I1ACuGWwjljGaIohgj8Tf9lvimLvpd_0,24421 -PIL/ImageFilter.py,sha256=wpGOcSSFZq2fc8UfEIJxDk10uTwNhYW0WpPTk32Gclk,17033 -PIL/ImageFont.py,sha256=faDw-UrjSa_kmL1S4xNGekE1BzT0EM9w2wvQCcZlhxw,60568 -PIL/ImageGrab.py,sha256=ms7MbA9ncsk5D6VPZUk8hUlcMfhYnxapv0EXhEoUVMg,6098 -PIL/ImageMath.py,sha256=X_LiAqpTsvCwQtdW07Ji9VdQn8dAXwzGOM8rEQoYGQY,11480 -PIL/ImageMode.py,sha256=aqTBqT_GqrlBo0azaCmEPzHj6pasdtk2aWDGGna0meA,2770 -PIL/ImageMorph.py,sha256=k7Rbd3IfkJxtvyb9Yr9ln53r2LElAZXqTH0sTTL6M9E,8483 -PIL/ImageOps.py,sha256=a8g279h_lbLHTmCXfLIPlkTS-4OjLDsVXYQ1z-EqDRg,24772 -PIL/ImagePalette.py,sha256=Vn9b9eP8gIhjpkCAMqloJNUmQElaoGHxLhJ-yw4l4Hc,7865 -PIL/ImagePath.py,sha256=5yUG5XCUil1KKTTA_8PgGhcmg-mnue-GK0FwTBlhjw4,371 -PIL/ImageQt.py,sha256=FChTYnuPLJ8PEvWKPi9bVTHtBum8_K9SSaO47RyRwcg,5952 -PIL/ImageSequence.py,sha256=j-i3HxuBqkVFPPZSRerCeRlkAYG0orFkWc9mG5IhYSM,2192 -PIL/ImageShow.py,sha256=E50d0z7V0968Yola6uUR8UwO0TQtMdnsQNyhRUDbvxc,9445 -PIL/ImageStat.py,sha256=ImYsQY6lIdht8_pNmofHXHMz_tWlsV3ct2eHDbx0DEA,3724 -PIL/ImageTk.py,sha256=v7UpqgvLscTrc3woG_q0HQLlAX1JZMgj3nmXVi2rJb0,8496 -PIL/ImageTransform.py,sha256=R7OoWdH__0E8fG-Dv99-fjBfDoQhRqMkdjVYCDGXUd4,3901 -PIL/ImageWin.py,sha256=AeO3qPyeQzEOagNb9AWOiWX2ZyRK4qTyEXgdttF-YzI,7226 -PIL/ImtImagePlugin.py,sha256=akFpmHvG8zULUaIzm97hjf4DvHNtwqv743cFivFZ8bA,2658 -PIL/IptcImagePlugin.py,sha256=ZCydfUtpgPeMz1o9Fg9mkE0HUrU-wUUt9ijge7g7pH4,6135 -PIL/Jpeg2KImagePlugin.py,sha256=WlIa72wRQYz-xtDGvNS7VCOg04i8YIPz5hyoxiiIAJ8,11914 -PIL/JpegImagePlugin.py,sha256=HsFU08YvgKbveI17n-Xr-ROGhYXrq8YBD62FDp2jMrg,29578 -PIL/JpegPresets.py,sha256=WBNUfD0CpQsEEtCPmELxmdFqBAJ6xN5RrYz4QqMfmK0,12422 -PIL/McIdasImagePlugin.py,sha256=8ILYNfntSiZzzNuBD2Q4UQtjj3sIywPHVI4EeVXxJIo,1901 -PIL/MicImagePlugin.py,sha256=ghIjl4yl-ifdH7ykjkokhd2dMCOc5Bpn2wi0FJ4gpM8,2615 -PIL/MpegImagePlugin.py,sha256=QqfR8MFL2Mr_ruEwKpzPJmPMgkIwuS_0wfmO-eRdNa8,2008 -PIL/MpoImagePlugin.py,sha256=mt9M_ZNy0pkwVSVnwKcaUxIYnsHil87DLpb5mkYfMW8,5785 -PIL/MspImagePlugin.py,sha256=hew-xMKOtQSIapetfQ-9AXb8-YjJj-fLqfVrUroF8Go,5828 -PIL/PSDraw.py,sha256=n-UXRnVJAALbmL3aVYJz9_D_CAkpDulXCnHs2Esfn7c,6560 -PIL/PaletteFile.py,sha256=ZMuQqDZ7X9d_c9LRMV7Wku1U7v_rVIHlT0Zipu4W4Eg,1163 -PIL/PalmImagePlugin.py,sha256=Txc8OcCjyJiR80npQKgw06-JgX_pFnEv8BHsF3co64M,9179 -PIL/PcdImagePlugin.py,sha256=BXsw4s68ByoQMD1UQjdoPkMQ3M41u_sDclZgKyUPDws,1623 -PIL/PcfFontFile.py,sha256=NPZQ0XkbGB8uTlGqgmIPGkwuLMYBdykDeVuvFgIC7JU,7147 -PIL/PcxImagePlugin.py,sha256=4cmasyj-_JuGcB1eS6s5AhM8QxaA73cKhDMBPGNo6V4,6209 -PIL/PdfImagePlugin.py,sha256=obF_lgWcas78e96zlG6d9pdM2F1eXNM3nHlqIWmYbGo,8849 -PIL/PdfParser.py,sha256=gPUzlnX4rHZ7Fe0HpJoposPHyhUyvdCexaeDVGPKPlE,34686 -PIL/PixarImagePlugin.py,sha256=4ua-rSZO8m76N0GK_Z5OVEqtORmNK47he22GEaUiyxI,1746 -PIL/PngImagePlugin.py,sha256=lC5j7csnTeQfhaS65mnvFXr2wKjbFtq2Il_Meied778,46882 -PIL/PpmImagePlugin.py,sha256=1W7myY1EDLpMwdhe73nO0zNqJAYTP6caen-m9atHlzc,12208 -PIL/PsdImagePlugin.py,sha256=M6ctlhVmZNCfYkUsfoVNJQEOuuEy0lUC-Ir_8v-og_I,7705 -PIL/PyAccess.py,sha256=emN_Wktr1lZHaNQpPEckxCymvxCnYA2CD-bQm-IvZsw,9919 -PIL/QoiImagePlugin.py,sha256=InmYOYhAblvhwU_Yciz1QMNCHOSTD3xyAWkrwkQN31o,3817 -PIL/SgiImagePlugin.py,sha256=3_yHZnJsONiRe5bZo9U6eW8jKwgaeFvsCkahZf6dwPs,6399 -PIL/SpiderImagePlugin.py,sha256=WoiSQ-PX30v5ZR8oECFEo_z5tLobeVS1MZQWp8uEL2Y,9467 -PIL/SunImagePlugin.py,sha256=cIl8g1mDTT7mwYlp-PswH7AHxdrTf8g7CyiLcMlqUUA,4499 -PIL/TarIO.py,sha256=p2NKGZ9-rKCVdLT5Bc3K_mpNc7SRaZ_b9g86y8WGZuo,1739 -PIL/TgaImagePlugin.py,sha256=_w6-_MeL1SQCLKk9jYMdvWv8PpgaH_i2yku8uiw7XcA,6926 -PIL/TiffImagePlugin.py,sha256=5cgvlJTBwaRcX-KY7AUjNsljfhJG6IjG7CG2obWZfyc,77194 -PIL/TiffTags.py,sha256=CDMYcTJu2rRnCtXVTJVxflBFY0AoW87rtxtrplkeEAI,16679 -PIL/WalImageFile.py,sha256=HUnZ08FnSpFyLS8QEUAX3HdhS0FiVrEfweczbGmVyYM,5555 -PIL/WebPImagePlugin.py,sha256=esWthJUepNciUUqq4BMNfvHGjKEx65Alv4lDmRj5Kak,11522 -PIL/WmfImagePlugin.py,sha256=zfqPQqk0rGPQYmoP_g0euoOYdBjQZr0RtCGk3n2Oxjg,4726 -PIL/XVThumbImagePlugin.py,sha256=NbTby5A2QdDemhe6uDFfV1R1gmbpbxWV_-62h0sNyXU,2081 -PIL/XbmImagePlugin.py,sha256=aJBtltZpyCYVefq_zNGE7qyzzf880YOx_WcJuCgcg4Q,2641 -PIL/XpmImagePlugin.py,sha256=TCVpV4gYioLZZYyFUm7aleAwP8b_3jnMlzIZp3qiOF0,3224 -PIL/__init__.py,sha256=fJUwPGhI8_mcB8jNWD-hUw7MiMJyWgqVX_nFtzIj1Zs,2008 -PIL/__main__.py,sha256=Lpj4vef8mI7jA1sRCUAoVYaeePD_Uc898xF5c7XLx1A,133 -PIL/__pycache__/BdfFontFile.cpython-311.pyc,, -PIL/__pycache__/BlpImagePlugin.cpython-311.pyc,, -PIL/__pycache__/BmpImagePlugin.cpython-311.pyc,, -PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc,, -PIL/__pycache__/ContainerIO.cpython-311.pyc,, -PIL/__pycache__/CurImagePlugin.cpython-311.pyc,, -PIL/__pycache__/DcxImagePlugin.cpython-311.pyc,, -PIL/__pycache__/DdsImagePlugin.cpython-311.pyc,, -PIL/__pycache__/EpsImagePlugin.cpython-311.pyc,, -PIL/__pycache__/ExifTags.cpython-311.pyc,, -PIL/__pycache__/FitsImagePlugin.cpython-311.pyc,, -PIL/__pycache__/FliImagePlugin.cpython-311.pyc,, -PIL/__pycache__/FontFile.cpython-311.pyc,, -PIL/__pycache__/FpxImagePlugin.cpython-311.pyc,, -PIL/__pycache__/FtexImagePlugin.cpython-311.pyc,, -PIL/__pycache__/GbrImagePlugin.cpython-311.pyc,, -PIL/__pycache__/GdImageFile.cpython-311.pyc,, -PIL/__pycache__/GifImagePlugin.cpython-311.pyc,, -PIL/__pycache__/GimpGradientFile.cpython-311.pyc,, -PIL/__pycache__/GimpPaletteFile.cpython-311.pyc,, -PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc,, -PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc,, -PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc,, -PIL/__pycache__/IcoImagePlugin.cpython-311.pyc,, -PIL/__pycache__/ImImagePlugin.cpython-311.pyc,, -PIL/__pycache__/Image.cpython-311.pyc,, -PIL/__pycache__/ImageChops.cpython-311.pyc,, -PIL/__pycache__/ImageCms.cpython-311.pyc,, -PIL/__pycache__/ImageColor.cpython-311.pyc,, -PIL/__pycache__/ImageDraw.cpython-311.pyc,, -PIL/__pycache__/ImageDraw2.cpython-311.pyc,, -PIL/__pycache__/ImageEnhance.cpython-311.pyc,, -PIL/__pycache__/ImageFile.cpython-311.pyc,, -PIL/__pycache__/ImageFilter.cpython-311.pyc,, -PIL/__pycache__/ImageFont.cpython-311.pyc,, -PIL/__pycache__/ImageGrab.cpython-311.pyc,, -PIL/__pycache__/ImageMath.cpython-311.pyc,, -PIL/__pycache__/ImageMode.cpython-311.pyc,, -PIL/__pycache__/ImageMorph.cpython-311.pyc,, -PIL/__pycache__/ImageOps.cpython-311.pyc,, -PIL/__pycache__/ImagePalette.cpython-311.pyc,, -PIL/__pycache__/ImagePath.cpython-311.pyc,, -PIL/__pycache__/ImageQt.cpython-311.pyc,, -PIL/__pycache__/ImageSequence.cpython-311.pyc,, -PIL/__pycache__/ImageShow.cpython-311.pyc,, -PIL/__pycache__/ImageStat.cpython-311.pyc,, -PIL/__pycache__/ImageTk.cpython-311.pyc,, -PIL/__pycache__/ImageTransform.cpython-311.pyc,, -PIL/__pycache__/ImageWin.cpython-311.pyc,, -PIL/__pycache__/ImtImagePlugin.cpython-311.pyc,, -PIL/__pycache__/IptcImagePlugin.cpython-311.pyc,, -PIL/__pycache__/Jpeg2KImagePlugin.cpython-311.pyc,, -PIL/__pycache__/JpegImagePlugin.cpython-311.pyc,, -PIL/__pycache__/JpegPresets.cpython-311.pyc,, -PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc,, -PIL/__pycache__/MicImagePlugin.cpython-311.pyc,, -PIL/__pycache__/MpegImagePlugin.cpython-311.pyc,, -PIL/__pycache__/MpoImagePlugin.cpython-311.pyc,, -PIL/__pycache__/MspImagePlugin.cpython-311.pyc,, -PIL/__pycache__/PSDraw.cpython-311.pyc,, -PIL/__pycache__/PaletteFile.cpython-311.pyc,, -PIL/__pycache__/PalmImagePlugin.cpython-311.pyc,, -PIL/__pycache__/PcdImagePlugin.cpython-311.pyc,, -PIL/__pycache__/PcfFontFile.cpython-311.pyc,, -PIL/__pycache__/PcxImagePlugin.cpython-311.pyc,, -PIL/__pycache__/PdfImagePlugin.cpython-311.pyc,, -PIL/__pycache__/PdfParser.cpython-311.pyc,, -PIL/__pycache__/PixarImagePlugin.cpython-311.pyc,, -PIL/__pycache__/PngImagePlugin.cpython-311.pyc,, -PIL/__pycache__/PpmImagePlugin.cpython-311.pyc,, -PIL/__pycache__/PsdImagePlugin.cpython-311.pyc,, -PIL/__pycache__/PyAccess.cpython-311.pyc,, -PIL/__pycache__/QoiImagePlugin.cpython-311.pyc,, -PIL/__pycache__/SgiImagePlugin.cpython-311.pyc,, -PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc,, -PIL/__pycache__/SunImagePlugin.cpython-311.pyc,, -PIL/__pycache__/TarIO.cpython-311.pyc,, -PIL/__pycache__/TgaImagePlugin.cpython-311.pyc,, -PIL/__pycache__/TiffImagePlugin.cpython-311.pyc,, -PIL/__pycache__/TiffTags.cpython-311.pyc,, -PIL/__pycache__/WalImageFile.cpython-311.pyc,, -PIL/__pycache__/WebPImagePlugin.cpython-311.pyc,, -PIL/__pycache__/WmfImagePlugin.cpython-311.pyc,, -PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc,, -PIL/__pycache__/XbmImagePlugin.cpython-311.pyc,, -PIL/__pycache__/XpmImagePlugin.cpython-311.pyc,, -PIL/__pycache__/__init__.cpython-311.pyc,, -PIL/__pycache__/__main__.cpython-311.pyc,, -PIL/__pycache__/_binary.cpython-311.pyc,, -PIL/__pycache__/_deprecate.cpython-311.pyc,, -PIL/__pycache__/_tkinter_finder.cpython-311.pyc,, -PIL/__pycache__/_typing.cpython-311.pyc,, -PIL/__pycache__/_util.cpython-311.pyc,, -PIL/__pycache__/_version.cpython-311.pyc,, -PIL/__pycache__/features.cpython-311.pyc,, -PIL/__pycache__/report.cpython-311.pyc,, -PIL/_binary.py,sha256=pcM6AL04GxgmGeLfcH1V1BZHENwIrQH0uxhJ7r0HIL0,2550 -PIL/_deprecate.py,sha256=Kt1jv0PTNdqqZksTO2g6XIXgnglkUv3ILRQ8nlP1IKc,2000 -PIL/_imaging.cpython-311-x86_64-linux-gnu.so,sha256=M22L69AVukL-uY4_U2l6mFrV_6MdBTtHl6gShiD3Q3Y,1825936 -PIL/_imaging.pyi,sha256=3fBxcSppJr6EOEcUojvflG3Eegg7lv2Qp0dNQQILrP4,63 -PIL/_imagingcms.cpython-311-x86_64-linux-gnu.so,sha256=qxLv7W6rNPZOnVRYqGbw4JK21OLKlvU7uTjvJFQ3wd0,108688 -PIL/_imagingcms.pyi,sha256=q8U2xR9Fb_k6YxS3SwqjqaG3fi21gv2JSzt_8HB8cdA,4433 -PIL/_imagingft.cpython-311-x86_64-linux-gnu.so,sha256=ozzF0dTGNlcaPh25lTTwnbUtcM7aw98wIIV9_1Gx94U,111816 -PIL/_imagingft.pyi,sha256=3fBxcSppJr6EOEcUojvflG3Eegg7lv2Qp0dNQQILrP4,63 -PIL/_imagingmath.cpython-311-x86_64-linux-gnu.so,sha256=u4s1TTh2H82iScwG1rzPJ6VwV5Usm_iuvei_9tZ5OKM,68720 -PIL/_imagingmath.pyi,sha256=3fBxcSppJr6EOEcUojvflG3Eegg7lv2Qp0dNQQILrP4,63 -PIL/_imagingmorph.cpython-311-x86_64-linux-gnu.so,sha256=GMB3nHtsE0HESOHawjOEGBlV2RUx0-lFDJiyELAjpd8,34832 -PIL/_imagingmorph.pyi,sha256=3fBxcSppJr6EOEcUojvflG3Eegg7lv2Qp0dNQQILrP4,63 -PIL/_imagingtk.cpython-311-x86_64-linux-gnu.so,sha256=B1kwDHgUtvd6mJ6xBanBO1GWmQltx53IdBTymsecJ0w,40720 -PIL/_tkinter_finder.py,sha256=CECvYrzWNc7BuzzR_mWZZKjPdADg6iRG8ilJToyjD3w,540 -PIL/_typing.py,sha256=lpzFKvLMkPVVgMVDLJT7ktL6zS7lmg1z6SGJrVFGmiU,776 -PIL/_util.py,sha256=v7VPRZplBw3JU4o1ilkG5Fh2sSNF1kdRdjf1vhrxwKU,813 -PIL/_version.py,sha256=ceaRTTl5R1PwMRG_4Iq_acRJWkQkvrKcBBwPkSHFlZk,87 -PIL/_webp.cpython-311-x86_64-linux-gnu.so,sha256=UICYULu-WINRRPoQ8g63EEfmWaEjgdUa5BryLS8Fu0A,87336 -PIL/_webp.pyi,sha256=3fBxcSppJr6EOEcUojvflG3Eegg7lv2Qp0dNQQILrP4,63 -PIL/features.py,sha256=MTm2vHEideRRY6tuC4EyazLoIav6oEEYn7m34LzlL-w,10160 -PIL/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -PIL/report.py,sha256=4JY6-IU7sH1RKuRbOvy1fUt0dAoi79FX4tYJN3p1DT0,100 -pillow-10.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pillow-10.3.0.dist-info/LICENSE,sha256=zyNMJ6PydfWgUPTfOUb4hVcEIm_k58qLM5KMvOy87Tc,1455 -pillow-10.3.0.dist-info/METADATA,sha256=z7qVhayuwYWsXDOkgzLqH00a3HXS1lQGZ8GenAOvBjo,9199 -pillow-10.3.0.dist-info/RECORD,, -pillow-10.3.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pillow-10.3.0.dist-info/WHEEL,sha256=fIsFnrmiYoqUaoo3-7_V2WbzMX1uS5gUjuUAPxBpV7o,105 -pillow-10.3.0.dist-info/top_level.txt,sha256=riZqrk-hyZqh5f1Z0Zwii3dKfxEsByhu9cU9IODF-NY,4 -pillow-10.3.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 diff --git a/.flatpak-builder/cache/objects/4e/d2d971da6274c3326a06da5ee3380e5b005b9c29d0ef5f488a2af1e778bbde.file b/.flatpak-builder/cache/objects/4e/d2d971da6274c3326a06da5ee3380e5b005b9c29d0ef5f488a2af1e778bbde.file deleted file mode 100644 index c4ca77e58b0e349232e5c2b3be341c29557bb733..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3860 zcmbVP|8En?6`x)2+G~4>Nt`c)gxnrP2$MK23Ez?fPURAG$%Wjte39xq}oT@ZMaS^WJ=#hj%~==0oWa@Nx>T3Hfk3oR6d<3}O)u%tx!cD8XkS{RKRJ zQ9|8S5~W4V&+n^tfo`dzV>Nm|4(HgtRX9@L+Z#`}Hb|howhzgumynJtaV2t(OSdcS zN(;O@!bs^*I+eD2e7aL%ub@QNYbq$gxKUZx4NJCELpNujAG)|;VRQ1!*Ytb|*6qq% z{l!-knM;!s)8m=zKb^idk-2*9tLX_>{5k$*5u4T}6>G{OU$k<`v#+UT+#tbLk?3x~ zv`Ch2Q!Ugyz`?vBKs-iP?Ftc^uhCY;h;-3BmFE?OX}t8t-Ue6YtA9U(&WqXr9GYF6 ziAYesED{Ol=VU@;(^U1F+CtJ)^92n{1Q#?pi}P5wq?|#dyqd?BVQA)1_LgCoI5TGy zbwwr%L!O}5`$2qycZE4sm(8rIx}jV6SDKnza9P82Lq#I%ijjAN3eFk|{tJ3T)p>g= zB^L@QO`S^>7OY!_J~DLTM9NexoGi%M+wx6priw&^`H@sk)o{Tut)aq#8*9>mbbzo< zc+3Pe%jiD>65E|<&-%ruQyb)uGf!vA(E%qquoWHNj1HHhC!Od?n>$J3!0iTe)NZCL z*4g*U+e6ku0WM@{(!xZZ)9}~zM!u1)83`m%GaaGE{5ud|Ag0NnC1kNMQ7Q8^`Wa9! zYCY0XLK`(BSGnoC(RfRY&X&*;Q)0%^jlm_h-gQc>CG4$ilFyge>*z6j|Es-Lc#mto z=42)I_o%{=R2a`me(TxRy8;VK#vM!~|FVW6-prL^pfEnso~g&85^BU8aKwKv1xoDu-B$tGe}a&*9(X@CDO{tp#vX<DU=|#5T^pf5%c_ zgP#1I(s-suNen6l=BfX9Wr?#|t2FG&S+!sTpJU@^8?z|(R7$DoEbqvn{#GeXa*q6n zb2jb9Aid*5R%q4?&if&I@y$20y8A(1-?qUYYg;8mePf+n0&v=>vvc*1n!&Hc=V-_l zok;SHo6=`lk8p{>+?AYuNVB=67%vEu+qIwl7_LQH@Ns!t|W&vkaP+b|M_o2hB z`B7P_u8{7knkLO*=_b|zFfCBVyS~~jyrWkoCO5@nP>7yxW|2)M7ukK0#gGPhm7Y9d zQh0(smrO$2_a2LUQd8!9LL@Ys@q)Vt$S!}E09Ly}>{;CndR^kS5UeWz;kU31FVp3y zX~{uY>jqTaA`wanH?ehxUUwqs1qE`Lj&gH`vOpvt$#L2jvxaU#&Xa)2$ ztqJuVLPLyqR4*xcE1b(4N>RfX$XS@6>85!Q+T8%dFx%*`-B@=}Y}xy5qkYTXZySY| zy->2Oou2iR`bMjg9Bw7+w;w9R!>?wPd_`#{Q$ryTAlpglkQeIT%( kT^4smjyVMxQbW@cXCP~8Y=+SA>D|Cl2J)>RYP`GqA9ksJ%m4rY diff --git a/.flatpak-builder/cache/objects/4f/4d4aff1b114119ae5470a4fbed94dfb3226823d44d90b7827bece5332d5878.dirtree b/.flatpak-builder/cache/objects/4f/4d4aff1b114119ae5470a4fbed94dfb3226823d44d90b7827bece5332d5878.dirtree deleted file mode 100644 index 5989051cf59ccc3e5ce4ba56c4bbe54fc2a44020..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmXpsvZydLvS6r=s9xs6nqSuvo~ObYwfE-Bh<;c9J6&4$&s3b1u)Y@SlEwE?y5?Z| z=WWbSTaUkcx2^Qo5}~Vaioa=gyyngc>CoT+ngTM(!HD5$^Z6Uo;^PHH7EhkV?=`_8 z!aQ}wp;Jd+URHKWpi(Ja${ux`;?W}jbv+FV!;C<=o4Kuh~zW=W*SjC5!(~1 z5N*xJ5i((HaA9L%0A3$tad#|7OVrGMFpkpc*y69gN*cH<5w{IX2QsWw*hFd$@f&=> gXY;lL<%P%Y?zVOMq!QKabM`5S>kDjDh$jb0Gpj{8Z~y=R diff --git a/.flatpak-builder/cache/objects/50/6e3f3dab643f6638c0ebd1d908e6ea221edb509ea88fa8af0b5ac94a993348.file b/.flatpak-builder/cache/objects/50/6e3f3dab643f6638c0ebd1d908e6ea221edb509ea88fa8af0b5ac94a993348.file deleted file mode 100644 index 585332c0bd41477676717accc0a5c7f9e62ca8f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99761 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π@dK^Kq%AZR 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%0AH3miPrBO| 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 BwM_s3 diff --git a/.flatpak-builder/cache/objects/50/8ae84f8132b379a2087b12dc876641d6bb6c5d31deb026aa121bb19ec27a3d.file b/.flatpak-builder/cache/objects/50/8ae84f8132b379a2087b12dc876641d6bb6c5d31deb026aa121bb19ec27a3d.file deleted file mode 100644 index 4ba2fcb7198cba1145887e519f664f34f3f7dd44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5314 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 a&UCHymY+*L?0D2sI`vw066WD%mi#wCi%+%y diff --git a/.flatpak-builder/cache/objects/50/92219e26a60aecba306b2fc17be74761fa71b5af2ca951188021bf7689d093.file b/.flatpak-builder/cache/objects/50/92219e26a60aecba306b2fc17be74761fa71b5af2ca951188021bf7689d093.file deleted file mode 100755 index 5c7b8717b273e3be436a7679d493fab35a1052e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606312 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