yashsingh1/xdaforums huggingface dataset:
[Spirit FM] mikereidis:
Expansys is selling new GPE Z Ultra for $350 US, and it's guaranteed bootloader unlockable. But I don't like that GPE requires different ROMs than non-GPE.

I'm only looking for a test phone, so things like camera, water protection, speakers etc. don't matter much to me, though I might end up wanting to make it my "real phone".

I'll see if Canadian variants are bootloader unlockable.

EDIT: I think Canadian Z Ultra Bootloaders are not unlockable. :(

If anyone can help, I'm trying to decide between Z Ultra GPE and non-GPE and have posted here in Q&A: http://xdaforums.com/xper...1/post54152215

My quandry is that there's more development for non-GPE, but it seems tricky to buy a non-GPE that is guaranteed BL unlockable.
[Spirit FM] mikereidis:
LG G2:

That kernel didn't work well with Mahdi for digital audio.

But the associated Vanir ROM and kernel work well: http://xdaforums.com/showthread.php?t=2494756

So Vanir is an FM friendly G2 AOSP ROM, at least on the vanir_ls980_4.4.4.070914.zip version I checked. I'm downloading the July 13 release now and will report if anything changed.
[Spirit FM] Kess78:
I know that the GPE has been pulled out of the google play recently and I think it didn't sell that much so I don't know if there will be a lot of development for it. Z Ultra is maybe the less popular high end from Sony but they all have the same hardware so I don't think that will be a problem. Sony phones that are garanteed bootloader unlockable are the one that don't come from a provider and don't have a software modified with apps from the provider.

EDIT : Well looks like it's quite popular on XDA ingore what I said...
[Spirit FM] aky_style:
OK. np mikereidis

But would it be possible for you to share the most commonly running settings on LG P500.

Thanks.
[Spirit FM] mikereidis:
All defaults. No settings are needed.

P500 is an old phone (the 3rd I supported 3 years ago) and nothing has changed in quite a while, AFAIK.
[Spirit FM] mikereidis:
Yeah, Z Ultra is reasonably popular on XDA, and has official CM11 and another ROM or 2 at least. There was work to create a tool that could GPE-ize non-GPE ROMs, and I hope that continues, but no guarantee...

I just redid my sales stats tonight though, and for whatever reason, Xperia Z is 6 times more common that Z Ultra in the stats, and 4 times for Z1 and 2 times for Z1 compact.

But this isn't about sales stats; as you say all Sony devices the last few years are pretty similar, all with Qualcomm FM/combo chip and Qualcomm audio. And I think the Z Ultra will serve to help me support everything from the Z (even back to the T) to the Z2 at least, and GPE is a nice bonus.

It can be difficult to determine provider status on EBay, and the less expensive and common phones are probably all bootloader locked.

Basically, AFAICT, the only 100% true guarantee of BL unlockable is with the GPE, and there's no other Sony Z* device that's GPE. Unless you can tell me Sony's website guarantees bootloader unlockability on certain variants, which I'm pretty sure isn't so. I saw at least one person post that his unbranded Ultra Z couldn't be BL unlocked.

So I think I'm going with the Z Ultra GPE. I'm still ticked off that the Hong Kong Xperia P I bought a few years ago couldn't transmit and don't want to take chances this time.

In an Xperia Z Ultra FM thread, someone indicated he got FM transmit working, so that's cool. :)
[Spirit FM] ffxx68:
Yes, "ssd 4 3 2 x" does control headset volume.

AUX_IN is fed (standing to the schematics I have) by the audio from the 3G phone module, not FM out. Note as this is a data-only 3G tablet, so I never used it as a phone.

FM output is fed into LINEIN (pins 3, 6) of the Realtek mixer, once again standing to schematics...

Issue is that, while AUX_IN is indeed handled by the kernel driver (as I can see from code), LINEIN is not. But, that's not the trickiest part, as adding an handling for that is relatively straightforward.

What I should add as well is a LINEIN handling in the ALSA code... Need to work on that...

Is there any specifc expectaion from your app, when setting Audio/None option, for example?

EDIT - Before modifying the ALSA code, I made changes to the kernel driver so that both AUXIN and LINEIN are handled by the driver as capture devices.

I created the new capture paths: 'AUXIN_to_Speaker' 'LINEIN_to_Speaker' 'AUXIN_to_Headphone' 'LINEIN_to_Headphone'

I now have the following from "ssd 4 0":

ctll count: 12
name: DAC Volume numid: 001 access: rd,wr, (0x03) type: Integer (2) min: 0 max: 31 Values: 2 2
name: Headphone Volume numid: 002 access: rd,wr, (0x03) type: Integer (2) min: 0 max: 31 Values: 7 7
name: Speaker Volume numid: 003 access: rd,wr, (0x03) type: Integer (2) min: 0 max: 31 Values: 2 2
name: MIC1 Volume numid: 004 access: rd,wr, (0x03) type: Integer (2) min: 0 max: 31 Values: 2 2
name: MIC2 Volume numid: 005 access: rd,wr, (0x03) type: Integer (2) min: 0 max: 31 Values: 2 2
name: AUXIN Volume numid: 006 access: rd,wr, (0x03) type: Integer (2) min: 0 max: 31 Values: 7 7
name: LINEIN Volume numid: 007 access: rd,wr, (0x03) type: Integer (2) min: 0 max: 31 Values: 0 0
name: AUXOUT Volume numid: 008 access: rd,wr, (0x03) type: Integer (2) min: 0 max: 31 Values: 2 2
name: Capture Switch numid: 009 access: rd,wr, (0x03) type: Enumerated (3) Values: 0 items: 11 names: 'OFF' 'MIC_normal' 'MIC_ringtone' 'MIC_incall' 'Headset_normal' 'Headset_ringtone' 'Headset_incall' 'AUXIN_to_Speaker' 'LINEIN_to_Speaker' 'AUXIN_to_Headphone' 'LINEIN_to_Headphone'
name: Sampling Rate Switch numid: 010 access: rd,wr, (0x03) type: Enumerated (3) Values: 10 items: 12 names: '7.35kHz' '8kHz' '11.025kHz' '12kHz' '14.7kHz' '16kHz' '22.05kHz' '24kHz' '29.4kHz' '32kHz' '44.1kHz' '48kHz'
name: Playback Switch numid: 011 access: rd,wr, (0x03) type: Enumerated (3) Values: 6 items: 9 names: 'OFF' 'Speaker_normal' 'Speaker_ringtone' 'Speaker_incall' 'Earpiece_ringtone' 'Earpiece_incall' 'Headset_normal' 'Headset_ringtone' 'Headset_incall'
name: CODEC Power Switch numid: 012 access: rd,wr, (0x03) type: Boolean (1) Values: 1

Is this the correct approach?

How could I enable LINEIN capture using ssd?
[Spirit FM] mp107:
I understand but there is few info about working (or not ;) ) applications on this (very unique) device so I decided to comment.

And some complement - RDS works too.
[Spirit FM] mustasusi:
Sprint GN3 more updates, some good news indeed

Hi Mike,

Did you get my last 2 debug logs?

You may refer to the most recent one, sent from an X-Note 4.4.2 custom ROM w/ BeastMode kernel I flashed yesterday. Since the flash, Next radio is no longer turning on, anyway Spirit DO!

So far:

Tuner - operating (unlike "can't access FM" on stock)

Audio -

not working

(tried every method out there one by one, either analog\digital)

RDS - working

Reception bar - working (appears to stronger than my HTC Max, more like the Note1 actually, not sure about stereo threshold though, will be able to determine as soon as I get audio working, HOPEFULLY)

Visual spectrum analyzer - not working (needs audio, duh!)

Loud Speaker - same

Bluetooth - gosh...

For it seems to be a stronger receiver, I'm anxious to succeed with this one.

How can we move from here?
[Spirit FM] mikereidis:
No, no expectations much. If Audio-> Method is set to None or Custom, Spirit limits it's actions to setting Volume Control Stream to 3/Media and requesting Audio Focus (I think).

You should explicitly enable Debug-> Silent Loop (Not "Silent Loop Off").

On many devices Debug-> Silent Loop is set by default, which just plays a silent audio file in a loop; this is how I deal with audio libraries that have been bypassed, and don't know FM audio is playing.

First, I should clarify that the easiest and most universal way to support FM audio is by just enabling an analog path. Normally/historically this is how Android FM works. FM does not go through the same digital processing all other media does. Spirit supports a digital audio mode, but it's not easy to make it work on unknown devices.

So I'm guessing you just want to set "Capture Switch" to "LINEIN_to_Headphone" and this will complete the needed analog path.

ssd syntax would be:

ssd 4 3 9 10

4 = Alsa command

3 = Enumerated (3

9 = numid for Capture Switch (could also use 'Capture Switch' if quoted properly)

10 = last value (LINEIN_to_Headphone) when items = 11 (can be 0-10)

Or use alsamixer app or amixer/alsamixer utility if you have the needed libs.
[Spirit FM] mikereidis:
Yes, if FM works, then RDS works.

Happy to hear a success story...:)

Too many people have the thrill of seeing RDS work, followed by the crushing defeat of no audio, the main point of radio.
[Spirit FM] mikereidis:
Just to put info about the LG L70 in the thread.

L70 is an "All Qualcomm" architecture, importantly Qualcomm FM/BT/WiFi combo chip and Qualcomm audio chip.

Spirit2 was working, but with volume control issues ?

Spirit1 works when manually configured for Debug-> FM Chip and Audio-> Method.
[Spirit FM] mikereidis:
Tablet Z2:

Well, I think I changed my mind. I'll get the low end Z2 Tablet; seems a decent deal here from the Sony store at USD $440.

I'll presume that straight from Sony means BL unlockable, and if not I can complain as a dev and they should fix it, or at least swap for a GPE...

Would be nice to make better use of a 10 inch screen and Sony's are the only FM tablets worth noting.
[Spirit FM] ffxx68:
YES! this made the trick... I can perfectly hear my FM radio now.

But, how to make the app set it auto-trigger such an audio path?

Any idea in that sense?

Note how I could make changes in ALSA code or path definitions as well...

Note how I keep getting these lines in logcat:

V/AudioPolicyManagerBase( 75): getDeviceForStrategy() from cache strategy 0, device 4
V/AudioPolicyManagerBase( 75): getDeviceForStrategy() from cache strategy 0, device 4
V/AudioPolicyManagerBase( 75): getDeviceForStrategy() from cache strategy 0, device 4
V/AudioPolicyManagerBase( 75): getDeviceForStrategy() from cache strategy 0, device 4
V/AudioPolicyManagerBase( 75): getDeviceForStrategy() from cache strategy 0, device 4
V/AudioPolicyManagerBase( 75): getDeviceForStrategy() from cache strategy 0, device 4
V/AudioPolicyManagerBase( 75): getDeviceForStrategy() from cache strategy 0, device 4
V/AudioPolicyManagerBase( 75): getDeviceForStrategy() from cache strategy 0, device 4
V/AudioPolicyManagerBase( 75): getDeviceForStrategy() from cache strategy 0, device 4
V/AudioPolicyManagerBase( 75): getDeviceForStrategy() from cache strategy 0, device 4

Does it mean your app is trying to invoke "device 4"? What device is that?

Thanks anyway for your help and great app!

BTW - I'd be really curious about the BCM4329 API sources as well? Any reference to that?
[Spirit FM] mikereidis:
Yes. :)

Well if you have working FM but no audio, this is where we get stuck when we have a Broadcom FM/combo chip, which unlike the Qualcomm chip, has no standard way to connect with the audio chip (Qualcomm).

HTC One M7 and LG G2 have this same issue, and I can only fix properly if I have one.

But in this case, you might be getting less in your ALSA driver due to the custom kernel, which likely doesn't have any GN3 FM specific stuff, in large part because FM is so rare on GN3.

More chances with stock GN3 ROMs and kernels, but even then I can't do it without one in my hands, and then put a LOT of time into it. And since you are the 2nd person with a Sprint GN3 contacting me since it was released, I can't justify my limited time on it further.

I'll note for the thread that the 1st person, several months ago, had stock, rooted Android 4.3 on his Sprint GN3 and he said it worked, though his debug log seemed to indicate it didn't.

Maybe you should go Sony. :)
[Spirit FM] mikereidis:
:)

Audio-> Method = Custom used to run binaries or shell scripts, but it appears I disabled it and removed all the related code at some point. (?)

Device 4 is likely headset, or whatever is active output at the time. Those lines are probably 10 per second.

It's because Spirit is polling the volume control level and passing the value to the chip when it changes. Sadly, Android still doesn't provide a supported way to be notified of volume control changes. (The "system" is supposed to handle it.) There are some debug settings to customize, like Debug-> Poll Vol Off.

That code is top secret. ;) Any chance that device has a usable FM transmit pin ?
[Spirit FM] ffxx68:
That's a real pity... any other way to trigger some custom action?

How do some other more "standard" device work? How they enable the proiper analog audio path? I could adapt my driver to that...

I've sent you my schematics (FM-relevant pages). I'm not sure the BCM4329 pins 43 and 44 are those used for both transmit and receive.

In case of transmit mode, what audio input would be used?
[Spirit FM] mikereidis:
There's no standard, everything is different. Audio is the majority of my work the last 2 years, LOL.

Oh, custom is still there, it's just in the C code and not the Java, LOL, I'm trying to forget the mess of Spirit1 and move on with the cleanliness of Spirit2.

int custom_out_set (int out) {
if (out == 1)
return (su_run ("sh /sdcard/sprt_mute", 0));
else if (out == 2)
return (su_run ("sh /sdcard/sprt_spkr", 0));
else //if (out == 3)
return (su_run ("sh /sdcard/sprt_hdst", 0));
}

Hmmm, I'm not sure about the FM transmit audio pins; actually, I think the BCM4329 might not have TX; or is that 433x and on ? Nobody wants transmit it seems. I have a few old HTCs with Tx, unofficially.

EDIT See post 8087.
[Spirit FM] mikereidis:
Z2 Tablet ordered... Hopefully better to look forward than with an almost year old device (Z Ultra) destined to lose official support in the next year, perhaps no L even.

The only way to get more attention than a 6.4 inch phone held to your face, is with a 10+ incher, LOL.

Now, what sort of graphics would best fit that space ? I'd love to see ghetto blaster and nice control panel layouts; add my new but currently off schedule audio app, and it might fill up quick.

Stretched Spirit must look bizarre, though I made sure pretty much everything scales proportionally.
[Spirit FM] mikereidis:
For those who know "old" CPU numbers, 8085 followed by 8086 must be good luck. :)

I'm happy to see an influx of new supporters via Google Play; I can still make more at a "real job" (LOL) in this field but the gap is narrowing.

This strengthens my commitment to do the best I can to fix issues and add new features on an ongoing basis.

I got taxman and personal stuff though, in between all the email and thread support (35-40 hrs per week itself), so I probably should lay off the coding until August perhaps.

My best theories for the nice bump in support are (1) Spirit2, and (2) possibly partly seasonal "I have a summer job" pre or post secondary education factors among a relatively young demographic ?

Anyway, thanks all, and Spirit goes onward and forward, 1* and 2.

*Not really sure about Android L support for Spirit1, to be honest. Lots of root app breakage means LOTS of work on a messy code base such as the "mature" Spirit1 has become. Time to move on to better/newer/supported hardware and Spirit2 if you need the next generation of Android.

Android L support for Spirit2 is confirmed. I'll do the best I can to support whatever devices Spirit2 currently supports, adding Sony I presume. But it remains to be seen what viable ROM choices there might be for such "ancient" devices as GS1, GS2 and Note at least on Android L.
[Spirit FM] mustasusi:
That's why I suggested you a donation.

I would either go Sony if It had an IR port and if I could fetch a 10,000mah battery to it and another one in my wallet, ready to swap making it a total of 20000mah without adding too much bulk. The latter I'm so missing on my HTC this is almost a deal breaker nowadays. The 1st guy claimed it worked on 4.3 - can you tell what ROM was it? Stock or custom?

Maybe I should downgrade, if possible as I used to do on older devices.

Just to set straight - if Next radio doesn't turn on for that ROM\kernel, then no chance for Spirit either?

Edit: on stock ROM and Beastmode kernel Next radio still works. Might be something with X-Note after all...
[Spirit FM] ffxx68:
Do you mean it's still there in Spirit1 and not anymore in Spirit2 (in case I'm going to upgrade...).

Also, what about the "Audio-HTC One ALSA" mode?

What commands does this (or any other ALSA) mode issue?

Seen that... thanks.
[Spirit FM] jsugrumpy:
Mike, volume control ok with both versions :thumbup::thumbup:

My only "complaint" with Spirit2 is that it lacks by now a feature present in spirit1 and the one that made me search for an alternative to my stock fm app:

Remote control from headset buttons with configurable actions for each of them.

I hope it will be added soon... ;););)
[Spirit FM] mikereidis:
[ro.build.date]: [Thu Oct 17 14:49:01 KST 2013]

[ro.build.description]: [hltespr-user 4.3 JSS15J N900PVPUBMJ4 release-keys]

[ro.build.display.id]: [JSS15J.N900PVPUBMJ4]

[ro.build.fingerprint]: [samsung/hltespr/hltespr:4.3/JSS15J/N900PVPUBMJ4:user/release-keys]

[ro.build.hidden_ver]: [N900PVPUBMJ4]

[ro.build.id]: [JSS15J]

[ro.build.product]: [hltespr]

[ro.build.version.incremental]: [N900PVPUBMJ4]

[ro.build.version.release]: [4.3]

[ro.build.version.software]: [MJ4]

He said Spirit1 worked, with sound, but he sent a debug log that indicated failure, go figure.

Spirit1 CAN use OEM Proprietary FM APIs, with their associated dependencies.

But when that fails, or if Spirit has SU, or if FM API = Low Level, then the main dependencies are on Linux/Android open source kernel drivers, for FM Chip/BT UART and for audio.

The design principle is to allow running on almost all AOSP ROMs, including the majority that have no functions for FM tuner and FM audio in their framework JARs, HALs and other libraries.

This is the advantage that Spirit has over every other FM app, assuming your phone/tab is rooted.

And since OEMs have been cutting off 3rd party access to FM APIs, Spirit is now focused on rooted, and preferrably ROM'd devices.
[Spirit FM] mikereidis:
Custom Audio Method was never in Spirit2. Pretty much nobody used it in Spirit1, so it's useless code. That said, I'm considering doing it for Spirit2, assuming the command configured for digital audio.

Every method uses different ALSA commands for mute, speaker and headset functions, or for digital audio, to enable or disable digital capture.

In most cases there are 3-10 commands for each function. Probably a thousand commands all told in my code; so I'm not going to reproduce them all here.

Here's my HTC One ALSA code function. Note that most of it is commented lines that I've used during experimentation & testing:

(Hopefully, this helps illustrate a tiny fraction of the reverse engineering type work I've had to do to support so many different devices and ROMs, LOL.)

void htc_one_alsa_headset () {
/* if (m_external_vol > 0 && m_external_vol <= 63)
ssd_run ("4 2 'Headphone Volume' " + m_external_vol);
else
ssd_run ("4 2 'Headphone Volume' 60");//63"); // Headphone Volume (0-63) = 63 */

ssd_run_var ("5 9 44100 2 /dev/snd/pcmC0D6c &", 0); // With-OUT root
//ssd_run_var ("5 9 44100 2 /dev/snd/pcmC0D5p &", 0); // With-OUT root
/* ssd_run ("4 2 'LINEOUT1 Volume' 8"); // Def: 12/12
ssd_run ("4 2 'LINEOUT2 Volume' 8");
ssd_run ("4 2 'LINEOUT3 Volume' 8");
ssd_run ("4 2 'LINEOUT4 Volume' 8");*/

ssd_run ("4 2 'RX3 Digital Volume' 70");//83"); // Def: 84/124
//ssd_run ("4 2 'RX4 Digital Volume' 83");
ssd_run ("4 2 'RX5 Digital Volume' 70");//83");
//ssd_run ("4 2 'RX6 Digital Volume' 83");

ssd_run ("4 1 'SLIMBUS_0_RX Port Mixer PRI_TX' 1"); // Def: 0/1

//setDeviceConnectionState (8, DEVICE_STATE_AVAILABLE, "");

//???? ssd_run ("4 1 'MI2S_RX Port Mixer PRI_TX' 1");

/*
//# Same as speaker:
//ssd_run ("4 1 'SLIMBUS_DL_HL Switch' 1"); // Def: 0/1
//ssd_run ("4 1 'MI2S_RX_DL_HL Switch' 1"); // Def: 0/1

ssd_run ("4 3 'RX5 MIX1 INP2' 11"); //# RX7 // Def: 0/11 = 'ZERO' = NC
ssd_run ("4 3 'RX5 MIX1 INP1' 6"); //# RX2

ssd_run ("4 3 'RX3 MIX1 INP2' 10"); //# RX6
ssd_run ("4 3 'RX3 MIX1 INP1' 5"); //# RX1

ssd_run ("4 3 'RX6 DSM MUX' 1"); //# DSM_INV // Def: 0/1 = 'CIC_OUT'
ssd_run ("4 3 'RX4 DSM MUX' 1"); //# DSM_INV
*/

//ssd_run ("4 1 'MultiMedia2 Mixer MI2S_TX' 1");
//ssd_run ("4 1 'MultiMedia1 Mixer MI2S_TX' 1");
/*
ssd_run ("4 2 'ADC2 Volume' 3");
ssd_run ("4 1 'MultiMedia1 Mixer SLIM_0_TX' 1");
ssd_run ("4 3 'SLIM TX7 MUX' 12");
ssd_run ("4 3 'DEC5 MUX' 2");
ssd_run ("4 1 'MultiMedia1 EQ Enable' 1"); //2
ssd_run ("4 1 'MultiMedia2 EQ Enable' 1"); //2
ssd_run ("4 1 'MultiMedia3 EQ Enable' 1"); //2
*/

}
[Spirit FM] mikereidis:
:)

Remote control is there, but the actions aren't configurable yet.
[Spirit FM] ffxx68:
Yes, it does! That's what I did to make my device work... imagine multiplied so many times !

Why don't you move all these different audio customizations off the hardcoded part of the source and make them deliverable within sort of "packages" (e.g. text files, or some other editable format), to make them more easily expandable, or customizable... Just an idea...
[Spirit FM] mikereidis:
Because nobody really ever used the Custom Audio-> Method.

Everybody comes to me and says "Please make it work (I don't know how)".

Virtually nobody comes to me and says "This is how to make it work".

Don't over-estimate the number of devs out there with knowledge of, and interest in FM. There is no widespread community effort out there, as there is for ROMs and kernels. Many devs consider FM radio to be outdated, destined to die (true, eventually) and proprietary/undocumented and very difficult to do (also true).
[Spirit FM] mikereidis:
Sony Xperia Z2 Tablet: Got it today... :)

But, for the 2nd time in the last 3 1/2 years (and 25 phones/tablets), I got an unexpected FM chip. (First was the International HTC OneX, with an end of line TI chip when I wanted/expected Qualcomm.)

I expected a Qualcomm FM/combo chip and it turns out to be Broadcom BCM4339. (I think.)

So, maybe Sony is finally moving away from Qualcomm FM/combo chips.

If so, then at least I'll have a Sony device with Broadcom, but I still want to get a Qualcomm based Sony.

Now I'll have to go deeper and figure out what Sony devices have which chips.
[Spirit FM] hi_cannon:
I thought I would post this for others still using HTC One XL. Recompiling the kernel to support FM radio again is pretty simple. You just need to change three lines in the kernel config file which re-enables module support and to build the iris module itself. I applied this over the latest Kitkat kernel and everything went really well (no build errors to work around, Spirit2 just worked).

Hope this helps!
[Spirit FM] mikereidis:
Thanks ! :) I'm still using my OneXL.

Can you share the kernel image, with me or everybody ?

I tried the old CM kernel and it didn't work well with the newer ROMs.

Do you think the CM dev might accept the patch ? I think I asked and got no response, but a confirmed working patch might do better.

I wonder why they removed modules support ? Figured they didn't need it ?
[Spirit FM] hi_cannon:
I can share the flashable zip with you, but since I'm basing mine on top of the excellent Bubba Kernel by rmbq, I don't feel comfortable with publicly distributing it. Maybe at some point I'll create one from stock CM and post it here :fingers-crossed:

I'm frankly not sure why they removed modules support. My best guess is the same as yours. The other modules I saw pre-module removal were all either also disabled (some crypto libraries) or built in-kernel. I did see that in stock CM at least, both FM modules are now enabled. However, they are built in-kernel, which Spirit2 did not seem happy with. It throws

java.io.FileNotFoundException: /proc/modules: open failed: ENOENT (No such file or directory)

since there is no file modules in proc as there is no modules support. I can't confirm whether the module is actually working in-kernel (maybe you can just pretend it's there?). Anyways, I'll PM you the link to the kernel I'm currently using.

I'll just post the dropbox link but it'll only be up for a day. Please don't redistribute!:angel: