From 764c917014344f5abd7743e13ce270a4994ea25d Mon Sep 17 00:00:00 2001 From: DonislawDev Date: Fri, 28 Aug 2026 21:50:18 +0200 Subject: [PATCH 1/2] release: the changelog closes for 0.2.0 and everything that says a version agrees The owner raised the version on 2026-08-28 and asked for the changelog to be put in order first, because the unreleased section had grown its four kinds in the order they happened to be written: Breaking, Fixed, Added, Changed. Breaking, Added, Changed, Fixed now, and closed into a dated 0.2.0 section with nothing left under Unreleased. That is not tidying: the release workflow refuses to build when a version has no section, and refuses again when anything is left under Unreleased, because those are changes that would go out undescribed. A minor bump rather than a major one, and here that is a claim about other people's CI. What changed under Breaking is which names and sizes this tool agrees to produce - a name Windows cannot store, two names a Mac keeps as one file, a bare nul - not what it writes once it agrees. The machine answer is internal/guard/testdata/generator-golden.json, which git says is byte for byte the file v0.1.0 shipped with. A version lives in five places and four of them are copies, so all four moved together. internal/version is the one the owner sets. The two Windows resource scripts carry it because a .rc cannot ask a Go constant, and their compiled .syso files are committed because the toolchain links any it finds and runs no generator - so both were rebuilt with windres, and the guard that reads the version back out of the compiled resource is what would have caught it if only the scripts had been edited. The site renders it from internal/version, so web/public was regenerated: the diff is 29 lines and not one of them is anything other than a version number. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 419 +++++++++--------- cmd/tfg-gui/rsrc_windows_amd64.syso | Bin 59772 -> 59772 bytes cmd/tfg/rsrc_windows_amd64.syso | Bin 59804 -> 59804 bytes cmd/tfg/tfg.rc | 8 +- internal/gui/icon/chickpea.rc | 8 +- internal/version/version.go | 17 +- web/public/404.html | 2 +- web/public/create-file-exact-size/index.html | 4 +- web/public/docs/index.html | 4 +- web/public/faq/index.html | 4 +- web/public/formats/index.html | 2 +- web/public/index.html | 10 +- web/public/pl/dokumentacja/index.html | 4 +- web/public/pl/faq/index.html | 4 +- web/public/pl/formaty/index.html | 2 +- web/public/pl/index.html | 10 +- .../pl/plik-o-zadanym-rozmiarze/index.html | 4 +- web/public/pl/zastosowania/index.html | 4 +- web/public/use-cases/index.html | 4 +- 19 files changed, 259 insertions(+), 251 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1febd8c..69d387e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ because it turns other people's test suites red. ## [Unreleased] +## [0.2.0] - 2026-08-28 + ### Breaking - A file name holding `<`, `>`, `"`, `|`, `?`, `*` or a control character is now @@ -59,213 +61,6 @@ because it turns other people's test suites red. expect to be reserved - they were each tried on Windows 11 and on Windows Server 2025, and every one of them is an ordinary file there now. -### Fixed - -- On macOS the program now has an icon. It is a `.app` bundle since the release - before this one, and a bundle with no icon in it is drawn by the Finder and - the Dock as a blank sheet of paper - which is what a program the system knows - nothing about looks like. The icon is the same drawing the other two systems - use, on the rounded square macOS puts every icon on, at every size from 16 px - to 1024. - -- In the window, a menu is now the same width wherever it appears, and always - wide enough for the words in it. The menu for choosing a format was 140 px - wide on the single batch screen and 98 px on the presets screen and in a row - of an archive's contents, for the same twenty formats. In that narrow box the - toolkit's own "(Select one)" was cut off mid word, so a row of an archive's - contents offered "(Select ..." until a format was picked. No menu is drawn - narrower than the boxes standing beside it any more. - -- In the window, the Remove button ending a row of an archive's contents is the - size of a button. It was taking a quarter of the form's width and the height - of a label and a control together, which drew it as a panel with a word in - the middle rather than as something to press. - -- The notices that travel with a release now name the fonts and drawings the - window binary carries. Seven font files and ninety-seven images are compiled - into `tfg-gui` from inside the graphics toolkit, under the SIL Open Font - License, the Bitstream Vera licence and MIT, and `THIRD-PARTY-NOTICES.md` - named none of them. It described modules, and a font is a file inside a - module rather than a module of its own, so nothing that asked about modules - could see them. Those licences ask for their notices to travel with the - bytes, so the full texts are in that file now. - - `tfg`, the command line binary, embeds none of this and never did. The file - says so as well, rather than leaving it to be assumed. - - The same file also stated that `golang.org/x/text` was version 0.40.0 while - every binary linked 0.41.0. Both numbers are now compared with the build. - -- `verify` and `cleanup` no longer contradict each other about a file stored - under a different case. On Windows and on a Mac, `REPORT.TXT` and `report.txt` - are one file, and `verify` used to call such a file `extra` - the word it uses - for somebody else's file - while `cleanup`, given the same directory and the - same manifest, deleted it and reported a clean sweep. - - `verify` now says `respelled` and names what the manifest calls the file, so - the report says what happened instead of sending you looking for a stranger's - file. `cleanup` refuses to remove it and ends with the partial exit code, - because it removes the names the manifest lists and that name is not one of - them. Rename the file back, or verify against a manifest written for the names - you have. - - Nothing changes where the filesystem keeps the two spellings apart, as Linux - does: there they are two files, and both commands always agreed. - -- The window no longer slows down as a recipe grows. Every keystroke on the - batches screen re-reads the whole recipe, and the cost of doing that used to - rise with the square of its size: a hundred batches took a quarter of a - second per key, which reads as the window stalling while you type. It now - takes about a sixtieth of that, and the cost rises in step with the recipe - rather than ahead of it. Files, hashes and every message are unchanged. - -- A run whose manifest could not be written no longer leaves an empty - `manifest.json` beside the files it wrote. - - The name is taken before the first file, as an empty file, so that two runs - into one directory cannot both claim it. When the manifest then failed to be - written - a full disk, a permission, something already sitting under the - temporary name - that empty claim stayed. `tfg cleanup` and `tfg verify` both - refused it with "unexpected end of JSON input", so the files it should have - described could not be removed by the one thing allowed to remove them. Worse, - the next run into that directory was refused with a sentence saying the file - "is the only record of what an earlier run wrote" - true every other time it - is printed, and here about a file that recorded nothing. - - The claim is now given back when the write fails, so the next run is refused - about a file that really is in the way, and names it. A manifest with anything - in it is never removed. - -- A run that could not save its manifest now says what that leaves behind. The - message about the manifest was about the manifest, and the problem is the - files: they are on the disk, nothing records them, and cleanup works from a - manifest. That is now said in the run rather than discovered later. - -- Working out what a run would cost no longer freezes the window, and can now be - stopped. Pressing Preview or Generate used to work the whole plan out on the - thread that draws, on the reasoning that planning is fast. It is fast for text: - measured across formats at two thousand files, a text run plans in about 0.4 s - and a PNG run in 16 to 23 s, because a picture is encoded while it is planned. - Ten thousand pictures was a minute and a half of a window that did not redraw, - with both buttons still looking pressable. It now happens off that thread, with - Cancel offered while it goes. - -- Closing the window during a preview no longer waits for the whole preview. The - check that a preview runs asks the filesystem about every planned file, twice - each, and could not be interrupted - so on a large set or a directory on a - network share, closing the window sat there until it finished. - -- An archive or an Office file asked for four gigabytes or more is now refused - while it is planned. Above that line a ZIP needs extra records to describe - itself, and the arithmetic this tool uses to work out an archive's size before - writing it cannot account for them - so the file came out 112 bytes longer than - planned, which the tool then caught and reported as a fault in itself, after - writing four gigabytes and removing them. TAR.GZ is unaffected and keeps - working at those sizes. - -- `tfg cleanup --json` now reports counts that add up. A run of four files with - one already deleted reported three removed, none kept, and four files - because - the kept count only counted files that were still there and blocked, while the - list called every file it did not remove "kept". Adding the two numbers lost an - entry with no way to tell which. - -- A WAV asked for more than about four gigabytes is now refused instead of being - written with a length field that does not match the file. A RIFF file states - its own length in a four byte field, and nothing checked it, so a request for - eight gigabytes produced a file of exactly that size whose header announced - four - and every part of this tool agreed the file was fine. The size was - right, so the run succeeded, the hash went into the manifest, and `tfg verify` - called it a match. A file that is broken and certified as sound is worse than - one that fails loudly, which is why this is a refusal. - - The ceiling is 4294967303 B rather than four gigabytes exactly, and the - difference is deliberate: the length field counts everything after itself, so - a file eight bytes over four gigabytes still describes itself correctly. - -- A refusal about a size that is too large now says so. BMP, ICO and PNG already - refused sizes they cannot describe, but all three said "cannot be smaller than - N B" about a request that was larger - a sentence that contradicts itself and - offers, as the way out, the very ceiling the request had just passed. - -- An archive asked through `contains` to hold more files than the format allows - is now refused, with the same sentence and the same exit code as asking for - the same number through the `entries` setting. The two ways of saying it - disagreed: `entries: 50000` was refused as being outside 0 to 10000, while a - `contains` list asking for fifty thousand files validated cleanly, passed - `--dry-run`, and then built a plan for every one of them. - -- A run whose plan would not fit in memory is now refused while the plan is - being built, rather than ending as an out of memory kill with no message. - There was a ceiling on the number of files, but how much a file costs to plan - depends on its format - a PDF of a thousand pages costs about six thousand - times what a text file costs - so `--format pdf --set pages=1000 --count - 10000` passed every check and then asked for around fifty gigabytes before - writing a byte. The ceiling is now on the memory, which is the thing that runs - out. - -- The `size-boundaries` preset now answers a limit with no room above it the way - `--boundary` already did. A limit at the largest number there is used to be - refused with a sentence about a file that "cannot be smaller than nothing", - and advice to raise the limit - an answer about the bottom of the range to a - question about the top. - -- On the batch screen, a refusal about one batch now marks that batch's box. A - batch asking for a size its format cannot deliver, or a name your system will - not store, used to stop the run and mark nothing at all - with twenty batches - on screen there was nothing to say which one to change. Those are the two - refusals you meet most. -- A bad name for the manifest marks the manifest box rather than nothing. It - was reported as though it were the name of a file. -- `tfg validate` now checks the name of the manifest, so it stops calling a - recipe valid that `tfg generate` refuses a second later. If you run validate - in a pre-commit hook, that is one fewer way for a broken recipe to get past - it. -- A run whose files would take the name of its own manifest is now refused - before anything is written. It used to write every file, put one of them where - the manifest was going, and then stop with "file already exists" - leaving the - files on disk with no manifest, which means `tfg cleanup` could never remove - them again. It happened whenever a target produced a file named exactly what - the manifest is called, including the `manifest.json` a run uses when the - recipe does not name one. `tfg validate` and `--dry-run` both called such a - recipe fine, so there was no way to find out before the files were on disk. - All three now give the same refusal, and it says which target to change. -- `tfg verify` no longer calls a file extra because the manifest spells its path - the long way round. A manifest listing `./report.txt` for a file called - `report.txt` used to report `extra report.txt` - one difference rather than - the pair a real mismatch shows, so it read as a directory somebody had put a - file into rather than as two spellings of one name. Both spellings were - already accepted everywhere else in the tool. Nothing about which files are - looked at changed, only which spellings count as the same name. -- The manifest and `tfg recipe fmt -w` now flush their work to the disk before - putting it in place. Both are written beside the target and renamed over it, - and a rename can reach the disk before the bytes do - so a power cut at the - wrong moment could leave an empty file under the name of your manifest, or of - the recipe you had just formatted. Generated files are still not flushed, on - purpose: that is ten thousand of them against one of these. -- A machine readable report that could not be written whole no longer ends with - a zero exit code. `tfg verify --json | head` on a large report used to hand - you half a document and say the run was fine, so a script parsing it failed on - the syntax and blamed itself. A run that had already failed keeps the code it - failed with - a broken pipe is not why your recipe was wrong. -- A recipe is now refused for being too large however that size is discovered. - The check used to ask the directory entry before reading, which is a look - rather than a limit: a file can grow between the look and the read, and - `tfg recipe fmt` would then have formatted the first megabyte of a longer file - and reported success. The message and the exit code are unchanged, including - the size it reports. The same applies to reading a manifest. -- Files whose format writes them in many small pieces are written much faster. - The worst shape the settings allow - a BMP one pixel wide and twenty thousand - tall - went from 3.660 s to 0.138 s for sixty files. An ordinary 1 MB BMP is - about a third faster, plain text and PNG a little. The bytes are identical, so - nothing that checks a hash sees a change. -- `Ctrl+C` during `tfg verify` now stops while it is still listing the - directory. On a tree with hundreds of thousands of files it used to finish the - listing first, which on a slow disk is a long time to keep pressing it. -- The refusal for a boundary limit below 1 B now reads the same from the command - line and from a recipe. Both took it from their own sentence, and the two had - already drifted apart by a comma. The wording is the four part shape the rest - of the tool uses: what is wrong, why, and what to do instead. - ### Added - **Windows binaries are signed.** The signature sits on the program inside the @@ -551,9 +346,217 @@ because it turns other people's test suites red. the one you are sure to see, and "7 files written." is more use there than a note explaining a default. +### Fixed + +- On macOS the program now has an icon. It is a `.app` bundle since the release + before this one, and a bundle with no icon in it is drawn by the Finder and + the Dock as a blank sheet of paper - which is what a program the system knows + nothing about looks like. The icon is the same drawing the other two systems + use, on the rounded square macOS puts every icon on, at every size from 16 px + to 1024. + +- In the window, a menu is now the same width wherever it appears, and always + wide enough for the words in it. The menu for choosing a format was 140 px + wide on the single batch screen and 98 px on the presets screen and in a row + of an archive's contents, for the same twenty formats. In that narrow box the + toolkit's own "(Select one)" was cut off mid word, so a row of an archive's + contents offered "(Select ..." until a format was picked. No menu is drawn + narrower than the boxes standing beside it any more. + +- In the window, the Remove button ending a row of an archive's contents is the + size of a button. It was taking a quarter of the form's width and the height + of a label and a control together, which drew it as a panel with a word in + the middle rather than as something to press. + +- The notices that travel with a release now name the fonts and drawings the + window binary carries. Seven font files and ninety-seven images are compiled + into `tfg-gui` from inside the graphics toolkit, under the SIL Open Font + License, the Bitstream Vera licence and MIT, and `THIRD-PARTY-NOTICES.md` + named none of them. It described modules, and a font is a file inside a + module rather than a module of its own, so nothing that asked about modules + could see them. Those licences ask for their notices to travel with the + bytes, so the full texts are in that file now. + + `tfg`, the command line binary, embeds none of this and never did. The file + says so as well, rather than leaving it to be assumed. + + The same file also stated that `golang.org/x/text` was version 0.40.0 while + every binary linked 0.41.0. Both numbers are now compared with the build. + +- `verify` and `cleanup` no longer contradict each other about a file stored + under a different case. On Windows and on a Mac, `REPORT.TXT` and `report.txt` + are one file, and `verify` used to call such a file `extra` - the word it uses + for somebody else's file - while `cleanup`, given the same directory and the + same manifest, deleted it and reported a clean sweep. + + `verify` now says `respelled` and names what the manifest calls the file, so + the report says what happened instead of sending you looking for a stranger's + file. `cleanup` refuses to remove it and ends with the partial exit code, + because it removes the names the manifest lists and that name is not one of + them. Rename the file back, or verify against a manifest written for the names + you have. + + Nothing changes where the filesystem keeps the two spellings apart, as Linux + does: there they are two files, and both commands always agreed. + +- The window no longer slows down as a recipe grows. Every keystroke on the + batches screen re-reads the whole recipe, and the cost of doing that used to + rise with the square of its size: a hundred batches took a quarter of a + second per key, which reads as the window stalling while you type. It now + takes about a sixtieth of that, and the cost rises in step with the recipe + rather than ahead of it. Files, hashes and every message are unchanged. + +- A run whose manifest could not be written no longer leaves an empty + `manifest.json` beside the files it wrote. + + The name is taken before the first file, as an empty file, so that two runs + into one directory cannot both claim it. When the manifest then failed to be + written - a full disk, a permission, something already sitting under the + temporary name - that empty claim stayed. `tfg cleanup` and `tfg verify` both + refused it with "unexpected end of JSON input", so the files it should have + described could not be removed by the one thing allowed to remove them. Worse, + the next run into that directory was refused with a sentence saying the file + "is the only record of what an earlier run wrote" - true every other time it + is printed, and here about a file that recorded nothing. + + The claim is now given back when the write fails, so the next run is refused + about a file that really is in the way, and names it. A manifest with anything + in it is never removed. + +- A run that could not save its manifest now says what that leaves behind. The + message about the manifest was about the manifest, and the problem is the + files: they are on the disk, nothing records them, and cleanup works from a + manifest. That is now said in the run rather than discovered later. + +- Working out what a run would cost no longer freezes the window, and can now be + stopped. Pressing Preview or Generate used to work the whole plan out on the + thread that draws, on the reasoning that planning is fast. It is fast for text: + measured across formats at two thousand files, a text run plans in about 0.4 s + and a PNG run in 16 to 23 s, because a picture is encoded while it is planned. + Ten thousand pictures was a minute and a half of a window that did not redraw, + with both buttons still looking pressable. It now happens off that thread, with + Cancel offered while it goes. + +- Closing the window during a preview no longer waits for the whole preview. The + check that a preview runs asks the filesystem about every planned file, twice + each, and could not be interrupted - so on a large set or a directory on a + network share, closing the window sat there until it finished. + +- An archive or an Office file asked for four gigabytes or more is now refused + while it is planned. Above that line a ZIP needs extra records to describe + itself, and the arithmetic this tool uses to work out an archive's size before + writing it cannot account for them - so the file came out 112 bytes longer than + planned, which the tool then caught and reported as a fault in itself, after + writing four gigabytes and removing them. TAR.GZ is unaffected and keeps + working at those sizes. + +- `tfg cleanup --json` now reports counts that add up. A run of four files with + one already deleted reported three removed, none kept, and four files - because + the kept count only counted files that were still there and blocked, while the + list called every file it did not remove "kept". Adding the two numbers lost an + entry with no way to tell which. + +- A WAV asked for more than about four gigabytes is now refused instead of being + written with a length field that does not match the file. A RIFF file states + its own length in a four byte field, and nothing checked it, so a request for + eight gigabytes produced a file of exactly that size whose header announced + four - and every part of this tool agreed the file was fine. The size was + right, so the run succeeded, the hash went into the manifest, and `tfg verify` + called it a match. A file that is broken and certified as sound is worse than + one that fails loudly, which is why this is a refusal. + + The ceiling is 4294967303 B rather than four gigabytes exactly, and the + difference is deliberate: the length field counts everything after itself, so + a file eight bytes over four gigabytes still describes itself correctly. + +- A refusal about a size that is too large now says so. BMP, ICO and PNG already + refused sizes they cannot describe, but all three said "cannot be smaller than + N B" about a request that was larger - a sentence that contradicts itself and + offers, as the way out, the very ceiling the request had just passed. + +- An archive asked through `contains` to hold more files than the format allows + is now refused, with the same sentence and the same exit code as asking for + the same number through the `entries` setting. The two ways of saying it + disagreed: `entries: 50000` was refused as being outside 0 to 10000, while a + `contains` list asking for fifty thousand files validated cleanly, passed + `--dry-run`, and then built a plan for every one of them. + +- A run whose plan would not fit in memory is now refused while the plan is + being built, rather than ending as an out of memory kill with no message. + There was a ceiling on the number of files, but how much a file costs to plan + depends on its format - a PDF of a thousand pages costs about six thousand + times what a text file costs - so `--format pdf --set pages=1000 --count + 10000` passed every check and then asked for around fifty gigabytes before + writing a byte. The ceiling is now on the memory, which is the thing that runs + out. + +- The `size-boundaries` preset now answers a limit with no room above it the way + `--boundary` already did. A limit at the largest number there is used to be + refused with a sentence about a file that "cannot be smaller than nothing", + and advice to raise the limit - an answer about the bottom of the range to a + question about the top. + +- On the batch screen, a refusal about one batch now marks that batch's box. A + batch asking for a size its format cannot deliver, or a name your system will + not store, used to stop the run and mark nothing at all - with twenty batches + on screen there was nothing to say which one to change. Those are the two + refusals you meet most. +- A bad name for the manifest marks the manifest box rather than nothing. It + was reported as though it were the name of a file. +- `tfg validate` now checks the name of the manifest, so it stops calling a + recipe valid that `tfg generate` refuses a second later. If you run validate + in a pre-commit hook, that is one fewer way for a broken recipe to get past + it. +- A run whose files would take the name of its own manifest is now refused + before anything is written. It used to write every file, put one of them where + the manifest was going, and then stop with "file already exists" - leaving the + files on disk with no manifest, which means `tfg cleanup` could never remove + them again. It happened whenever a target produced a file named exactly what + the manifest is called, including the `manifest.json` a run uses when the + recipe does not name one. `tfg validate` and `--dry-run` both called such a + recipe fine, so there was no way to find out before the files were on disk. + All three now give the same refusal, and it says which target to change. +- `tfg verify` no longer calls a file extra because the manifest spells its path + the long way round. A manifest listing `./report.txt` for a file called + `report.txt` used to report `extra report.txt` - one difference rather than + the pair a real mismatch shows, so it read as a directory somebody had put a + file into rather than as two spellings of one name. Both spellings were + already accepted everywhere else in the tool. Nothing about which files are + looked at changed, only which spellings count as the same name. +- The manifest and `tfg recipe fmt -w` now flush their work to the disk before + putting it in place. Both are written beside the target and renamed over it, + and a rename can reach the disk before the bytes do - so a power cut at the + wrong moment could leave an empty file under the name of your manifest, or of + the recipe you had just formatted. Generated files are still not flushed, on + purpose: that is ten thousand of them against one of these. +- A machine readable report that could not be written whole no longer ends with + a zero exit code. `tfg verify --json | head` on a large report used to hand + you half a document and say the run was fine, so a script parsing it failed on + the syntax and blamed itself. A run that had already failed keeps the code it + failed with - a broken pipe is not why your recipe was wrong. +- A recipe is now refused for being too large however that size is discovered. + The check used to ask the directory entry before reading, which is a look + rather than a limit: a file can grow between the look and the read, and + `tfg recipe fmt` would then have formatted the first megabyte of a longer file + and reported success. The message and the exit code are unchanged, including + the size it reports. The same applies to reading a manifest. +- Files whose format writes them in many small pieces are written much faster. + The worst shape the settings allow - a BMP one pixel wide and twenty thousand + tall - went from 3.660 s to 0.138 s for sixty files. An ordinary 1 MB BMP is + about a third faster, plain text and PNG a little. The bytes are identical, so + nothing that checks a hash sees a change. +- `Ctrl+C` during `tfg verify` now stops while it is still listing the + directory. On a tree with hundreds of thousands of files it used to finish the + listing first, which on a slow disk is a long time to keep pressing it. +- The refusal for a boundary limit below 1 B now reads the same from the command + line and from a recipe. Both took it from their own sentence, and the two had + already drifted apart by a comma. The wording is the four part shape the rest + of the tool uses: what is wrong, why, and what to do instead. + ## [0.1.0] - 2026-08-20 Initial release. -[Unreleased]: https://github.com/donislawdev/TestingFilesGenerator/compare/v0.1.0...HEAD +[Unreleased]: https://github.com/donislawdev/TestingFilesGenerator/compare/v0.2.0...HEAD +[0.2.0]: https://github.com/donislawdev/TestingFilesGenerator/compare/v0.1.0...v0.2.0 [0.1.0]: https://github.com/donislawdev/TestingFilesGenerator/releases/tag/v0.1.0 diff --git a/cmd/tfg-gui/rsrc_windows_amd64.syso b/cmd/tfg-gui/rsrc_windows_amd64.syso index 8ec381b204e34c4ec6302f6b2911ffe6584f6d59..442b0cbd5516ec31c3e9b318e21e09b3f06282a6 100644 GIT binary patch delta 37 ocmex!iTTeZ<_$8>IGGqAfN8VpGigRfqs@-btAW(yy)X6y0P`pe@Bjb+ delta 37 ocmex!iTTeZ<_$8>I2jorfN`_xGigRf!_AJ*tAW(yy)X6y0P^V!>;M1& diff --git a/cmd/tfg/rsrc_windows_amd64.syso b/cmd/tfg/rsrc_windows_amd64.syso index 5c2ade38d0714d57ab32e4b42474b101f7971016..ead00d8f1f26b3e9cf482a1e3cd486a6fe37e0cb 100644 GIT binary patch delta 37 ocmbPpnR(7-<_$8>IGGqAfN8VpGjB#lqs@iSvw_s)yD#I2jorfN`_xGjB#l!_9@yvw_s)yD#That page is not here

The address you followed does not