This week’s update is a bit later than planned as I had a few other things going on and then got carried away in trying to finishing off the replacement library playlists support and getting it as bug free as possible (which is much easier said than done). So let’s get on with this update…
Making the library playlists support better is one of the things that I’ve wanted personally for some time and so is something that I can now really do as part of my work on the WACUP project. So the main focus this week has been getting my replacement working correctly as well as being equal to or better than the existing native plug-in which has involved a lot of time spent on getting drag and drop handling implemented.
Drag and what and why spend time on it you might be thinking. Well one of the things in ensuring that drag and drop works as well as possible is that it makes it easier to work either between playlists already within the media library or to make it easier to support adding a smart view to a playlist or in accepting files and folders externally of Winamp.
So by making sure (I believe I’ve covered off all viable usage cases) that it works, it should ensure that the replacement works as good as or better than the native plug-in especially as the replacement will try to fill in the blanks on some of the information that playlists make use off (which the native plug-in doesn’t and which causes some inconsistent information).
The next thing with playlists has been do with trying to resolve a few of the complaints that the native plug-in has against what people want / expect.
The first has been adding clickable playlist view columns so it’s now possible to sort ascending / descending by either title or duration.
The second thing is how the columns are sized which has been complained about many times. The native plug-in by design tries to act like the main playlist editor window in having the duration fixed to the right-edge of the playlist window. With the library playlist views this behaviour isn’t always liked and so I’ve emulated the default behaviour but when a column is manually resized then the manually set size will be used. This should provide a good balance between acting like the native plug-in vs following how the rest of the library views work (in using the size they are set to).
The third thing is something that has annoyed me no end over the years and I should have done something about it when I worked natively on Winamp is that it wouldn’t correctly remember the selection when sorting items (via the sorting options). This led to the issue in that the position of the selection stayed the same but what was seen as selected was wrong.
The replacement doesn’t have this issue (as per the screenshot above) and I’m happier with how this replacement works compared to the native plug-in (which would have have the selection like on the left but show the items in the order on the right which is obviously wrong).
There’s a few other layout tweaks I’ve made versus the native plug-in (in addition to the obvious side-view support) which I think makes sense which is an exercise for anyone bored enough to work out from the image above.
Moving onto other things, something that came up on the Winamp Enthusiasts group related to Windows 10 Anniversary Edition and Project Centennial which I don’t know how I’d missed hearing about until now.
This is basically a means to make classic Windows programs (oh for example like Winamp) and re-package them into something which is able to act like a UWP package which then allows for Windows store distribution or just better fitting in with what Windows 10 prefers.
There are some limitations to this in that despite it making a UWP package, it doesn’t mean that it will run on anything other than an x86 based Windows install. I’ve still to try out how well it works as from initial research there are a few things that with how Winamp works means some tweaking might be required (skin and plug-in installs won’t work like before) and there’s also an apparent requirement for the package to be code signed.
Anyway, there’s more that needs to be done to look into whether this makes sense (are the limitations of a fixed package worth it) or even if it’s viable (see below and whether a derivative work could even make it into the store).
Which leads me on to the next thing and the mess that is to try to work out the best and appropriate code signing certificate to purchase. This is something I’ve known I need to look into at some point for the benefit of the installer and also to give a better experience with UAC and elevation).
Unfortunately it’s not clear cut and the prices seem to vary massively from expensive to mind-boggling expensive and you must be kidding levels. So if there’s any suggestions from others who’ve need to deal with this sort of thing on a budget then please let me know. I appreciate that I will need to pay out on this but I’m not going to waste money that I don’t have.
So that’s this update of what’s been going on over the last week which is not the most exciting of updates but not everything with software can be at times :) Here’s a general summary of what was talked about:
- Getting the replacement library playlists support finished off (a lot of stuff!)
- Could Winamp + Project Centennial work, we’re yet to find out
- Code signing certificates are a mess, can you provide some help?
-dro
Finally you made columns working properly… I was asking for this (possibility to set custom column size) years ago :)
Also, sorting and selecting items looks nice. I am not sure if making Windows Store version is a good idea on this stage… make first release it as native win32 application… we are waiting so long :p
Ps: Are you going to buy sign certificate by your own money? Is this one time payment or it need to be renewed at time to time? Maybe community could add some money… have no idea how much it costs.
I wonder what other say…
Looks Great! Thank you for all of the playlist work. Can’t wait to use it.
Pawel: I cannot remember the reasons why for not doing it (especially if I’d said no to doing it) but having found a way that makes it possible to maintain existing behaviour vs allowing for specific setting of the sizes makes sense for what I’m hoping to achieve.
The store thing is such a grey area as there’s nothing to stop providing my code / allowed plug-ins but as everything is based on top of 5.666 then for the store app version to work, it needs those files as it has to be all included. So due to that, it might just end up being something that can be installed manually rather than using the store (but there’s limitations as I’ve tried to detail on the store app version vs the existing win32 way that things work.
If I go with the certificate option, it would have to be out of my pocket (along with whatever validation is required to prove that I am who I say I am). It is generally a yearly payment but depends on who it’s done with as to how many years can be done in advance (which makes it a bit cheaper per year but more as a one off cost) as well as how much it costs. The price range seems to be anywhere from ~£60 up to £500 hence why I was hoping that someone else who’s had similar experience might have been able to provide some advice on what to go with as I’m still not 100% sure on what the best option is assuming I go through with bothering with code signing (which would make for a better experience).
Hi DrO, all right?
This is the first time which I hear about WACUP, I think which it is excelent, thank you. I use Winamp since my first PC, an White, AT, Pentium 133 Mhz, the ram? If I not wrong, 8 after an update incredibles 16 megas and Win 95, an I use Winamp today, almost all days, with a lot of native plugins and VSTs, of many developers, and a lot of DrO plugins. I think which Winamp (with excelent plugins) is almost perfect, only have few things which I dont like, and which I feel much the lack ever, then go some suggestions to WACUP or future DrO plugins:
1: An simple plugin which in the end of playlist, Clean the playlist, Add all songs of library, Randomize the playlist and play the first song. The objetive is an Infinite Randomized Playlist which never stop. I prefer randomized playlist because dont repeat the same song never at the end. Shuffle repeat many times.
2: An context menu item to Randomize an Selection on playlist, useful when you add some musics after and want do an mix.
3: When an song end the winamp scroll playlist to current song, the suggestion 3, is an plugin to stop this behavior. It is because I have the habit of scroll the playlist long distances and using the plugin PlaylistEx I reorganize the playlist.
An suggestion is add Randomize Selection and Show Current Song Manually to excelent plugin PlaylistEx (open source).
4: The Milkdrop with a lot of presets, and some specific VSTs fill my memory and after close don’t clean, only if restart winamp. My suggestion is an plugin to Auto Restart Winamp after an configured time, instance 30 min or 60 min, and only auto restart if winamp is minimized and only if the process memory is above an confugurated level, and reopen winamp directly minimized. So I can keep winamp memory under control ever, automaticaly and almost transparent.
My poors suggestions is it, with my poor english, please think about it only an moment,
DrO, I think which the official seek of Winamp is here, thank you.
Lucas: Thank you for the suggestions. I’ve added most of them to my internal request tracker and will reply bellow for each one.
1) When shuffle is used, if the playlist is changed in some manner (or you restart Winamp) then the internal shuffle table will change (which explains why you see what you do). So if Winamp isn’t closed and no edits are made to the playlist, shuffle won’t repeat anything until all of the files have been played.
For the request itself, I can see this as being something that could be added to the ‘playlist file remover plug-in’ which already does that other than not sourcing the ‘new’ playlist from the library (just what it had previously used from the main playlist).
2) That’s a good suggestion. As the main playlist and also the library playlists already have a randomise option, they can be relatively easily manipulated to work on the current selection or the existing behaviour if there’s no selection at the time.
3) This has been able to be done for a number of years if the JTFE plug-in was installed. On the ‘Extras’ preferences page, check the ‘Prevent Winamp from scrolling the current file into view (The spacebar can be used to force the current entry into view)’ option.
I’m not sure what the ‘PlaylistEx’ plug-in you’re referring to is (unless it’s the alpha plug-in I tried to make ~12 years ago which doesn’t work and shouldn’t be used - but as you mention open source, it’s unlikely to be that plug-in).
4) That is more of an issue with the VST plug-ins you’re using rather than something which a forced / timed restart should be setup to do. Also Milkdrop by it’s nature (more so with large screens) will use a lot of memory as that’s just the nature of how it works (so other than dropping the resolution / detail level it’s working at, memory usage will be high with it). So I don’t think I’ll do anything towards this request (sorry) but as it just seems to be something to mask an issue rather than actually fixing the issue, I don’t believe it’s the right thing to implement.
DrO allright? You read my comment?
Yes, I’d replied a bit over an hour prior to your recent comment. Unfortunately without providing an email address when leaving a comment I cannot send a notification email when a reply is made.
DrO, allright? Sorry, the last post, now I read you answer.
1: About the Infinite Randomized Playlist, is because I have the habit to create an playlist of all my files randomized, and after I change the playlist much, many times I add new songs on playlist when I want hear some artist, then I hear 10 songs in order and after the random order back, many times I add an mix of songs, which I want hear to my playlist, and I use your Separator and in the end the ramdom order back, and after hours I search the separator and I move this addiction after current song using PlaylistEx (Calin Adrian - gen pl extender.dll). The PlaylistEx I use extremelly, I recommend. To me an randomized playlist work better than shuffle, but anyway is good know more how shuffle work.
I have your File Remover installed, I think as you which it can be added to this plugin, only thing which need I think is to Reload the Playlist from library without removing the files or moving to end, but only after play the full playlist or getting the end, it is because removing or moving to end is bad when you want search some music or musics or “the separator” manulally in playlist scrolling back.
3: Thanks by this tip about Jump to File setting, now is allright.
4: DrO, about memory, I use some Vsts, my favorites is light on memory and CPU (it is one of reasons why are my favorites), an instance is the excellent Reaplugs Pack, use the Reaeq and Compressor etc on Winamp is fine. Backing to memory, I think as you which restarting dont is the best way to clean the memory but I learned which many times is the best option, an instance is Firefox, the best browser to me, I have a lot of plugins, and after an short time browsing this fill my memory, after a lot of tests with a lot plugins etc I learned whith the best option to clean Firefox (old or new) memory is restarting, in Firefox is easy to restart with an habit you solve the memory problem without uninstalling your plugins.
To close,
thank you your attention and answer, I’m happy if my suggestions are in your private list, and I’m following this blog.
Lucas Maia - Brasil
Not to worry about not seeing the reply (might have been a caching issue).
1) Do you have a link to where to get the plug-in you’re referring to as I’ve not been able to find anything that matches the name / details you’ve mentioned.
My thought with PLFR was just to have loading a library query / all of the library as an alternate option instead of the existing playlist reload (so both options would exist, but only one can be used). Doing it based on a library query makes it more flexible overall but it’s simple enough to have it load everything in the library as well using the same mechanism. I just need to get PLFR to a point where I’m certain that it’s working correctly again.
3) Glad to hear that worked :)
4) In general anything which is left running will consume more memory over time especially if it’s something that is tracking histories (as Winamp and your Firefox / web browser example does). However if it’s jumping up quickly then that means something is wrong and if you’ve got plug-ins installed, it’s going to involve a process of trying without different plug-ins to see which one (or more if that’s the case) are causing it.
Even Winamp itself isn’t too great at times e.g. the library history view tends to keep everything in memory and as you play more, that will grow and so over time Winamp will just end up using more memory to often display information that you don’t / won’t see (which is something I’m trying to see if with the history aspect can be resolved via a replacement history plug-in).
Final point on memory, memory that isn’t used is a wasted resource but then also using too much just for the sake of it isn’t good either. So there’s a balance that needs to be found between the two and with the Winamp scenario, reviewing the plug-ins (and also skin) that you’re using may help to track down what’s leading to the undesired behaviour you’re having (just keep in mind that over time it is expected that the memory usage will change up or down (as can happen) but excessive growth indicates a problem).
Hope that all makes sense / helps :)
DrO,
about File Remover, your update thought can be good to me only thing which can be better is if have how use Reload Playlist only playing all playlist without removing or moving files to end, it is good to reuse old parts of playlist, for instance, some music selection which I dropped to playlist and I want hear newly more 1 or 2 times, I can only scroll back and take it, and without hear this things in the end, is fun, can seen crazy, but is good this control. My first thought is only in the end of playlist, load all library, randomize, play the first, I do this suggestion because I have Winamp running on background ever, I never close, I almost never restart my Win 7, the Win 7 is really good to keep without restarts, and winamp only stop in one of two cases, when I switch my pc to standby I use MLC Advanced Auto Pause (but to stop), the second case is when my playlist end, and I ever feel the lack of an automation to reload library, ramdomize, play the first, I did this many, many, many, many times in last years. I dont know if you like this, but if you add an function to Separator?, like the Stop function, but, the function do so, Load Library, Ramdomize, Play the First, and Add automatically this Special Separator in the end of playlist, if user want stop this behavior only remove the separator. Is an way, just an suggestion.
About memory, I think as you, I use classic skin, in general the consuption of Winamp is quite acceptable, my favorites VSTs in general is light, actually is only some specifics VSTs which fill my memory, and the Milkdrop, which I like use, how I have few memory ever after use this things as MD, I close Winamp and I Reopen to clean memory for other things like Firefox, about Firefox I really have a lot of plugins, and I open many, many tabs, but Firefox sadly, with or without plugins, as you said with the time and use, use much memory anyway, but I restart and all right, I’m happy with this, the restart is sometimes the best, is like in my Android, using hardly, have an time which I have to restart or my memory is never cleaned, and is very slow without it, (this the Google need learn with closed source Windows other thing is to keep compatibility with older softwares).
The link of plugin:
http://winampheritage.com/plugin/playlistex-v2-0-20110411/222487#
DrO, bye, thank you, and if you want say more something I’m here, but I don’t access internet all days then I can need some time to answer.
DrO an other suggestion is add more functions to Separator, as Change Volume to X %, back X songs, etc. Is useful, have some albums which is much dynamic as classical, instrumental (brazilian instrumental is excellent), and you increase the volume, in the end, when back to ramdomized order and play an Offspring the speaker break all.
Will have a proper read through the recent comments later on but I’ill quickly reply before signing off for the night.
The plug-in now I see it I vaguely remember it as the ‘official’ review was mine and I think still holds in that most of what it provides was already present via the jtfe plug-in at that time).
The separator stuff makes sense in expanding the options that can be done. It would really need some tweaking to how the current way works to make it easier to setup / manage such things but I definitely see the benefit in expanding what could be done via a separator type entry (which starts to verge on a scripting-like aspect). The one thing I do think with the separators is needing to do something so they don’t appear like normal playlist entries (with the position next to them) but that’s something I’d need to work out how to do without breaking anything later on (and hopefully with the things that you’ve suggested for that plug-in :) ).
DrO,
PlaylistEx is good mainly because you can move an song or an selection after or before the current song extremely easy using only one keyboard key, not an combination like control + etc.
I think which remove position in front of Separator is an good thing but I think which you can do it later, it is like an retouch, I think which the functions is more important. But I like the idea, but if you remove the position, the user can search separator in Jump to File? I do it some times, because I know which each separator have an song information, which info can be used in JTF.
Other thing which I want suggest, is add VST host to WACUP pack, why? Because I think which VST really help and expand the Winamp, saying of sound wave control and customization, and have a lot of free and excellent vsts plugins, eqs, compressors, limiters, reverbs is a lot of power over the sound, which you dont have in any commercial sound system like an Sony. If you like the idea I think which the best version is the first, v1.0, the motives is many:
1: more light = just 250 kB
2: completely free, other versions have commercial feature, oversampling, not essential.
3: the window border is better, work with Aero.
4: The most important. When you minimize the winamp the host 1.0 window go together, after version 1.1 the host continue on screen, this is unacceptable, if you have an chainer and want the plugins ever in the hand you can keep the host window ever open like the Library, after version 1.1 this is not possible.
5: Vst Host 1.0 is very good, is better which some “professional hosts”
For instance the host of Goldwave editor
Really JTF have some things like PlaylistEx, slight different in behavior of move after current
DrO sometime hear it, is of Brasil, the Slash of Guns and Roses fall to back. If you want can delete.
Raphael Rabello & Dino 7 Cordas
http://digitalk7.com/mus/Brazil%20Jazz%20and%20Fusion/Raphael%20Rabello%20&%20Dino%207%20Cordas/10%20Gra%C3%BAna.mp3
Hi DrO,
I’ve been following your posts and waiting for the beta release of WACUP. The discussion with Lucas about memory has promoted me to respond about an app I’ve been using for the past several months that you both may find useful.
I agree that physical memory is a resource that should be used (within reason) and not hoarded, so for years I’ve been content to let the Windows OS manage it. Then I came across “CleanMem” (http://www.pcwintech.com/cleanmem). It is a small app that helps Windows manage physical memory better.
As you know, basically Windows allocates the amount of physical memory each app/process requests and leaves it up to each app/process to return what it doesn’t need. Other than what is not needed after loading, most apps/processes return this memory slowly (or request more) during their execution. CleanMem can be setup to periodically have Windows query each running app/process for what is actively being used at the time of the query and shift all that is not being used at that moment to the system standby cache. This cache memory is immediately available to any app/process that needs it. So the effect is that each app/process is only left with the memory it is actively using (instantly reducing their working set memory when possible) and allowed to increase their active memory usage over time as needed. After the adjustment, some apps/processes immediately request a chuck and some gradually request smaller amounts. Bottom line, the active in-use memory is kept to a minimum and each app/process still gets the physical memory they actually need (without having to swap to virtual memory (a paging file is still needed) unless the total amount of physical memory is small).
The technical details are provided on the site I provided the link to. I have been using 10 minute intervals and it works great, especially with Winamp. The drop in Winamp’s average working set memory usage is incredible. No performance issues and zero crashes. I have 6 GB of RAM and have been able to load and run twice the number of apps (with RAM to spare) than before I started using CleanMem. I highly recommend it. I no longer need to shutdown apps and restart them due to creeping increases in memory usage that grow too big.
Aminifu: Good to hear from you & hope you’re doing well :)
Having a quick look at what CleanMem seems to be doing (I haven’t installed it, just read the info) it seems like it’s probably using the EmptyWorkingSet API which is something I’m already using within the loader program so that once the original winamp.exe has been started up, EmptyWorkingSet is self-called to do just what you’re talking about. It drops it from a few B to a few 100 KB or so (it varies a bit depending on the version of Windows being used and anything else trying to hook into the processes as to how much it can drop).
I had been toying with doing the same with the loaded Winamp process in having EmptyWorkingSet called on a timer as in most cases once it’s been loaded and things have settled down after a few minutes, it becomes clear that a lot of what is loaded isn’t actually needed after initial loading or is just due to how the OS caching / pre-emptive handling works to reserve (but not truly commit) the memory that might be needed vs what is actually being used. Though in other respects the OS should already be doing the equivalent of calling that API if physical memory is starting to become low.
From my tests (which may not be representative at all) it’s generally around a 50% reduction in working set when manually calling EmptyWorkingSet on the process with a file playing. Without a file playing it gets down to just a few MB but then doing anything makes it generally climb back up to around 10-20MB range (without doing it, I’m on around 35-40MB). Either way, it’s one of those things where if real memory is lacking and the page file needs to be used it can help, but like the tool’s page indicates, the better option is to have enough memory so that the OS won’t need to have to make use of the page file (especially if using a traditional HDD).
Hi DrO,
I’m doing quite well, thank you. My health is fine and no more than the usual financial challenges. I hope the changes due to the UK leaving the EU have not been overly negative for you. I’m also hoping that the changes that this year’s US political elections will bring, will not be overly negative for both of us.
Based on my experiences with CleanMem, I agree with your comments about what it is probably doing. I also agree that those having issues due to a low amount RAM are best served by adding more RAM.
In my case, I don’t really need to use CleanMem. It just puts off the time before the page file needs to be used and I appreciate the extra time (even though I finally switched to a SSD early last year). CleanMem’s developer also says it cleans up any memory leaks. If true, that would be a bonus. For me, web browsing, with a lot of open tabs, uses up the most RAM and slowly releases it. For performance sake, I wonder why browsers don’t make use of that API (if they don’t), instead of solely relying on the OS to manage things (swapping to and from the page file) when RAM gets low.
As for Winamp, my configuration requests more RAM (than a default configuration) because of all the 3rd party plug-ins I use (including a cPro modern skin UI) and the amount of hi res album art I often display during a session. Before using CleanMem, during a session where I displayed a lot of album art, I’ve seen the working set memory slowly rise to close to 1 GB. Since using CleanMem. it never rises that high. Peak working set usage is 350 to 400 MB at loading and the working set quickly moves to between 100 to 200 MB (and slowly moves up and down while playing songs). After the OS memory manager is triggered to use that API, the working set drops to 40 to 70 MB and slowly starts rising again while playing songs. As you have seen, the working set drops to less than 10 MB when that API is triggered and Winamp is not playing anything. From almost 400 MB at load to less than 70 MB (or less than 10) seems incredible to me. From a user’s point of view, it seems that Windows forces a program to load a ton of dlls that are not needed or not used very much. ;)
I remember you saying that Winamp’s real memory problem is/was not having large enough contiguous blocks of memory available. Do you think using that API, to delay when page file use is necessary, will have any affect on that?
Aminifu: Memory leaks is a weird area as forcing an OS clean-up of the process memory can help to an extent but it’s still masking the real issue. If my understanding of things is correct (which may not be), it comes down to what is seen to have been used recently and using that as a means to discard that memory but the leak is still effectively there and even with trying to clean up things, it still could lead to crashes when the allowed memory limit of the process is reached.
—-
With browsers (and other programs for that matter), there are alternative memory allocators which can be used which can provide better memory allocation speeds (useful if it’s happening very frequently) instead of just using the standard options (malloc, new, etc). For their needs maybe EmptyWorkingSet helps but then if it’s timing critical then re-paging back in a paged out block due to having used EmptyWorkingSet may not be something acceptable that they want to be using directly (not that it’s not possible to do it externally of the process). So that more comes down to what they want to use against their design specs as the expectation fo what a browser has to do now is in some respects verging on a mini-OS and all the pain that brings.
And definitely perception counts a lot but at times I don’t know if it matters too much as the OS memory managers are so much more advanced and capable of coping with things compared to when memory manager tools were commonly used (which comes back to the general lack of actual memory vs virtual memory masking things and leading to performance issues).
—-
The thing about contiguous blocks of memory was related to library database re-building where it’s all done in-memory (for speed) and so with a very large database it can in some cases require a big allocated single-block so that can be done. With the last few 5.6x builds there were some compile tweaks made which allow the program (more so on a 64-bit version of Windows) to have easier access to the 4GB process space that 32-bit programs have available to them.
Doing that helped a lot (along with better failed memory allocation checks in the database engine from what I remember doing) but it still leaves it as a potential issue but then that could happen with anything that’s going on within Winamp at the time which needs a lot of memory to do it’s thing.
As such I’m not sure if EmptyWorkingSet would make too much of a difference in that instance (it’s hard to tell as forcing a full large library database re-build is somewhat time consuming to test against) as it depends on how the existing memory has been allocated and more so down to where those blocks have been allocated which comes back to the compiler tweaks which make it more likely that multi-100MB blocks will be available.
I’ve used VMMap (https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx) in the past to look at how memory has generally been allocated to see what the largest free block could be. Though I’m almost tempted now to see if a bit of what VMMap does can be easily done (just to see what the largest free block size is).
Aminifu: In the past I tested in firefox an software which do the samething but which firefox , I had bad results, and stoped to use it, but maybe with winamp the result can be other, I can do an test, thanks your tip
DrO: I have my Winamp completely configured, but which time I forget some settings, I think which JTF have somethings like PlaylistEx, including the use of one Key to move, but I like the possibility to choose the keys, and can seen fun but many times I use the Move Before. But anyway thank you the attention.
Just have to say, so happy I found this page!! I have missed Winamp - have not found any other products that I am as happy with!
Lucas: Just wanted to say I’ve had a read through all of your comments after my last direct reply to you and it seems like a ‘move before current’ is the most obvious thing that could do with being added (to mirror the existing ‘move after current’ feature from JTFE).
Configuring the keys that JTFE uses for those actions is something I should consider looking into. Though the other option is to setup a global hotkey as some of the JTFE actions have such an option available (under the ‘general’ type when looking at the possible global hotkeys).
With the possibility of VST support, the only plug-in that i’m aware of was by Budde Christian. So if you can point me at what you’re using (as I don;t know if it’s the same thing I’ve been looking at or not would be appreciated).
So your comments have definitely given me some thoughts and it’s now just a matter of time to work out which are the most viable to implement (or adapt existing functionality to achieve). Hopefully I’ve covered most of what you’ve asked about :)
This is the first time I checked out your blog, aand honestly, compared to
your other posts, Self-Publishing. The New Way or the Short-Cut?
Ԝhat’s Hɑppening i’m nnew to this, I stubled upon this I haqve
foսnd It absolutely helpful aand it has helped me ⲟut loads.
I hkpe tto contribute & aid οther customers like its helped me.
Good joƄ.