From 3a8daa69a5de37ea313d3aca5aca534cc99eaef2 Mon Sep 17 00:00:00 2001 From: Hannes Achleitner MAC Date: Fri, 3 Jan 2014 12:43:48 +0100 Subject: [PATCH] ogg stream --- jni/Android.mk | 1 + jni/libvorbis-stream/Android.mk | 19 ++ jni/libvorbis-stream/jni-util.c | 28 ++ jni/libvorbis-stream/vorbis-fileinputstream.c | 198 ++++++++++++ .../vorbis-fileoutputstream.c | 295 ++++++++++++++++++ jni/libvorbis/Android.mk | 1 - libs/armeabi-v7a/libvorbis-stream.so | Bin 0 -> 17532 bytes libs/armeabi/libvorbis-stream.so | Bin 0 -> 17532 bytes libs/mips/libvorbis-stream.so | Bin 0 -> 71232 bytes libs/x86/libvorbis-stream.so | Bin 0 -> 13544 bytes .../xiph/vorbis/stream/AudioInputStream.java | 23 ++ .../xiph/vorbis/stream/AudioOutputStream.java | 27 ++ .../vorbis/stream/VorbisFileInputStream.java | 70 +++++ .../vorbis/stream/VorbisFileOutputStream.java | 62 ++++ src/org/xiph/vorbis/stream/VorbisInfo.java | 34 ++ 15 files changed, 757 insertions(+), 1 deletion(-) create mode 100644 jni/libvorbis-stream/Android.mk create mode 100644 jni/libvorbis-stream/jni-util.c create mode 100644 jni/libvorbis-stream/vorbis-fileinputstream.c create mode 100644 jni/libvorbis-stream/vorbis-fileoutputstream.c create mode 100755 libs/armeabi-v7a/libvorbis-stream.so create mode 100755 libs/armeabi/libvorbis-stream.so create mode 100755 libs/mips/libvorbis-stream.so create mode 100755 libs/x86/libvorbis-stream.so create mode 100644 src/org/xiph/vorbis/stream/AudioInputStream.java create mode 100644 src/org/xiph/vorbis/stream/AudioOutputStream.java create mode 100644 src/org/xiph/vorbis/stream/VorbisFileInputStream.java create mode 100644 src/org/xiph/vorbis/stream/VorbisFileOutputStream.java create mode 100644 src/org/xiph/vorbis/stream/VorbisInfo.java diff --git a/jni/Android.mk b/jni/Android.mk index db44010..1404309 100644 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -6,6 +6,7 @@ include $(addprefix $(LOCAL_PATH)/, $(addsuffix /Android.mk, \ libogg \ libvorbis \ libvorbis-jni \ + libvorbis-stream \ )) diff --git a/jni/libvorbis-stream/Android.mk b/jni/libvorbis-stream/Android.mk new file mode 100644 index 0000000..f4a1fa1 --- /dev/null +++ b/jni/libvorbis-stream/Android.mk @@ -0,0 +1,19 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := vorbis-stream +LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -ffast-math -fsigned-char +ifeq ($(TARGET_ARCH),arm) + LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp +endif + + +LOCAL_SHARED_LIBRARIES := libogg libvorbis + +LOCAL_SRC_FILES := \ + vorbis-fileoutputstream.c \ + vorbis-fileinputstream.c \ + jni-util.c + +include $(BUILD_SHARED_LIBRARY) diff --git a/jni/libvorbis-stream/jni-util.c b/jni/libvorbis-stream/jni-util.c new file mode 100644 index 0000000..040d8bc --- /dev/null +++ b/jni/libvorbis-stream/jni-util.c @@ -0,0 +1,28 @@ +/* Programmer: Nicholas Wertzberger + * Email: wertnick@gmail.com + * + */ + +#include +#include +#include +#include + +/* + * http://java.sun.com/docs/books/jni/html/exceptions.html + */ +void +JNU_ThrowByName(JNIEnv *env, const char *name, const char *msg, const int code) +{ + char buf [45]; + + sprintf(buf, "%35s: %d", msg, code); + + jclass cls = (*env)->FindClass(env, name); + /* if cls is NULL, an exception has already been thrown */ + if (cls != NULL) { + (*env)->ThrowNew(env, cls, buf); + } + /* free the local ref */ + (*env)->DeleteLocalRef(env, cls); +} diff --git a/jni/libvorbis-stream/vorbis-fileinputstream.c b/jni/libvorbis-stream/vorbis-fileinputstream.c new file mode 100644 index 0000000..3f619f8 --- /dev/null +++ b/jni/libvorbis-stream/vorbis-fileinputstream.c @@ -0,0 +1,198 @@ +/** + * A java interface (a la inputstream) to read ogg vorbis files. + * http://svn.xiph.org/trunk/vorbis/examples/vorbisfile_example.c + */ + +#include +#include +#include +#include +#include + +#include +#include + +/* This is arbitrary, If you don't like it, change it */ +#define MAX_INPUTSTREAMS 8 + +struct input_stream { + FILE * fh; + OggVorbis_File vf; + int section; + int length; +}; +static struct input_stream input_streams[MAX_INPUTSTREAMS]; + +jint Java_org_xiph_vorbis_stream_VorbisFileInputStream_create( + JNIEnv* env, + jobject this, + jstring path, + jobject info + ) +{ + int ret; /* Debugging variable */ + jfieldID channels_field, sample_rate_field, length_field; /* JNI field ID */ + jclass cls = (*env)->GetObjectClass(env, info); + int stream_idx; + struct input_stream * iptr; + vorbis_info * vi; + + /* Find an unused input_stream */ + for (stream_idx = 0; stream_idx < MAX_INPUTSTREAMS; stream_idx++) { + if (input_streams[stream_idx].fh == NULL) { + const jbyte * pchars = (*env)->GetStringUTFChars(env, path, NULL); + if (pchars == NULL) { + /* Exception Already thrown */ + return; + } + /* We found one! */ + iptr = &input_streams[stream_idx]; + iptr->fh = fopen(pchars, "r"); + if (iptr->fh == NULL) { + JNU_ThrowByName(env, "java/io/IOException", "Error Creating File Handle", 0); + return; + } + (*env)->ReleaseStringUTFChars(env, path, pchars); + break; + } + } + + if (stream_idx == MAX_INPUTSTREAMS) { + JNU_ThrowByName(env, "java/io/IOException", + "Too Many Vorbis InputStreams", stream_idx); + return; + } + + /* Open the stream */ + ret = ov_open(iptr->fh, &iptr->vf, NULL, 0); + if (ret < 0) { + JNU_ThrowByName(env, "java/io/IOException", + "Vorbis File Corrupt", ret); + fclose(iptr->fh); + iptr->fh = NULL; + return; + } + + channels_field = (*env)->GetFieldID(env, cls, "channels", "I"); + sample_rate_field = (*env)->GetFieldID(env, cls, "sampleRate", "I"); + length_field = (*env)->GetFieldID(env, cls, "length", "J"); + if (channels_field == NULL || sample_rate_field == NULL) { + JNU_ThrowByName(env, "java/lang/Exception", + "Native Field Misnamed", 0); + ov_clear(&iptr->vf); + fclose(iptr->fh); + iptr->fh = NULL; + return; + } + + vi = ov_info(&iptr->vf, -1); + + iptr->section = 0; + iptr->length = ov_pcm_total(&iptr->vf, -1); + + /* Populate basic stream info into the VorbisInfo object. */ + (*env)->SetIntField(env, info, channels_field, vi->channels); + (*env)->SetIntField(env, info, sample_rate_field, vi->rate); + (*env)->SetLongField(env, info, length_field, iptr->length); + + + return stream_idx; +} + +jint Java_org_xiph_vorbis_stream_VorbisFileInputStream_readStreamIdx( + JNIEnv* env, + jobject this, + jint sidx, + jshortArray pcm, + jint offset, + jint length + ) +{ + long ret; + struct input_stream * iptr = &input_streams[sidx]; + + jshort * pcmShorts = (*env)->GetShortArrayElements(env, pcm, NULL); + int maxLength = (*env)->GetArrayLength(env,pcm); + + /* Do the battery of validation checks. */ + if (offset + length > maxLength) { + JNU_ThrowByName(env, "java/lang/ArrayIndexOutOfBoundsException", + "No data was written to the buffer", + offset + length - 1); + return; + } + + if (sidx >= MAX_INPUTSTREAMS || sidx < 0 || iptr->fh == NULL) { + JNU_ThrowByName(env, "java/io/IOException", "Invalid Stream Index", sidx); + return; + } + + if (length > 0) { + ret = ov_read(&iptr->vf, (char *)(pcmShorts + offset), length, 0, 2, 1, &iptr->section); + /* -1 is EOF */ + if (ret == 0) { + ret = -1; + } + else if (ret < 0) { + if (ret == OV_EBADLINK) { + JNU_ThrowByName(env, "java/io/IOException", "Corrupt bitstream section!", iptr->section); + return; + } + } + } + else { + ret = 0; + } + /* Apparently sample rates can change inside the stream... We may need to account for that. */ + + (*env)->ReleaseShortArrayElements(env, pcm, pcmShorts, 0); + return ret >> 1; +} + +jlong Java_org_xiph_vorbis_stream_VorbisFileInputStream_skipStreamIdx( + JNIEnv* env, + jobject this, + jint sidx, + jlong offset + ) +{ + struct input_stream * iptr = &input_streams[sidx]; + long ret; + if (sidx >= MAX_INPUTSTREAMS || sidx < 0 || iptr->fh == NULL) { + JNU_ThrowByName(env, "java/io/IOException", "Invalid Stream Index", sidx); + return; + } + + ret = ov_pcm_seek_lap(&iptr->vf, offset); + + if (ret == OV_EREAD) { + JNU_ThrowByName(env, "java/io/IOException", "Read ERROR", ret); + return; + } + else if (ret != 0){ + JNU_ThrowByName(env, "java/io/IOException", "Vorbis Seek Error code: ", ret); + return; + } + + return ret; + +} + +void Java_org_xiph_vorbis_stream_VorbisFileInputStream_closeStreamIdx( + JNIEnv* env, + jobject this, + jint sidx + ) +{ + struct input_stream * iptr = &input_streams[sidx]; + if (sidx >= MAX_INPUTSTREAMS || sidx < 0 || iptr->fh == NULL) { + JNU_ThrowByName(env, "java/io/IOException", "Invalid Stream Index", sidx); + return; + } + ov_clear(&iptr->vf); + fclose(iptr->fh); + iptr->fh = NULL; +} + + + diff --git a/jni/libvorbis-stream/vorbis-fileoutputstream.c b/jni/libvorbis-stream/vorbis-fileoutputstream.c new file mode 100644 index 0000000..1c02ece --- /dev/null +++ b/jni/libvorbis-stream/vorbis-fileoutputstream.c @@ -0,0 +1,295 @@ +/* Programmer: Nicholas Wertzberger + * + * The Java interface (a la outputstream) for vorbis encoding. This acts + * roughly the way I would expect a Java OutputStream to act. I didn't bother + * trying to SWIG anythign around between the native world and java. In fact, + * I jsut have a statically allocate array to store data in here. + * + * http://svn.xiph.org/trunk/vorbis/examples/encoder_example.c + */ +#include +#include +#include +#include +#include +#include + +#include +#include + +/* I really don't want to figure out what vorbis is storing in their structs. + * Let's just store it all in this here array and call it good. + */ + +/* This is arbitrary, If you don't like it, change it */ +#define MAX_OUTPUTSTREAMS 4 +#define MAX_VORBIS_CHUNKSIZE 1024 + +struct output_stream { + FILE * fh; + vorbis_info vi; + vorbis_comment vc; + vorbis_dsp_state vd; + vorbis_block vb; + ogg_stream_state os; + ogg_page og; + ogg_packet op; + int channels; +}; +static struct output_stream output_streams[MAX_OUTPUTSTREAMS]; + +/* Based on code from: + * http://svn.xiph.org/trunk/vorbis/examples/encoder_example.c + * Returns a pointer to the stream struct related to that current vorbis file. + */ +jint Java_org_xiph_vorbis_stream_VorbisFileOutputStream_create( + JNIEnv* env, + jobject this, + jstring path, + jobject info + ) +{ + /* Configuration structs */ + struct output_stream * optr = NULL; + + /* JNI field ID's */ + jfieldID channels_field, sample_rate_field, quality_field; + jclass cls = (*env)->GetObjectClass(env, info); + + /* packet stream structs */ + ogg_packet header; + ogg_packet header_comm; + ogg_packet header_code; + + int ret; /* Return code storage for function calls */ + int eos = 0; /* End of Stream */ + int stream_idx; + int sample_rate; + float quality; + + /* Find an unused output_stream */ + for (stream_idx = 0; stream_idx < MAX_OUTPUTSTREAMS; stream_idx++) { + if (output_streams[stream_idx].fh == NULL) { + const jbyte * pchars = (*env)->GetStringUTFChars(env, path, NULL); + if (pchars == NULL) { + /* Exception Already thrown */ + return; + } + /* We found one! */ + optr = &output_streams[stream_idx]; + optr->fh = fopen(pchars, "w"); + if (optr->fh == NULL) { + char * message = "Error Creating File Handle. "; + JNU_ThrowByName(env, "java/io/IOException", message, errno); + return; + } + (*env)->ReleaseStringUTFChars(env, path, pchars); + break; + } + } + if (stream_idx == MAX_OUTPUTSTREAMS) { + JNU_ThrowByName(env, "java/io/IOException", + "Too Many Vorbis OutputStreams", stream_idx); + return; + } + + /* Step 1. According to documented workflow. + * http://xiph.org/vorbis/doc/libvorbis/overview.html + */ + vorbis_info_init(&optr->vi); + + /* TODO: make these options passed in. We definitely don't need stereo + * most of the time. + */ + channels_field = (*env)->GetFieldID(env, cls, "channels", "I"); + sample_rate_field = (*env)->GetFieldID(env, cls, "sampleRate", "I"); + quality_field = (*env)->GetFieldID(env, cls, "quality", "F"); + + optr->channels = (*env)->GetIntField(env, info, channels_field); + sample_rate = (*env)->GetIntField(env, info, sample_rate_field); + quality = (*env)->GetFloatField(env, info, quality_field); + + /* TODO: Optimize this for speed more? */ + ret = vorbis_encode_init_vbr(&optr->vi,optr->channels,sample_rate,quality); + + if (ret) { + JNU_ThrowByName(env, "java/io/IOException", "Bad Encoding options", ret); + fclose(optr->fh); + return; + } + + /* Step 2. */ + vorbis_analysis_init(&optr->vd, &optr->vi); + vorbis_block_init(&optr->vd, &optr->vb); + + /* Step 3. */ + vorbis_comment_init(&optr->vc); + + /* A 0 means all is well. */ + srand(time(NULL)); + ogg_stream_init(&optr->os, rand()); + + ret = vorbis_analysis_headerout(&optr->vd, &optr->vc, &header, &header_comm, + &header_code); + + if (ret) { + JNU_ThrowByName(env, "java/io/IOException", "header init error", ret); + ogg_stream_clear(&optr->os); + vorbis_block_clear(&optr->vb); + vorbis_dsp_clear(&optr->vd); + vorbis_comment_clear(&optr->vc); + vorbis_info_clear(&optr->vi); + fclose(optr->fh); + optr->fh = NULL; + return; + } + + ogg_stream_packetin(&optr->os, &header); /* placed in its own page */ + ogg_stream_packetin(&optr->os, &header_comm); + ogg_stream_packetin(&optr->os, &header_code); + + /* This ensures the actual + * audio data will start on a new page, as per spec + */ + while (1) { + int result = ogg_stream_flush(&optr->os, &optr->og); + if (result == 0) + break; + /* TODO: Tie this into the file handle passed in... Or whatever */ + fwrite(optr->og.header, 1, optr->og.header_len, optr->fh); + fwrite(optr->og.body, 1, optr->og.body_len, optr->fh); + } + return stream_idx; +} + +/* Write out to the file handle + * + */ +jint Java_org_xiph_vorbis_stream_VorbisFileOutputStream_writeStreamIdx( + JNIEnv* env, + jobject this, + jint sidx, + jshortArray pcm, + jint offset, + jint length + ) +{ + + jshort * pcmShorts = (*env)->GetShortArrayElements(env, pcm, NULL); + int maxLength = (*env)->GetArrayLength(env,pcm); + struct output_stream * optr = &output_streams[sidx]; + int channels; + int i,j; + int eos = 0; + + if (offset + length > maxLength) { + JNU_ThrowByName(env, "java/lang/ArrayIndexOutOfBoundsException", + "No data was read from the buffer", + offset + length - 1); + return; + } + if (sidx >= MAX_OUTPUTSTREAMS || sidx < 0 || optr->fh == NULL) { + JNU_ThrowByName(env, "java/io/IOException", "Invalid Stream Index", + sidx); + return; + } + + channels = optr->channels; + + while (length > 0) { + /* Data to encode: + * According to this: http://xiph.org/vorbis/doc/libvorbis/vorbis_analysis_buffer.html + * + * A "reasonable" chunk size is 1024. Due to some sampling issues, we + * are going to force this to be the max size. + */ + int chunksize = length; + if (chunksize > MAX_VORBIS_CHUNKSIZE) chunksize = MAX_VORBIS_CHUNKSIZE; + + /* expose the buffer to submit data */ + float ** buffer = vorbis_analysis_buffer(&optr->vd, chunksize); + + /* uninterleave samples */ + for (i = 0; i < chunksize / channels; i++) { + for (j = 0; j < channels; j++) { + buffer[j][i] = pcmShorts[i*channels + j + offset] / 32768.f; + } + } + + /* tell the library how much we actually submitted */ + vorbis_analysis_wrote(&optr->vd, i); + + length -= i*channels; + offset += i*channels; + + /* vorbis does some data preanalysis, then divvies up blocks for + more involved (potentially parallel) processing. Get a single + block for encoding now */ + while (vorbis_analysis_blockout(&optr->vd, &optr->vb) == 1) { + + /* analysis, assume we want to use bitrate management */ + vorbis_analysis(&optr->vb, NULL); + vorbis_bitrate_addblock(&optr->vb); + + while (vorbis_bitrate_flushpacket(&optr->vd, &optr->op)) { + + /* weld the packet into the bitstream */ + ogg_stream_packetin(&optr->os, &optr->op); + + /* write out pages (if any) */ + while (!eos) { + int result = ogg_stream_pageout(&optr->os, &optr->og); + if (result == 0) + break; + fwrite(optr->og.header, 1, optr->og.header_len, optr->fh); + fwrite(optr->og.body, 1, optr->og.body_len, optr->fh); + + /* this could be set above, but for illustrative purposes, I do + it here (to show that vorbis does know where the stream ends) */ + + if (ogg_page_eos(&optr->og)) + eos = 1; + } + } + } + } + (*env)->ReleaseShortArrayElements(env, pcm, pcmShorts, JNI_ABORT); +} +/* + * Clean up stream info. + */ +void Java_org_xiph_vorbis_stream_VorbisFileOutputStream_closeStreamIdx( + JNIEnv* env, + jobject this, + jint sidx + ) +{ + struct output_stream * optr = &output_streams[sidx]; + if (sidx >= MAX_OUTPUTSTREAMS || sidx < 0 || optr->fh == NULL) { + JNU_ThrowByName(env, "java/io/IOException", "Invalid Stream Index", sidx); + return; + } + vorbis_analysis_wrote(&optr->vd, 0); + + while (vorbis_analysis_blockout(&optr->vd, &optr->vb) == 1) { + vorbis_analysis(&optr->vb, NULL); + vorbis_bitrate_addblock(&optr->vb); + while (vorbis_bitrate_flushpacket(&optr->vd, &optr->op)) { + ogg_stream_packetin(&optr->os, &optr->op); + } + } + + while (ogg_stream_pageout(&optr->os, &optr->og) > 0) { + fwrite(optr->og.header, 1, optr->og.header_len, optr->fh); + fwrite(optr->og.body, 1, optr->og.body_len, optr->fh); + } + + ogg_stream_clear(&optr->os); + vorbis_block_clear(&optr->vb); + vorbis_dsp_clear(&optr->vd); + vorbis_comment_clear(&optr->vc); + vorbis_info_clear(&optr->vi); + fclose(optr->fh); + optr->fh = NULL; +} + diff --git a/jni/libvorbis/Android.mk b/jni/libvorbis/Android.mk index 97581bc..c362d46 100644 --- a/jni/libvorbis/Android.mk +++ b/jni/libvorbis/Android.mk @@ -1,7 +1,6 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) - LOCAL_MODULE := libvorbis LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -ffast-math -fsigned-char ifeq ($(TARGET_ARCH),arm) diff --git a/libs/armeabi-v7a/libvorbis-stream.so b/libs/armeabi-v7a/libvorbis-stream.so new file mode 100755 index 0000000000000000000000000000000000000000..eca3c2423888a6eda94255225fba2aa7d13ea695 GIT binary patch literal 17532 zcmdU%dze(!mFV}W2VFF+UC@nU%jf~o;HxPfF&)Eb@enZsT0BJJFsUxO3%bXqtE?^% z{Jf!P8fghVG|-IPiA*07ZZ0v5X^ipaCSp3{E6Hd+X5xH08FQ^VMGc(>wVik)NicnX z>(n{T=~8F>oWJh*T&%tJUVH7e*Is+=wNKY^>upOGX_}^-$E&6*hnhp>oOxD@e~!{s z8Eq3)wHhP!F33_A@Y&$>hqRub|EW>}exZWOl3#I)QWbX=;T#>_xJp@arQHMDB-$s@ zE)bwyK*p6ZmKD;CpbtILE)T59Q#UK+fYaa6Z#n(lKSE&hD>7J2Rp_TfJ5;|T&Zz`d?pwCTH>M^j$J5kGw9jP#na>p^^o$aEehIyzgl;OKA1tB&s)X(>p}z^8t;HwMMeK6|y65Vm z(n9|Xy7O|Seu5(jT_Fx-KcfFtCG_V@=sQa2SP7jjp|_RLkCo8hgMQuCcPje43>~>b zsm16i`dy6Q9K2Fl^+Mkc?L4CIT_yDD61u*G-T>V=RjGPg{@<0fe-HZks{mxnc>lMg z-S5MG)7V6I`yy!P5q<6~p`$K(Jni>G%X+*)S>!(m-F;1Q-^lzsp_9Q&wrKv5|DUgyx&4+Ty!OY$8gcJq5E9)ozQikz0kiI+IeLBBy z)s#hkdr5mIbmMhOEwtMYLZ5WeM_v3nJkONSuRyolgw0q7k#Cl?pMxG?zDw-(0D=Sk=+^kkcU8TveQi%n;t zn`U2F&td3JXqLg6Pq0j>-LCfO(8r+r?e<%t-S%ApU5|d#?Dm!tdOLK7tG%a${s#0> zSNo4j=zoEJ+0{N&Li-6UL$3DAO6cn)@Nm9_ZT)V64nyBy(|1F+K-byyM(88Z(oNQP zH-%#^`Ww)`2#q{J_3rTFCG^wK1NUEOSJ7z0=2&!Hb8D=n`N6nN#?tZ4&1v<;*rr%C zky;?mu^N(TPoJtIHyjv*f_C%y)z59s1f;1@mOO#mDre8 zF3yIQcr4|pQXF+uRbyK+I;z6aV^pPOf?|zJb~4s*Up(F1>K<=h%f_}QweEpbGvZVeQ6s>*6DG9;tpH zl|UtX37uMpUfY~b;Q-NCW20px_mq;c^>N3lQjW$GZKeIJX&3F`G&w^=ErBB7Bh4}M z(^$ZAunQLWWDb8v>xcY3u_0gP(inNc2na8^$;c% zpF&RCea*>Hazv@Nc>KO-ODy>*Q%czR=8)K

**2(??p$ssA|ckFk-}?IR2{QomqC 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%0A9R)Xxyrj;p$9tDJU~TU_NvS9ztYywp`*=qk^1 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 M=$&$&xpVdY7p%>$q5uE@ literal 0 HcmV?d00001 diff --git a/libs/x86/libvorbis-stream.so b/libs/x86/libvorbis-stream.so new file mode 100755 index 0000000000000000000000000000000000000000..0fcea7eddbe53927bb1237efe11cde6459b1bc5d GIT binary patch literal 13544 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 e#^;msWg2qa6YXN#r7UgQ