aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_mod
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_mod')
-rw-r--r--Src/Plugins/Input/in_mod/fir_proc.cpp172
-rw-r--r--Src/Plugins/Input/in_mod/fir_table.h2051
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/in_mod.rc391
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/include/Main.h106
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/include/in2.h1
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/int64.libbin0 -> 11160 bytes
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/mikamp.dsp167
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/mikamp.sln31
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/mikamp.vcproj416
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/playbackconfig.cpp78
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/resource.h149
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/src/Config.c1320
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/src/ExtendedRead.cpp123
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/src/Info.c602
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/src/Main.c1067
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/src/api.h11
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/src/drv_amp.c254
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/src/drv_buffer.cpp176
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/src/drv_buffer.h18
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/src/rf_wrapper.c241
-rw-r--r--Src/Plugins/Input/in_mod/mikamp/version.rc239
21 files changed, 7413 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_mod/fir_proc.cpp b/Src/Plugins/Input/in_mod/fir_proc.cpp
new file mode 100644
index 00000000..f3c520a6
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/fir_proc.cpp
@@ -0,0 +1,172 @@
+/*
+ * This program is free software; you can redistribute it and modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the license or (at your
+ * option) any later version.
+ *
+ * Authors: Markus Fick <webmaster@mark-f.de> fir-resampler, technical information
+ * Chris Moeller <chris@kode54.net> Table/struct file generator
+ *
+*/
+
+#include <math.h>
+#include <stdio.h>
+
+/*
+ ------------------------------------------------------------------------------------------------
+ fir interpolation doc,
+ (derived from "an engineer's guide to fir digital filters", n.j. loy)
+
+ calculate coefficients for ideal lowpass filter (with cutoff = fc in 0..1 (mapped to 0..nyquist))
+ c[-N..N] = (i==0) ? fc : sin(fc*pi*i)/(pi*i)
+
+ then apply selected window to coefficients
+ c[-N..N] *= w(0..N)
+ with n in 2*N and w(n) being a window function (see loy)
+
+ then calculate gain and scale filter coefs to have unity gain.
+ ------------------------------------------------------------------------------------------------
+*/
+// quantizer scale of window coefs
+#define WFIR_QUANTBITS 14
+#define WFIR_QUANTSCALE (1L<<WFIR_QUANTBITS)
+#define WFIR_8SHIFT (WFIR_QUANTBITS-8)
+#define WFIR_16BITSHIFT (WFIR_QUANTBITS)
+// log2(number)-1 of precalculated taps range is [4..12]
+#define WFIR_FRACBITS 10
+#define WFIR_LUTLEN ((1L<<(WFIR_FRACBITS+1))+1)
+// number of samples in window
+#define WFIR_LOG2WIDTH 3
+#define WFIR_WIDTH (1L<<WFIR_LOG2WIDTH)
+#define WFIR_SMPSPERWING ((WFIR_WIDTH-1)>>1)
+// cutoff (1.0 == pi/2)
+#define WFIR_CUTOFF 0.90f
+#define WFIR_CUTOFFBITS 9
+#define WFIR_CUTOFFLEN ((1L<<(WFIR_CUTOFFBITS))+1)
+// wfir type
+#define WFIR_HANN 0
+#define WFIR_HAMMING 1
+#define WFIR_BLACKMANEXACT 2
+#define WFIR_BLACKMAN3T61 3
+#define WFIR_BLACKMAN3T67 4
+#define WFIR_BLACKMAN4T92 5
+#define WFIR_BLACKMAN4T74 6
+#define WFIR_KAISER4T 7
+#define WFIR_TYPE WFIR_BLACKMANEXACT
+// wfir help
+#ifndef M_zPI
+#define M_zPI 3.1415926535897932384626433832795
+#endif
+#define M_zEPS 1e-8
+#define M_zBESSELEPS 1e-21
+
+class CzWINDOWEDFIR
+{ public:
+ CzWINDOWEDFIR( );
+ ~CzWINDOWEDFIR( );
+ float coef( int _PCnr, float _POfs, float _PCut, int _PWidth, int _PType ) //float _PPos, float _PFc, int _PLen )
+ { double _LWidthM1 = _PWidth-1;
+ double _LWidthM1Half = 0.5*_LWidthM1;
+ double _LPosU = ((double)_PCnr - _POfs);
+ double _LPos = _LPosU-_LWidthM1Half;
+ double _LPIdl = 2.0*M_zPI/_LWidthM1;
+ double _LWc,_LSi;
+ if( fabs(_LPos)<M_zEPS )
+ { _LWc = 1.0;
+ _LSi = _PCut;
+ }
+ else
+ { switch( _PType )
+ { case WFIR_HANN:
+ _LWc = 0.50 - 0.50 * cos(_LPIdl*_LPosU);
+ break;
+ case WFIR_HAMMING:
+ _LWc = 0.54 - 0.46 * cos(_LPIdl*_LPosU);
+ break;
+ case WFIR_BLACKMANEXACT:
+ _LWc = 0.42 - 0.50 * cos(_LPIdl*_LPosU) + 0.08 * cos(2.0*_LPIdl*_LPosU);
+ break;
+ case WFIR_BLACKMAN3T61:
+ _LWc = 0.44959 - 0.49364 * cos(_LPIdl*_LPosU) + 0.05677 * cos(2.0*_LPIdl*_LPosU);
+ break;
+ case WFIR_BLACKMAN3T67:
+ _LWc = 0.42323 - 0.49755 * cos(_LPIdl*_LPosU) + 0.07922 * cos(2.0*_LPIdl*_LPosU);
+ break;
+ case WFIR_BLACKMAN4T92:
+ _LWc = 0.35875 - 0.48829 * cos(_LPIdl*_LPosU) + 0.14128 * cos(2.0*_LPIdl*_LPosU) - 0.01168 * cos(3.0*_LPIdl*_LPosU);
+ break;
+ case WFIR_BLACKMAN4T74:
+ _LWc = 0.40217 - 0.49703 * cos(_LPIdl*_LPosU) + 0.09392 * cos(2.0*_LPIdl*_LPosU) - 0.00183 * cos(3.0*_LPIdl*_LPosU);
+ break;
+ case WFIR_KAISER4T:
+ _LWc = 0.40243 - 0.49804 * cos(_LPIdl*_LPosU) + 0.09831 * cos(2.0*_LPIdl*_LPosU) - 0.00122 * cos(3.0*_LPIdl*_LPosU);
+ break;
+ default:
+ _LWc = 1.0;
+ break;
+ }
+ _LPos *= M_zPI;
+ _LSi = sin(_PCut*_LPos)/_LPos;
+ }
+ return (float)(_LWc*_LSi);
+ }
+ static signed short lut[WFIR_LUTLEN*WFIR_WIDTH];
+};
+
+signed short CzWINDOWEDFIR::lut[WFIR_LUTLEN*WFIR_WIDTH];
+
+CzWINDOWEDFIR::CzWINDOWEDFIR()
+{ int _LPcl;
+ float _LPcllen = (float)(1L<<WFIR_FRACBITS); // number of precalculated lines for 0..1 (-1..0)
+ float _LNorm = 1.0f / (float)(2.0f * _LPcllen);
+ float _LCut = WFIR_CUTOFF;
+ float _LScale = (float)WFIR_QUANTSCALE;
+ float _LGain,_LCoefs[WFIR_WIDTH];
+ for( _LPcl=0;_LPcl<WFIR_LUTLEN;_LPcl++ )
+ {
+ float _LOfs = ((float)_LPcl-_LPcllen)*_LNorm;
+ int _LCc,_LIdx = _LPcl<<WFIR_LOG2WIDTH;
+ for( _LCc=0,_LGain=0.0f;_LCc<WFIR_WIDTH;_LCc++ )
+ { _LGain += (_LCoefs[_LCc] = coef( _LCc, _LOfs, _LCut, WFIR_WIDTH, WFIR_TYPE ));
+ }
+ _LGain = 1.0f/_LGain;
+ for( _LCc=0;_LCc<WFIR_WIDTH;_LCc++ )
+ { float _LCoef = (float)floor( 0.5 + _LScale*_LCoefs[_LCc]*_LGain );
+ lut[_LIdx+_LCc] = (signed short)( (_LCoef<-_LScale)?-_LScale:((_LCoef>_LScale)?_LScale:_LCoef) );
+ }
+ }
+}
+
+CzWINDOWEDFIR::~CzWINDOWEDFIR()
+{ // nothing todo
+}
+
+CzWINDOWEDFIR sfir;
+
+// extern "C" signed short *fir_lut = &CzWINDOWEDFIR::lut[0];
+
+#define lut(a) CzWINDOWEDFIR::lut[a]
+
+int main()
+{
+
+ FILE *f;
+ int i;
+
+ f = fopen("fir_table.h","w");
+
+ fprintf(f,"static __int64 fir_lut[%d] = {\n",WFIR_LUTLEN * 2);
+
+ for (i=0;i<(WFIR_LUTLEN*WFIR_WIDTH);i+=WFIR_WIDTH)
+ {
+ fprintf(f,"\t0x%.4hx%.4hx%.4hx%.4hx, 0x%.4hx%.4hx%.4hx%.4hx%s",
+ lut(i+3), lut(i+2), lut(i+1), lut(i),
+ lut(i+7), lut(i+6), lut(i+5), lut(i+4),
+ (i<((WFIR_LUTLEN-1)*WFIR_WIDTH)) ? ",\n" : "\n};\n");
+ }
+
+ fclose(f);
+
+ return(0);
+}
+
diff --git a/Src/Plugins/Input/in_mod/fir_table.h b/Src/Plugins/Input/in_mod/fir_table.h
new file mode 100644
index 00000000..a4ec05eb
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/fir_table.h
@@ -0,0 +1,2051 @@
+static __int64 fir_lut[4098] = {
+ 0x39b70481fe95001b, 0xffe8001bfe950481,
+ 0x39b7047bfe96001b, 0xffe8001bfe930487,
+ 0x39b70475fe97001b, 0xffe8001cfe92048d,
+ 0x39b6046ffe98001b, 0xffe8001cfe910492,
+ 0x39b60469fe99001b, 0xffe8001cfe900498,
+ 0x39b60464fe9a001b, 0xffe8001cfe8f049e,
+ 0x39b6045efe9b001b, 0xffe8001cfe8e04a4,
+ 0x39b60458fe9c001b, 0xffe8001cfe8d04aa,
+ 0x39b60452fe9d001b, 0xffe8001cfe8c04b0,
+ 0x39b6044cfe9e001b, 0xffe8001cfe8b04b6,
+ 0x39b60447fe9f001a, 0xffe8001cfe8a04bc,
+ 0x39b60441fea0001a, 0xffe8001cfe8904c2,
+ 0x39b5043bfea1001a, 0xffe8001cfe8804c7,
+ 0x39b50435fea2001a, 0xffe8001cfe8704cd,
+ 0x39b50430fea3001a, 0xffe8001dfe8604d3,
+ 0x39b5042afea4001a, 0xffe8001dfe8504d9,
+ 0x39b50424fea5001a, 0xffe8001dfe8304df,
+ 0x39b4041efea6001a, 0xffe9001dfe8204e5,
+ 0x39b40419fea7001a, 0xffe9001dfe8104eb,
+ 0x39b40413fea9001a, 0xffe9001dfe8004f1,
+ 0x39b4040dfeaa001a, 0xffe9001dfe7f04f7,
+ 0x39b30407feab001a, 0xffe9001dfe7e04fd,
+ 0x39b30402feac0019, 0xffe9001dfe7d0503,
+ 0x39b303fcfead0019, 0xffe9001dfe7c0509,
+ 0x39b203f6feae0019, 0xffe9001efe7b050f,
+ 0x39b203f1feaf0019, 0xffe9001efe7a0515,
+ 0x39b203ebfeb00019, 0xffe9001efe79051b,
+ 0x39b103e5feb10019, 0xffe9001efe780521,
+ 0x39b103e0feb20019, 0xffe9001efe760527,
+ 0x39b103dafeb30019, 0xffe9001efe75052d,
+ 0x39b003d4feb40019, 0xffe9001efe740533,
+ 0x39b003cffeb50019, 0xffe9001efe730539,
+ 0x39b003c9feb60019, 0xffe9001efe72053f,
+ 0x39af03c3feb70018, 0xffe9001efe710545,
+ 0x39af03befeb80018, 0xffe9001efe70054b,
+ 0x39ae03b8feb90018, 0xffe9001ffe6f0552,
+ 0x39ae03b3feba0018, 0xffe9001ffe6e0558,
+ 0x39ad03adfebb0018, 0xffe9001ffe6d055e,
+ 0x39ad03a7febc0018, 0xffe9001ffe6c0564,
+ 0x39ac03a2febd0018, 0xffe9001ffe6a056a,
+ 0x39ac039cfebe0018, 0xffe9001ffe690570,
+ 0x39ab0397febf0018, 0xffe9001ffe680576,
+ 0x39ab0391fec00018, 0xffe9001ffe67057c,
+ 0x39aa038cfec10018, 0xffe9001ffe660582,
+ 0x39aa0386fec20018, 0xffea001ffe650589,
+ 0x39a90380fec30018, 0xffea001ffe64058f,
+ 0x39a9037bfec40017, 0xffea0020fe630595,
+ 0x39a80375fec50017, 0xffea0020fe62059b,
+ 0x39a80370fec60017, 0xffea0020fe6105a1,
+ 0x39a7036afec70017, 0xffea0020fe5f05a7,
+ 0x39a60365fec80017, 0xffea0020fe5e05ad,
+ 0x39a6035ffec90017, 0xffea0020fe5d05b4,
+ 0x39a5035afeca0017, 0xffea0020fe5c05ba,
+ 0x39a40354fecb0017, 0xffea0020fe5b05c0,
+ 0x39a4034ffecc0017, 0xffea0020fe5a05c6,
+ 0x39a30349fecd0017, 0xffea0020fe5905cc,
+ 0x39a20344fece0017, 0xffea0021fe5805d3,
+ 0x39a2033efecf0017, 0xffea0021fe5705d9,
+ 0x39a10339fed00016, 0xffea0021fe5505df,
+ 0x39a00333fed10016, 0xffea0021fe5405e5,
+ 0x399f032efed20016, 0xffea0021fe5305ec,
+ 0x399f0329fed30016, 0xffea0021fe5205f2,
+ 0x399e0323fed40016, 0xffea0021fe5105f8,
+ 0x399d031efed50016, 0xffea0021fe5005fe,
+ 0x399c0318fed60016, 0xffea0021fe4f0605,
+ 0x399c0313fed70016, 0xffea0021fe4e060b,
+ 0x399b030efed80016, 0xffea0022fe4c0611,
+ 0x399a0308fed90016, 0xffea0022fe4b0617,
+ 0x39990303feda0016, 0xffea0022fe4a061e,
+ 0x399802fdfedb0016, 0xffea0022fe490624,
+ 0x399802f8fedc0016, 0xffeb0022fe48062a,
+ 0x399702f3fedd0015, 0xffeb0022fe470631,
+ 0x399602edfede0015, 0xffeb0022fe460637,
+ 0x399502e8fedf0015, 0xffeb0022fe45063d,
+ 0x399402e3fee00015, 0xffeb0022fe430644,
+ 0x399302ddfee10015, 0xffeb0022fe42064a,
+ 0x399202d8fee20015, 0xffeb0023fe410650,
+ 0x399102d3fee30015, 0xffeb0023fe400657,
+ 0x399002cdfee40015, 0xffeb0023fe3f065d,
+ 0x398f02c8fee50015, 0xffeb0023fe3e0663,
+ 0x398e02c3fee60015, 0xffeb0023fe3d066a,
+ 0x398d02bdfee70015, 0xffeb0023fe3c0670,
+ 0x398c02b8fee80015, 0xffeb0023fe3a0676,
+ 0x398b02b3fee90015, 0xffeb0023fe39067d,
+ 0x398a02adfeea0014, 0xffeb0023fe380683,
+ 0x398902a8feeb0014, 0xffeb0023fe37068a,
+ 0x398802a3feec0014, 0xffeb0024fe360690,
+ 0x3987029efeed0014, 0xffeb0024fe350696,
+ 0x39860298feee0014, 0xffeb0024fe34069d,
+ 0x39850293feef0014, 0xffeb0024fe3206a3,
+ 0x3984028efef00014, 0xffeb0024fe3106aa,
+ 0x39830289fef10014, 0xffeb0024fe3006b0,
+ 0x39820283fef20014, 0xffeb0024fe2f06b7,
+ 0x3981027efef30014, 0xffeb0024fe2e06bd,
+ 0x39800279fef40014, 0xffeb0024fe2d06c3,
+ 0x397e0274fef50014, 0xffeb0024fe2c06ca,
+ 0x397d026ffef60014, 0xffec0025fe2a06d0,
+ 0x397c0269fef70013, 0xffec0025fe2906d7,
+ 0x397b0264fef70013, 0xffec0025fe2806dd,
+ 0x397a025ffef80013, 0xffec0025fe2706e4,
+ 0x3979025afef90013, 0xffec0025fe2606ea,
+ 0x39770255fefa0013, 0xffec0025fe2506f1,
+ 0x39760250fefb0013, 0xffec0025fe2406f7,
+ 0x3975024afefc0013, 0xffec0025fe2206fe,
+ 0x39740245fefd0013, 0xffec0025fe210704,
+ 0x39720240fefe0013, 0xffec0025fe20070b,
+ 0x3971023bfeff0013, 0xffec0026fe1f0711,
+ 0x39700236ff000013, 0xffec0026fe1e0718,
+ 0x396f0231ff010013, 0xffec0026fe1d071f,
+ 0x396d022cff020013, 0xffec0026fe1b0725,
+ 0x396c0227ff030013, 0xffec0026fe1a072c,
+ 0x396b0222ff040012, 0xffec0026fe190732,
+ 0x3969021cff050012, 0xffec0026fe180739,
+ 0x39680217ff060012, 0xffec0026fe17073f,
+ 0x39670212ff070012, 0xffec0026fe160746,
+ 0x3965020dff080012, 0xffec0027fe14074d,
+ 0x39640208ff080012, 0xffec0027fe130753,
+ 0x39620203ff090012, 0xffec0027fe12075a,
+ 0x396101feff0a0012, 0xffec0027fe110760,
+ 0x396001f9ff0b0012, 0xffec0027fe100767,
+ 0x395e01f4ff0c0012, 0xffec0027fe0f076e,
+ 0x395d01efff0d0012, 0xffed0027fe0d0774,
+ 0x395b01eaff0e0012, 0xffed0027fe0c077b,
+ 0x395a01e5ff0f0012, 0xffed0027fe0b0782,
+ 0x395801e0ff100012, 0xffed0027fe0a0788,
+ 0x395701dbff110011, 0xffed0028fe09078f,
+ 0x395501d6ff120011, 0xffed0028fe080795,
+ 0x395401d1ff130011, 0xffed0028fe06079c,
+ 0x395201ccff140011, 0xffed0028fe0507a3,
+ 0x395101c7ff150011, 0xffed0028fe0407a9,
+ 0x394f01c2ff150011, 0xffed0028fe0307b0,
+ 0x394e01bdff160011, 0xffed0028fe0207b7,
+ 0x394c01b8ff170011, 0xffed0028fe0107be,
+ 0x394a01b3ff180011, 0xffed0028fdff07c4,
+ 0x394901aeff190011, 0xffed0029fdfe07cb,
+ 0x394701a9ff1a0011, 0xffed0029fdfd07d2,
+ 0x394601a4ff1b0011, 0xffed0029fdfc07d8,
+ 0x394401a0ff1c0011, 0xffed0029fdfb07df,
+ 0x3942019bff1d0011, 0xffed0029fdf907e6,
+ 0x39410196ff1e0011, 0xffed0029fdf807ed,
+ 0x393f0191ff1f0010, 0xffed0029fdf707f3,
+ 0x393d018cff200010, 0xffed0029fdf607fa,
+ 0x393c0187ff200010, 0xffed0029fdf50801,
+ 0x393a0182ff210010, 0xffed002afdf40808,
+ 0x3938017dff220010, 0xffed002afdf2080e,
+ 0x39370179ff230010, 0xffed002afdf10815,
+ 0x39350174ff240010, 0xffed002afdf0081c,
+ 0x3933016fff250010, 0xffee002afdef0823,
+ 0x3931016aff260010, 0xffee002afdee082a,
+ 0x39300165ff270010, 0xffee002afdec0830,
+ 0x392e0160ff280010, 0xffee002afdeb0837,
+ 0x392c015cff290010, 0xffee002afdea083e,
+ 0x392a0157ff290010, 0xffee002bfde90845,
+ 0x39280152ff2a0010, 0xffee002bfde8084c,
+ 0x3927014dff2b0010, 0xffee002bfde60852,
+ 0x39250148ff2c0010, 0xffee002bfde50859,
+ 0x39230144ff2d000f, 0xffee002bfde40860,
+ 0x3921013fff2e000f, 0xffee002bfde30867,
+ 0x391f013aff2f000f, 0xffee002bfde2086e,
+ 0x391d0135ff30000f, 0xffee002bfde10875,
+ 0x391b0131ff31000f, 0xffee002bfddf087c,
+ 0x391a012cff31000f, 0xffee002cfdde0882,
+ 0x39180127ff32000f, 0xffee002cfddd0889,
+ 0x39160122ff33000f, 0xffee002cfddc0890,
+ 0x3914011eff34000f, 0xffee002cfddb0897,
+ 0x39120119ff35000f, 0xffee002cfdd9089e,
+ 0x39100114ff36000f, 0xffee002cfdd808a5,
+ 0x390e0110ff37000f, 0xffee002cfdd708ac,
+ 0x390c010bff38000f, 0xffee002cfdd608b3,
+ 0x390a0106ff38000f, 0xffee002cfdd508ba,
+ 0x39080101ff39000f, 0xffee002dfdd308c1,
+ 0x390600fdff3a000f, 0xffee002dfdd208c7,
+ 0x390400f8ff3b000e, 0xffee002dfdd108ce,
+ 0x390200f3ff3c000e, 0xffef002dfdd008d5,
+ 0x390000efff3d000e, 0xffef002dfdce08dc,
+ 0x38fe00eaff3e000e, 0xffef002dfdcd08e3,
+ 0x38fc00e6ff3e000e, 0xffef002dfdcc08ea,
+ 0x38f900e1ff3f000e, 0xffef002dfdcb08f1,
+ 0x38f700dcff40000e, 0xffef002dfdca08f8,
+ 0x38f500d8ff41000e, 0xffef002efdc808ff,
+ 0x38f300d3ff42000e, 0xffef002efdc70906,
+ 0x38f100ceff43000e, 0xffef002efdc6090d,
+ 0x38ef00caff44000e, 0xffef002efdc50914,
+ 0x38ed00c5ff44000e, 0xffef002efdc4091b,
+ 0x38eb00c1ff45000e, 0xffef002efdc20922,
+ 0x38e800bcff46000e, 0xffef002efdc10929,
+ 0x38e600b8ff47000e, 0xffef002efdc00930,
+ 0x38e400b3ff48000e, 0xffef002ffdbf0937,
+ 0x38e200aeff49000d, 0xffef002ffdbe093e,
+ 0x38e000aaff4a000d, 0xffef002ffdbc0945,
+ 0x38dd00a5ff4a000d, 0xffef002ffdbb094c,
+ 0x38db00a1ff4b000d, 0xffef002ffdba0953,
+ 0x38d9009cff4c000d, 0xffef002ffdb9095a,
+ 0x38d70098ff4d000d, 0xffef002ffdb70962,
+ 0x38d40093ff4e000d, 0xffef002ffdb60969,
+ 0x38d2008fff4f000d, 0xffef002ffdb50970,
+ 0x38d0008aff50000d, 0xffef0030fdb40977,
+ 0x38cd0086ff50000d, 0xffef0030fdb3097e,
+ 0x38cb0081ff51000d, 0xfff00030fdb10985,
+ 0x38c9007dff52000d, 0xfff00030fdb0098c,
+ 0x38c60078ff53000d, 0xfff00030fdaf0993,
+ 0x38c40074ff54000d, 0xfff00030fdae099a,
+ 0x38c2006fff55000d, 0xfff00030fdac09a1,
+ 0x38bf006bff55000d, 0xfff00030fdab09a8,
+ 0x38bd0067ff56000d, 0xfff00031fdaa09b0,
+ 0x38ba0062ff57000d, 0xfff00031fda909b7,
+ 0x38b8005eff58000c, 0xfff00031fda809be,
+ 0x38b60059ff59000c, 0xfff00031fda609c5,
+ 0x38b30055ff5a000c, 0xfff00031fda509cc,
+ 0x38b10050ff5a000c, 0xfff00031fda409d3,
+ 0x38ae004cff5b000c, 0xfff00031fda309da,
+ 0x38ac0048ff5c000c, 0xfff00031fda109e2,
+ 0x38a90043ff5d000c, 0xfff00031fda009e9,
+ 0x38a7003fff5e000c, 0xfff00032fd9f09f0,
+ 0x38a4003bff5e000c, 0xfff00032fd9e09f7,
+ 0x38a20036ff5f000c, 0xfff00032fd9d09fe,
+ 0x389f0032ff60000c, 0xfff00032fd9b0a06,
+ 0x389d002dff61000c, 0xfff00032fd9a0a0d,
+ 0x389a0029ff62000c, 0xfff00032fd990a14,
+ 0x38980025ff63000c, 0xfff00032fd980a1b,
+ 0x38950020ff63000c, 0xfff00032fd960a22,
+ 0x3892001cff64000c, 0xfff00033fd950a2a,
+ 0x38900018ff65000c, 0xfff00033fd940a31,
+ 0x388d0014ff66000c, 0xfff00033fd930a38,
+ 0x388b000fff67000b, 0xfff10033fd910a3f,
+ 0x3888000bff67000b, 0xfff10033fd900a47,
+ 0x38850007ff68000b, 0xfff10033fd8f0a4e,
+ 0x38830002ff69000b, 0xfff10033fd8e0a55,
+ 0x3880fffeff6a000b, 0xfff10033fd8c0a5c,
+ 0x387dfffaff6b000b, 0xfff10033fd8b0a64,
+ 0x387bfff6ff6b000b, 0xfff10034fd8a0a6b,
+ 0x3878fff1ff6c000b, 0xfff10034fd890a72,
+ 0x3875ffedff6d000b, 0xfff10034fd880a79,
+ 0x3872ffe9ff6e000b, 0xfff10034fd860a81,
+ 0x3870ffe5ff6f000b, 0xfff10034fd850a88,
+ 0x386dffe0ff6f000b, 0xfff10034fd840a8f,
+ 0x386affdcff70000b, 0xfff10034fd830a97,
+ 0x3867ffd8ff71000b, 0xfff10034fd810a9e,
+ 0x3865ffd4ff72000b, 0xfff10035fd800aa5,
+ 0x3862ffd0ff73000b, 0xfff10035fd7f0aad,
+ 0x385fffcbff73000b, 0xfff10035fd7e0ab4,
+ 0x385cffc7ff74000b, 0xfff10035fd7c0abb,
+ 0x385affc3ff75000b, 0xfff10035fd7b0ac3,
+ 0x3857ffbfff76000a, 0xfff10035fd7a0aca,
+ 0x3854ffbbff76000a, 0xfff10035fd790ad1,
+ 0x3851ffb7ff77000a, 0xfff10035fd770ad9,
+ 0x384effb2ff78000a, 0xfff10036fd760ae0,
+ 0x384bffaeff79000a, 0xfff10036fd750ae7,
+ 0x3848ffaaff7a000a, 0xfff10036fd740aef,
+ 0x3845ffa6ff7a000a, 0xfff10036fd720af6,
+ 0x3843ffa2ff7b000a, 0xfff10036fd710afe,
+ 0x3840ff9eff7c000a, 0xfff20036fd700b05,
+ 0x383dff9aff7d000a, 0xfff20036fd6f0b0c,
+ 0x383aff96ff7d000a, 0xfff20036fd6d0b14,
+ 0x3837ff91ff7e000a, 0xfff20037fd6c0b1b,
+ 0x3834ff8dff7f000a, 0xfff20037fd6b0b23,
+ 0x3831ff89ff80000a, 0xfff20037fd6a0b2a,
+ 0x382eff85ff80000a, 0xfff20037fd680b32,
+ 0x382bff81ff81000a, 0xfff20037fd670b39,
+ 0x3828ff7dff82000a, 0xfff20037fd660b40,
+ 0x3825ff79ff83000a, 0xfff20037fd650b48,
+ 0x3822ff75ff84000a, 0xfff20037fd630b4f,
+ 0x381fff71ff84000a, 0xfff20038fd620b57,
+ 0x381cff6dff85000a, 0xfff20038fd610b5e,
+ 0x3819ff69ff860009, 0xfff20038fd600b66,
+ 0x3816ff65ff870009, 0xfff20038fd5e0b6d,
+ 0x3813ff61ff870009, 0xfff20038fd5d0b75,
+ 0x380fff5dff880009, 0xfff20038fd5c0b7c,
+ 0x380cff59ff890009, 0xfff20038fd5b0b84,
+ 0x3809ff55ff8a0009, 0xfff20038fd590b8b,
+ 0x3806ff51ff8a0009, 0xfff20039fd580b93,
+ 0x3803ff4dff8b0009, 0xfff20039fd570b9a,
+ 0x3800ff49ff8c0009, 0xfff20039fd560ba2,
+ 0x37fdff45ff8d0009, 0xfff20039fd540ba9,
+ 0x37f9ff41ff8d0009, 0xfff20039fd530bb1,
+ 0x37f6ff3dff8e0009, 0xfff20039fd520bb8,
+ 0x37f3ff39ff8f0009, 0xfff20039fd510bc0,
+ 0x37f0ff35ff900009, 0xfff30039fd4f0bc7,
+ 0x37edff31ff900009, 0xfff3003afd4e0bcf,
+ 0x37e9ff2dff910009, 0xfff3003afd4d0bd6,
+ 0x37e6ff2aff920009, 0xfff3003afd4c0bde,
+ 0x37e3ff26ff920009, 0xfff3003afd4a0be5,
+ 0x37e0ff22ff930009, 0xfff3003afd490bed,
+ 0x37dcff1eff940009, 0xfff3003afd480bf4,
+ 0x37d9ff1aff950009, 0xfff3003afd470bfc,
+ 0x37d6ff16ff950008, 0xfff3003afd450c04,
+ 0x37d3ff12ff960008, 0xfff3003bfd440c0b,
+ 0x37cfff0eff970008, 0xfff3003bfd430c13,
+ 0x37ccff0bff980008, 0xfff3003bfd410c1a,
+ 0x37c9ff07ff980008, 0xfff3003bfd400c22,
+ 0x37c5ff03ff990008, 0xfff3003bfd3f0c2a,
+ 0x37c2feffff9a0008, 0xfff3003bfd3e0c31,
+ 0x37befefbff9b0008, 0xfff3003bfd3c0c39,
+ 0x37bbfef7ff9b0008, 0xfff3003bfd3b0c40,
+ 0x37b8fef4ff9c0008, 0xfff3003cfd3a0c48,
+ 0x37b4fef0ff9d0008, 0xfff3003cfd390c50,
+ 0x37b1feecff9d0008, 0xfff3003cfd370c57,
+ 0x37adfee8ff9e0008, 0xfff3003cfd360c5f,
+ 0x37aafee4ff9f0008, 0xfff3003cfd350c67,
+ 0x37a7fee1ffa00008, 0xfff3003cfd340c6e,
+ 0x37a3feddffa00008, 0xfff3003cfd320c76,
+ 0x37a0fed9ffa10008, 0xfff3003cfd310c7e,
+ 0x379cfed5ffa20008, 0xfff3003dfd300c85,
+ 0x3799fed2ffa20008, 0xfff3003dfd2f0c8d,
+ 0x3795feceffa30008, 0xfff3003dfd2d0c95,
+ 0x3792fecaffa40008, 0xfff4003dfd2c0c9c,
+ 0x378efec6ffa50008, 0xfff4003dfd2b0ca4,
+ 0x378bfec3ffa50008, 0xfff4003dfd290cac,
+ 0x3787febfffa60008, 0xfff4003dfd280cb3,
+ 0x3784febbffa70007, 0xfff4003efd270cbb,
+ 0x3780feb7ffa70007, 0xfff4003efd260cc3,
+ 0x377cfeb4ffa80007, 0xfff4003efd240cca,
+ 0x3779feb0ffa90007, 0xfff4003efd230cd2,
+ 0x3775feacffa90007, 0xfff4003efd220cda,
+ 0x3772fea9ffaa0007, 0xfff4003efd210ce2,
+ 0x376efea5ffab0007, 0xfff4003efd1f0ce9,
+ 0x376afea1ffab0007, 0xfff4003efd1e0cf1,
+ 0x3767fe9effac0007, 0xfff4003ffd1d0cf9,
+ 0x3763fe9affad0007, 0xfff4003ffd1c0d01,
+ 0x375ffe96ffae0007, 0xfff4003ffd1a0d08,
+ 0x375cfe93ffae0007, 0xfff4003ffd190d10,
+ 0x3758fe8fffaf0007, 0xfff4003ffd180d18,
+ 0x3754fe8cffb00007, 0xfff4003ffd160d20,
+ 0x3751fe88ffb00007, 0xfff4003ffd150d27,
+ 0x374dfe84ffb10007, 0xfff4003ffd140d2f,
+ 0x3749fe81ffb20007, 0xfff40040fd130d37,
+ 0x3746fe7dffb20007, 0xfff40040fd110d3f,
+ 0x3742fe7affb30007, 0xfff40040fd100d47,
+ 0x373efe76ffb40007, 0xfff40040fd0f0d4e,
+ 0x373afe72ffb40007, 0xfff40040fd0e0d56,
+ 0x3737fe6fffb50007, 0xfff40040fd0c0d5e,
+ 0x3733fe6bffb60007, 0xfff40040fd0b0d66,
+ 0x372ffe68ffb60007, 0xfff40040fd0a0d6e,
+ 0x372bfe64ffb70007, 0xfff50041fd080d75,
+ 0x3727fe61ffb80006, 0xfff50041fd070d7d,
+ 0x3724fe5dffb80006, 0xfff50041fd060d85,
+ 0x3720fe5affb90006, 0xfff50041fd050d8d,
+ 0x371cfe56ffba0006, 0xfff50041fd030d95,
+ 0x3718fe53ffba0006, 0xfff50041fd020d9d,
+ 0x3714fe4fffbb0006, 0xfff50041fd010da4,
+ 0x3710fe4cffbc0006, 0xfff50042fd000dac,
+ 0x370cfe48ffbc0006, 0xfff50042fcfe0db4,
+ 0x3708fe45ffbd0006, 0xfff50042fcfd0dbc,
+ 0x3705fe41ffbe0006, 0xfff50042fcfc0dc4,
+ 0x3701fe3effbe0006, 0xfff50042fcfa0dcc,
+ 0x36fdfe3affbf0006, 0xfff50042fcf90dd4,
+ 0x36f9fe37ffc00006, 0xfff50042fcf80ddb,
+ 0x36f5fe33ffc00006, 0xfff50042fcf70de3,
+ 0x36f1fe30ffc10006, 0xfff50043fcf50deb,
+ 0x36edfe2cffc20006, 0xfff50043fcf40df3,
+ 0x36e9fe29ffc20006, 0xfff50043fcf30dfb,
+ 0x36e5fe26ffc30006, 0xfff50043fcf20e03,
+ 0x36e1fe22ffc40006, 0xfff50043fcf00e0b,
+ 0x36ddfe1fffc40006, 0xfff50043fcef0e13,
+ 0x36d9fe1bffc50006, 0xfff50043fcee0e1b,
+ 0x36d5fe18ffc60006, 0xfff50044fcec0e23,
+ 0x36d1fe15ffc60006, 0xfff50044fceb0e2b,
+ 0x36cdfe11ffc70006, 0xfff50044fcea0e33,
+ 0x36c9fe0effc70006, 0xfff50044fce90e3a,
+ 0x36c4fe0bffc80006, 0xfff50044fce70e42,
+ 0x36c0fe07ffc90006, 0xfff50044fce60e4a,
+ 0x36bcfe04ffc90006, 0xfff50044fce50e52,
+ 0x36b8fe00ffca0005, 0xfff60044fce40e5a,
+ 0x36b4fdfdffcb0005, 0xfff60045fce20e62,
+ 0x36b0fdfaffcb0005, 0xfff60045fce10e6a,
+ 0x36acfdf6ffcc0005, 0xfff60045fce00e72,
+ 0x36a8fdf3ffcd0005, 0xfff60045fcde0e7a,
+ 0x36a3fdf0ffcd0005, 0xfff60045fcdd0e82,
+ 0x369ffdedffce0005, 0xfff60045fcdc0e8a,
+ 0x369bfde9ffce0005, 0xfff60045fcdb0e92,
+ 0x3697fde6ffcf0005, 0xfff60046fcd90e9a,
+ 0x3693fde3ffd00005, 0xfff60046fcd80ea2,
+ 0x368ffddfffd00005, 0xfff60046fcd70eaa,
+ 0x368afddcffd10005, 0xfff60046fcd60eb2,
+ 0x3686fdd9ffd20005, 0xfff60046fcd40eba,
+ 0x3682fdd6ffd20005, 0xfff60046fcd30ec2,
+ 0x367efdd2ffd30005, 0xfff60046fcd20eca,
+ 0x3679fdcfffd30005, 0xfff60046fcd00ed2,
+ 0x3675fdccffd40005, 0xfff60047fccf0eda,
+ 0x3671fdc9ffd50005, 0xfff60047fcce0ee2,
+ 0x366cfdc5ffd50005, 0xfff60047fccd0eea,
+ 0x3668fdc2ffd60005, 0xfff60047fccb0ef2,
+ 0x3664fdbfffd70005, 0xfff60047fcca0efa,
+ 0x3660fdbcffd70005, 0xfff60047fcc90f03,
+ 0x365bfdb9ffd80005, 0xfff60047fcc70f0b,
+ 0x3657fdb5ffd80005, 0xfff60048fcc60f13,
+ 0x3652fdb2ffd90005, 0xfff60048fcc50f1b,
+ 0x364efdafffda0005, 0xfff60048fcc40f23,
+ 0x364afdacffda0005, 0xfff60048fcc20f2b,
+ 0x3645fda9ffdb0005, 0xfff60048fcc10f33,
+ 0x3641fda6ffdb0005, 0xfff60048fcc00f3b,
+ 0x363dfda2ffdc0005, 0xfff60048fcbf0f43,
+ 0x3638fd9fffdd0005, 0xfff70048fcbd0f4b,
+ 0x3634fd9cffdd0005, 0xfff70049fcbc0f53,
+ 0x362ffd99ffde0004, 0xfff70049fcbb0f5b,
+ 0x362bfd96ffde0004, 0xfff70049fcb90f64,
+ 0x3626fd93ffdf0004, 0xfff70049fcb80f6c,
+ 0x3622fd90ffe00004, 0xfff70049fcb70f74,
+ 0x361dfd8dffe00004, 0xfff70049fcb60f7c,
+ 0x3619fd89ffe10004, 0xfff70049fcb40f84,
+ 0x3614fd86ffe10004, 0xfff7004afcb30f8c,
+ 0x3610fd83ffe20004, 0xfff7004afcb20f94,
+ 0x360bfd80ffe30004, 0xfff7004afcb10f9c,
+ 0x3607fd7dffe30004, 0xfff7004afcaf0fa5,
+ 0x3602fd7affe40004, 0xfff7004afcae0fad,
+ 0x35fefd77ffe40004, 0xfff7004afcad0fb5,
+ 0x35f9fd74ffe50004, 0xfff7004afcab0fbd,
+ 0x35f5fd71ffe50004, 0xfff7004afcaa0fc5,
+ 0x35f0fd6effe60004, 0xfff7004bfca90fcd,
+ 0x35ebfd6bffe70004, 0xfff7004bfca80fd6,
+ 0x35e7fd68ffe70004, 0xfff7004bfca60fde,
+ 0x35e2fd65ffe80004, 0xfff7004bfca50fe6,
+ 0x35defd62ffe80004, 0xfff7004bfca40fee,
+ 0x35d9fd5fffe90004, 0xfff7004bfca30ff6,
+ 0x35d4fd5cffe90004, 0xfff7004bfca10ffe,
+ 0x35d0fd59ffea0004, 0xfff7004cfca01007,
+ 0x35cbfd56ffeb0004, 0xfff7004cfc9f100f,
+ 0x35c6fd53ffeb0004, 0xfff7004cfc9d1017,
+ 0x35c2fd50ffec0004, 0xfff7004cfc9c101f,
+ 0x35bdfd4dffec0004, 0xfff7004cfc9b1028,
+ 0x35b8fd4affed0004, 0xfff7004cfc9a1030,
+ 0x35b4fd47ffed0004, 0xfff7004cfc981038,
+ 0x35affd44ffee0004, 0xfff7004cfc971040,
+ 0x35aafd41ffef0004, 0xfff8004dfc961048,
+ 0x35a5fd3effef0004, 0xfff8004dfc951051,
+ 0x35a1fd3bfff00004, 0xfff8004dfc931059,
+ 0x359cfd38fff00004, 0xfff8004dfc921061,
+ 0x3597fd35fff10004, 0xfff8004dfc911069,
+ 0x3592fd33fff10004, 0xfff8004dfc901072,
+ 0x358efd30fff20003, 0xfff8004dfc8e107a,
+ 0x3589fd2dfff20003, 0xfff8004efc8d1082,
+ 0x3584fd2afff30003, 0xfff8004efc8c108a,
+ 0x357ffd27fff40003, 0xfff8004efc8a1093,
+ 0x357afd24fff40003, 0xfff8004efc89109b,
+ 0x3576fd21fff50003, 0xfff8004efc8810a3,
+ 0x3571fd1efff50003, 0xfff8004efc8710ab,
+ 0x356cfd1cfff60003, 0xfff8004efc8510b4,
+ 0x3567fd19fff60003, 0xfff8004ffc8410bc,
+ 0x3562fd16fff70003, 0xfff8004ffc8310c4,
+ 0x355dfd13fff70003, 0xfff8004ffc8210cd,
+ 0x3558fd10fff80003, 0xfff8004ffc8010d5,
+ 0x3553fd0dfff80003, 0xfff8004ffc7f10dd,
+ 0x354ffd0bfff90003, 0xfff8004ffc7e10e6,
+ 0x354afd08fffa0003, 0xfff8004ffc7d10ee,
+ 0x3545fd05fffa0003, 0xfff8004ffc7b10f6,
+ 0x3540fd02fffb0003, 0xfff80050fc7a10fe,
+ 0x353bfcfffffb0003, 0xfff80050fc791107,
+ 0x3536fcfdfffc0003, 0xfff80050fc77110f,
+ 0x3531fcfafffc0003, 0xfff80050fc761117,
+ 0x352cfcf7fffd0003, 0xfff80050fc751120,
+ 0x3527fcf4fffd0003, 0xfff80050fc741128,
+ 0x3522fcf2fffe0003, 0xfff80050fc721130,
+ 0x351dfceffffe0003, 0xfff80051fc711139,
+ 0x3518fcecffff0003, 0xfff80051fc701141,
+ 0x3513fce9ffff0003, 0xfff80051fc6f114a,
+ 0x350efce700000003, 0xfff80051fc6d1152,
+ 0x3509fce400000003, 0xfff90051fc6c115a,
+ 0x3504fce100010003, 0xfff90051fc6b1163,
+ 0x34fffcdf00020003, 0xfff90051fc6a116b,
+ 0x34fafcdc00020003, 0xfff90052fc681173,
+ 0x34f4fcd900030003, 0xfff90052fc67117c,
+ 0x34effcd600030003, 0xfff90052fc661184,
+ 0x34eafcd400040003, 0xfff90052fc65118d,
+ 0x34e5fcd100040003, 0xfff90052fc631195,
+ 0x34e0fcce00050003, 0xfff90052fc62119d,
+ 0x34dbfccc00050003, 0xfff90052fc6111a6,
+ 0x34d6fcc900060003, 0xfff90052fc6011ae,
+ 0x34d1fcc700060003, 0xfff90053fc5e11b7,
+ 0x34cbfcc400070003, 0xfff90053fc5d11bf,
+ 0x34c6fcc100070003, 0xfff90053fc5c11c7,
+ 0x34c1fcbf00080003, 0xfff90053fc5a11d0,
+ 0x34bcfcbc00080003, 0xfff90053fc5911d8,
+ 0x34b7fcb900090002, 0xfff90053fc5811e1,
+ 0x34b1fcb700090002, 0xfff90053fc5711e9,
+ 0x34acfcb4000a0002, 0xfff90054fc5511f1,
+ 0x34a7fcb2000a0002, 0xfff90054fc5411fa,
+ 0x34a2fcaf000b0002, 0xfff90054fc531202,
+ 0x349dfcac000b0002, 0xfff90054fc52120b,
+ 0x3497fcaa000c0002, 0xfff90054fc501213,
+ 0x3492fca7000c0002, 0xfff90054fc4f121c,
+ 0x348dfca5000d0002, 0xfff90054fc4e1224,
+ 0x3487fca2000d0002, 0xfff90054fc4d122d,
+ 0x3482fca0000e0002, 0xfff90055fc4b1235,
+ 0x347dfc9d000e0002, 0xfff90055fc4a123d,
+ 0x3478fc9b000f0002, 0xfff90055fc491246,
+ 0x3472fc98000f0002, 0xfff90055fc48124e,
+ 0x346dfc9500100002, 0xfff90055fc461257,
+ 0x3468fc9300100002, 0xfff90055fc45125f,
+ 0x3462fc9000110002, 0xfff90055fc441268,
+ 0x345dfc8e00110002, 0xfff90056fc431270,
+ 0x3457fc8b00120002, 0xfff90056fc411279,
+ 0x3452fc8900120002, 0xfffa0056fc401281,
+ 0x344dfc8600130002, 0xfffa0056fc3f128a,
+ 0x3447fc8400130002, 0xfffa0056fc3e1292,
+ 0x3442fc8200130002, 0xfffa0056fc3c129b,
+ 0x343cfc7f00140002, 0xfffa0056fc3b12a3,
+ 0x3437fc7d00140002, 0xfffa0057fc3a12ac,
+ 0x3432fc7a00150002, 0xfffa0057fc3912b4,
+ 0x342cfc7800150002, 0xfffa0057fc3712bd,
+ 0x3427fc7500160002, 0xfffa0057fc3612c5,
+ 0x3421fc7300160002, 0xfffa0057fc3512ce,
+ 0x341cfc7000170002, 0xfffa0057fc3412d6,
+ 0x3416fc6e00170002, 0xfffa0057fc3312df,
+ 0x3411fc6c00180002, 0xfffa0057fc3112e7,
+ 0x340bfc6900180002, 0xfffa0058fc3012f0,
+ 0x3406fc6700190002, 0xfffa0058fc2f12f9,
+ 0x3400fc6400190002, 0xfffa0058fc2e1301,
+ 0x33fbfc62001a0002, 0xfffa0058fc2c130a,
+ 0x33f5fc60001a0002, 0xfffa0058fc2b1312,
+ 0x33f0fc5d001a0002, 0xfffa0058fc2a131b,
+ 0x33eafc5b001b0002, 0xfffa0058fc291323,
+ 0x33e5fc58001b0002, 0xfffa0059fc27132c,
+ 0x33dffc56001c0002, 0xfffa0059fc261334,
+ 0x33d9fc54001c0002, 0xfffa0059fc25133d,
+ 0x33d4fc51001d0002, 0xfffa0059fc241346,
+ 0x33cefc4f001d0002, 0xfffa0059fc22134e,
+ 0x33c9fc4d001e0002, 0xfffa0059fc211357,
+ 0x33c3fc4a001e0002, 0xfffa0059fc20135f,
+ 0x33bdfc48001f0002, 0xfffa005afc1f1368,
+ 0x33b8fc46001f0002, 0xfffa005afc1e1370,
+ 0x33b2fc43001f0002, 0xfffa005afc1c1379,
+ 0x33acfc4100200002, 0xfffa005afc1b1382,
+ 0x33a7fc3f00200002, 0xfffa005afc1a138a,
+ 0x33a1fc3d00210002, 0xfffa005afc191393,
+ 0x339bfc3a00210002, 0xfffa005afc17139b,
+ 0x3396fc3800220002, 0xfffa005afc1613a4,
+ 0x3390fc3600220001, 0xfffa005bfc1513ad,
+ 0x338afc3400230001, 0xfffa005bfc1413b5,
+ 0x3385fc3100230001, 0xfffa005bfc1213be,
+ 0x337ffc2f00230001, 0xfffb005bfc1113c6,
+ 0x3379fc2d00240001, 0xfffb005bfc1013cf,
+ 0x3373fc2b00240001, 0xfffb005bfc0f13d8,
+ 0x336efc2800250001, 0xfffb005bfc0e13e0,
+ 0x3368fc2600250001, 0xfffb005cfc0c13e9,
+ 0x3362fc2400260001, 0xfffb005cfc0b13f2,
+ 0x335cfc2200260001, 0xfffb005cfc0a13fa,
+ 0x3357fc1f00270001, 0xfffb005cfc091403,
+ 0x3351fc1d00270001, 0xfffb005cfc07140c,
+ 0x334bfc1b00270001, 0xfffb005cfc061414,
+ 0x3345fc1900280001, 0xfffb005cfc05141d,
+ 0x333ffc1700280001, 0xfffb005cfc041425,
+ 0x3339fc1400290001, 0xfffb005dfc03142e,
+ 0x3334fc1200290001, 0xfffb005dfc011437,
+ 0x332efc1000290001, 0xfffb005dfc00143f,
+ 0x3328fc0e002a0001, 0xfffb005dfbff1448,
+ 0x3322fc0c002a0001, 0xfffb005dfbfe1451,
+ 0x331cfc0a002b0001, 0xfffb005dfbfd1459,
+ 0x3316fc08002b0001, 0xfffb005dfbfb1462,
+ 0x3310fc05002c0001, 0xfffb005efbfa146b,
+ 0x330bfc03002c0001, 0xfffb005efbf91473,
+ 0x3305fc01002c0001, 0xfffb005efbf8147c,
+ 0x32fffbff002d0001, 0xfffb005efbf61485,
+ 0x32f9fbfd002d0001, 0xfffb005efbf5148e,
+ 0x32f3fbfb002e0001, 0xfffb005efbf41496,
+ 0x32edfbf9002e0001, 0xfffb005efbf3149f,
+ 0x32e7fbf7002e0001, 0xfffb005efbf214a8,
+ 0x32e1fbf5002f0001, 0xfffb005ffbf014b0,
+ 0x32dbfbf3002f0001, 0xfffb005ffbef14b9,
+ 0x32d5fbf000300001, 0xfffb005ffbee14c2,
+ 0x32cffbee00300001, 0xfffb005ffbed14ca,
+ 0x32c9fbec00300001, 0xfffb005ffbec14d3,
+ 0x32c3fbea00310001, 0xfffb005ffbea14dc,
+ 0x32bdfbe800310001, 0xfffb005ffbe914e5,
+ 0x32b7fbe600320001, 0xfffb0060fbe814ed,
+ 0x32b1fbe400320001, 0xfffb0060fbe714f6,
+ 0x32abfbe200320001, 0xfffb0060fbe614ff,
+ 0x32a5fbe000330001, 0xfffb0060fbe41507,
+ 0x329ffbde00330001, 0xfffb0060fbe31510,
+ 0x3299fbdc00340001, 0xfffb0060fbe21519,
+ 0x3293fbda00340001, 0xfffb0060fbe11522,
+ 0x328dfbd800340001, 0xfffb0060fbe0152a,
+ 0x3286fbd600350001, 0xfffc0061fbde1533,
+ 0x3280fbd400350001, 0xfffc0061fbdd153c,
+ 0x327afbd200360001, 0xfffc0061fbdc1545,
+ 0x3274fbd000360001, 0xfffc0061fbdb154d,
+ 0x326efbce00360001, 0xfffc0061fbda1556,
+ 0x3268fbcc00370001, 0xfffc0061fbd9155f,
+ 0x3262fbca00370001, 0xfffc0061fbd71568,
+ 0x325cfbc800380001, 0xfffc0062fbd61570,
+ 0x3255fbc600380001, 0xfffc0062fbd51579,
+ 0x324ffbc400380001, 0xfffc0062fbd41582,
+ 0x3249fbc300390001, 0xfffc0062fbd3158b,
+ 0x3243fbc100390001, 0xfffc0062fbd11593,
+ 0x323dfbbf00390001, 0xfffc0062fbd0159c,
+ 0x3237fbbd003a0001, 0xfffc0062fbcf15a5,
+ 0x3230fbbb003a0001, 0xfffc0062fbce15ae,
+ 0x322afbb9003b0001, 0xfffc0063fbcd15b7,
+ 0x3224fbb7003b0001, 0xfffc0063fbcc15bf,
+ 0x321efbb5003b0001, 0xfffc0063fbca15c8,
+ 0x3217fbb3003c0001, 0xfffc0063fbc915d1,
+ 0x3211fbb1003c0001, 0xfffc0063fbc815da,
+ 0x320bfbb0003c0001, 0xfffc0063fbc715e2,
+ 0x3205fbae003d0001, 0xfffc0063fbc615eb,
+ 0x31fefbac003d0001, 0xfffc0063fbc415f4,
+ 0x31f8fbaa003e0001, 0xfffc0064fbc315fd,
+ 0x31f2fba8003e0001, 0xfffc0064fbc21606,
+ 0x31ecfba6003e0001, 0xfffc0064fbc1160e,
+ 0x31e5fba4003f0001, 0xfffc0064fbc01617,
+ 0x31dffba3003f0001, 0xfffc0064fbbf1620,
+ 0x31d9fba1003f0001, 0xfffc0064fbbd1629,
+ 0x31d2fb9f00400001, 0xfffc0064fbbc1632,
+ 0x31ccfb9d00400001, 0xfffc0064fbbb163b,
+ 0x31c6fb9b00400001, 0xfffc0065fbba1643,
+ 0x31bffb9a00410001, 0xfffc0065fbb9164c,
+ 0x31b9fb9800410001, 0xfffc0065fbb81655,
+ 0x31b2fb9600420001, 0xfffc0065fbb7165e,
+ 0x31acfb9400420001, 0xfffc0065fbb51667,
+ 0x31a6fb9200420001, 0xfffc0065fbb4166f,
+ 0x319ffb9100430000, 0xfffc0065fbb31678,
+ 0x3199fb8f00430000, 0xfffc0066fbb21681,
+ 0x3192fb8d00430000, 0xfffc0066fbb1168a,
+ 0x318cfb8b00440000, 0xfffc0066fbb01693,
+ 0x3186fb8a00440000, 0xfffc0066fbae169c,
+ 0x317ffb8800440000, 0xfffc0066fbad16a4,
+ 0x3179fb8600450000, 0xfffc0066fbac16ad,
+ 0x3172fb8400450000, 0xfffc0066fbab16b6,
+ 0x316cfb8300450000, 0xfffc0066fbaa16bf,
+ 0x3165fb8100460000, 0xfffc0067fba916c8,
+ 0x315ffb7f00460000, 0xfffd0067fba816d1,
+ 0x3158fb7e00460000, 0xfffd0067fba616da,
+ 0x3152fb7c00470000, 0xfffd0067fba516e2,
+ 0x314bfb7a00470000, 0xfffd0067fba416eb,
+ 0x3145fb7900470000, 0xfffd0067fba316f4,
+ 0x313efb7700480000, 0xfffd0067fba216fd,
+ 0x3138fb7500480000, 0xfffd0067fba11706,
+ 0x3131fb7300480000, 0xfffd0068fba0170f,
+ 0x312bfb7200490000, 0xfffd0068fb9e1718,
+ 0x3124fb7000490000, 0xfffd0068fb9d1721,
+ 0x311efb6f00490000, 0xfffd0068fb9c1729,
+ 0x3117fb6d004a0000, 0xfffd0068fb9b1732,
+ 0x3110fb6b004a0000, 0xfffd0068fb9a173b,
+ 0x310afb6a004a0000, 0xfffd0068fb991744,
+ 0x3103fb68004b0000, 0xfffd0068fb98174d,
+ 0x30fdfb66004b0000, 0xfffd0069fb961756,
+ 0x30f6fb65004b0000, 0xfffd0069fb95175f,
+ 0x30f0fb63004c0000, 0xfffd0069fb941768,
+ 0x30e9fb62004c0000, 0xfffd0069fb931770,
+ 0x30e2fb60004c0000, 0xfffd0069fb921779,
+ 0x30dcfb5e004d0000, 0xfffd0069fb911782,
+ 0x30d5fb5d004d0000, 0xfffd0069fb90178b,
+ 0x30cefb5b004d0000, 0xfffd0069fb8f1794,
+ 0x30c8fb5a004e0000, 0xfffd006afb8e179d,
+ 0x30c1fb58004e0000, 0xfffd006afb8c17a6,
+ 0x30bafb56004e0000, 0xfffd006afb8b17af,
+ 0x30b4fb55004e0000, 0xfffd006afb8a17b8,
+ 0x30adfb53004f0000, 0xfffd006afb8917c1,
+ 0x30a6fb52004f0000, 0xfffd006afb8817c9,
+ 0x30a0fb50004f0000, 0xfffd006afb8717d2,
+ 0x3099fb4f00500000, 0xfffd006afb8617db,
+ 0x3092fb4d00500000, 0xfffd006bfb8517e4,
+ 0x308bfb4c00500000, 0xfffd006bfb8417ed,
+ 0x3085fb4a00510000, 0xfffd006bfb8217f6,
+ 0x307efb4900510000, 0xfffd006bfb8117ff,
+ 0x3077fb4700510000, 0xfffd006bfb801808,
+ 0x3070fb4600520000, 0xfffd006bfb7f1811,
+ 0x306afb4400520000, 0xfffd006bfb7e181a,
+ 0x3063fb4300520000, 0xfffd006bfb7d1823,
+ 0x305cfb4100520000, 0xfffd006cfb7c182c,
+ 0x3055fb4000530000, 0xfffd006cfb7b1835,
+ 0x304ffb3e00530000, 0xfffd006cfb7a183d,
+ 0x3048fb3d00530000, 0xfffd006cfb791846,
+ 0x3041fb3b00540000, 0xfffd006cfb77184f,
+ 0x303afb3a00540000, 0xfffd006cfb761858,
+ 0x3033fb3800540000, 0xfffd006cfb751861,
+ 0x302cfb3700550000, 0xfffd006cfb74186a,
+ 0x3026fb3500550000, 0xfffd006dfb731873,
+ 0x301ffb3400550000, 0xfffd006dfb72187c,
+ 0x3018fb3300550000, 0xfffd006dfb711885,
+ 0x3011fb3100560000, 0xfffd006dfb70188e,
+ 0x300afb3000560000, 0xfffd006dfb6f1897,
+ 0x3003fb2e00560000, 0xfffd006dfb6e18a0,
+ 0x2ffcfb2d00570000, 0xfffd006dfb6d18a9,
+ 0x2ff5fb2c00570000, 0xfffd006dfb6b18b2,
+ 0x2feffb2a00570000, 0xfffe006dfb6a18bb,
+ 0x2fe8fb2900570000, 0xfffe006efb6918c4,
+ 0x2fe1fb2700580000, 0xfffe006efb6818cd,
+ 0x2fdafb2600580000, 0xfffe006efb6718d6,
+ 0x2fd3fb2500580000, 0xfffe006efb6618df,
+ 0x2fccfb2300590000, 0xfffe006efb6518e8,
+ 0x2fc5fb2200590000, 0xfffe006efb6418f1,
+ 0x2fbefb2100590000, 0xfffe006efb6318f9,
+ 0x2fb7fb1f00590000, 0xfffe006efb621902,
+ 0x2fb0fb1e005a0000, 0xfffe006ffb61190b,
+ 0x2fa9fb1c005a0000, 0xfffe006ffb601914,
+ 0x2fa2fb1b005a0000, 0xfffe006ffb5f191d,
+ 0x2f9bfb1a005a0000, 0xfffe006ffb5e1926,
+ 0x2f94fb19005b0000, 0xfffe006ffb5d192f,
+ 0x2f8dfb17005b0000, 0xfffe006ffb5c1938,
+ 0x2f86fb16005b0000, 0xfffe006ffb5a1941,
+ 0x2f7ffb15005c0000, 0xfffe006ffb59194a,
+ 0x2f78fb13005c0000, 0xfffe006ffb581953,
+ 0x2f71fb12005c0000, 0xfffe0070fb57195c,
+ 0x2f6afb11005c0000, 0xfffe0070fb561965,
+ 0x2f63fb0f005d0000, 0xfffe0070fb55196e,
+ 0x2f5cfb0e005d0000, 0xfffe0070fb541977,
+ 0x2f55fb0d005d0000, 0xfffe0070fb531980,
+ 0x2f4efb0c005d0000, 0xfffe0070fb521989,
+ 0x2f47fb0a005e0000, 0xfffe0070fb511992,
+ 0x2f40fb09005e0000, 0xfffe0070fb50199b,
+ 0x2f39fb08005e0000, 0xfffe0071fb4f19a4,
+ 0x2f32fb07005e0000, 0xfffe0071fb4e19ad,
+ 0x2f2afb05005f0000, 0xfffe0071fb4d19b6,
+ 0x2f23fb04005f0000, 0xfffe0071fb4c19bf,
+ 0x2f1cfb03005f0000, 0xfffe0071fb4b19c8,
+ 0x2f15fb02005f0000, 0xfffe0071fb4a19d1,
+ 0x2f0efb0000600000, 0xfffe0071fb4919da,
+ 0x2f07faff00600000, 0xfffe0071fb4819e3,
+ 0x2f00fafe00600000, 0xfffe0071fb4719ec,
+ 0x2ef8fafd00600000, 0xfffe0072fb4619f5,
+ 0x2ef1fafc00610000, 0xfffe0072fb4519fe,
+ 0x2eeafafa00610000, 0xfffe0072fb441a07,
+ 0x2ee3faf900610000, 0xfffe0072fb431a10,
+ 0x2edcfaf800610000, 0xfffe0072fb421a19,
+ 0x2ed5faf700620000, 0xfffe0072fb411a22,
+ 0x2ecdfaf600620000, 0xfffe0072fb401a2b,
+ 0x2ec6faf500620000, 0xfffe0072fb3f1a34,
+ 0x2ebffaf300620000, 0xfffe0072fb3e1a3d,
+ 0x2eb8faf200630000, 0xfffe0073fb3d1a46,
+ 0x2eb1faf100630000, 0xfffe0073fb3c1a4f,
+ 0x2ea9faf000630000, 0xfffe0073fb3b1a58,
+ 0x2ea2faef00630000, 0xfffe0073fb3a1a61,
+ 0x2e9bfaee00640000, 0xfffe0073fb391a6a,
+ 0x2e94faed00640000, 0xfffe0073fb381a73,
+ 0x2e8cfaeb00640000, 0xfffe0073fb371a7c,
+ 0x2e85faea00640000, 0xfffe0073fb361a85,
+ 0x2e7efae900650000, 0xfffe0073fb351a8e,
+ 0x2e77fae800650000, 0xfffe0074fb341a97,
+ 0x2e6ffae700650000, 0xfffe0074fb331aa0,
+ 0x2e68fae600650000, 0xfffe0074fb321aa9,
+ 0x2e61fae500650000, 0xfffe0074fb311ab2,
+ 0x2e59fae400660000, 0xfffe0074fb301abb,
+ 0x2e52fae300660000, 0xfffe0074fb2f1ac4,
+ 0x2e4bfae200660000, 0xfffe0074fb2e1ace,
+ 0x2e43fae000660000, 0xfffe0074fb2d1ad7,
+ 0x2e3cfadf00670000, 0xfffe0074fb2c1ae0,
+ 0x2e35fade00670000, 0xfffe0074fb2b1ae9,
+ 0x2e2dfadd00670000, 0xfffe0075fb2a1af2,
+ 0x2e26fadc00670000, 0xfffe0075fb291afb,
+ 0x2e1ffadb00670000, 0xfffe0075fb281b04,
+ 0x2e17fada00680000, 0xfffe0075fb271b0d,
+ 0x2e10fad900680000, 0xfffe0075fb261b16,
+ 0x2e09fad800680000, 0xfffe0075fb251b1f,
+ 0x2e01fad700680000, 0xfffe0075fb241b28,
+ 0x2dfafad600690000, 0xffff0075fb231b31,
+ 0x2df2fad500690000, 0xffff0075fb221b3a,
+ 0x2debfad400690000, 0xffff0076fb211b43,
+ 0x2de4fad300690000, 0xffff0076fb201b4c,
+ 0x2ddcfad200690000, 0xffff0076fb1f1b55,
+ 0x2dd5fad1006a0000, 0xffff0076fb1e1b5e,
+ 0x2dcdfad0006a0000, 0xffff0076fb1d1b67,
+ 0x2dc6facf006a0000, 0xffff0076fb1c1b70,
+ 0x2dbfface006a0000, 0xffff0076fb1b1b79,
+ 0x2db7facd006a0000, 0xffff0076fb1a1b82,
+ 0x2db0facc006b0000, 0xffff0076fb191b8b,
+ 0x2da8facb006b0000, 0xffff0076fb181b94,
+ 0x2da1faca006b0000, 0xffff0077fb171b9d,
+ 0x2d99fac9006b0000, 0xffff0077fb171ba6,
+ 0x2d92fac8006b0000, 0xffff0077fb161baf,
+ 0x2d8afac7006c0000, 0xffff0077fb151bb8,
+ 0x2d83fac7006c0000, 0xffff0077fb141bc2,
+ 0x2d7bfac6006c0000, 0xffff0077fb131bcb,
+ 0x2d74fac5006c0000, 0xffff0077fb121bd4,
+ 0x2d6cfac4006c0000, 0xffff0077fb111bdd,
+ 0x2d65fac3006d0000, 0xffff0077fb101be6,
+ 0x2d5dfac2006d0000, 0xffff0078fb0f1bef,
+ 0x2d56fac1006d0000, 0xffff0078fb0e1bf8,
+ 0x2d4efac0006d0000, 0xffff0078fb0d1c01,
+ 0x2d47fabf006d0000, 0xffff0078fb0c1c0a,
+ 0x2d3ffabe006e0000, 0xffff0078fb0b1c13,
+ 0x2d38fabd006e0000, 0xffff0078fb0b1c1c,
+ 0x2d30fabd006e0000, 0xffff0078fb0a1c25,
+ 0x2d28fabc006e0000, 0xffff0078fb091c2e,
+ 0x2d21fabb006e0000, 0xffff0078fb081c37,
+ 0x2d19faba006f0000, 0xffff0078fb071c40,
+ 0x2d12fab9006f0000, 0xffff0078fb061c49,
+ 0x2d0afab8006f0000, 0xffff0079fb051c52,
+ 0x2d02fab7006f0000, 0xffff0079fb041c5b,
+ 0x2cfbfab7006f0000, 0xffff0079fb031c64,
+ 0x2cf3fab600700000, 0xffff0079fb021c6d,
+ 0x2cecfab500700000, 0xffff0079fb011c77,
+ 0x2ce4fab400700000, 0xffff0079fb011c80,
+ 0x2cdcfab300700000, 0xffff0079fb001c89,
+ 0x2cd5fab200700000, 0xffff0079faff1c92,
+ 0x2ccdfab200700000, 0xffff0079fafe1c9b,
+ 0x2cc5fab100710000, 0xffff0079fafd1ca4,
+ 0x2cbefab000710000, 0xffff007afafc1cad,
+ 0x2cb6faaf00710000, 0xffff007afafb1cb6,
+ 0x2caefaae00710000, 0xffff007afafa1cbf,
+ 0x2ca7faae00710000, 0xffff007afaf91cc8,
+ 0x2c9ffaad00720000, 0xffff007afaf91cd1,
+ 0x2c97faac00720000, 0xffff007afaf81cda,
+ 0x2c90faab00720000, 0xffff007afaf71ce3,
+ 0x2c88faab00720000, 0xffff007afaf61cec,
+ 0x2c80faaa00720000, 0xffff007afaf51cf5,
+ 0x2c79faa900720000, 0xffff007afaf41cfe,
+ 0x2c71faa800730000, 0xffff007afaf31d07,
+ 0x2c69faa800730000, 0xffff007bfaf31d10,
+ 0x2c62faa700730000, 0xffff007bfaf21d1a,
+ 0x2c5afaa600730000, 0xffff007bfaf11d23,
+ 0x2c52faa500730000, 0xffff007bfaf01d2c,
+ 0x2c4afaa500730000, 0xffff007bfaef1d35,
+ 0x2c43faa400740000, 0xffff007bfaee1d3e,
+ 0x2c3bfaa300740000, 0xffff007bfaed1d47,
+ 0x2c33faa200740000, 0xffff007bfaed1d50,
+ 0x2c2bfaa200740000, 0xffff007bfaec1d59,
+ 0x2c24faa100740000, 0xffff007bfaeb1d62,
+ 0x2c1cfaa000740000, 0xffff007bfaea1d6b,
+ 0x2c14faa000750000, 0xffff007cfae91d74,
+ 0x2c0cfa9f00750000, 0xffff007cfae81d7d,
+ 0x2c04fa9e00750000, 0xffff007cfae81d86,
+ 0x2bfdfa9e00750000, 0xffff007cfae71d8f,
+ 0x2bf5fa9d00750000, 0xffff007cfae61d98,
+ 0x2bedfa9c00750000, 0xffff007cfae51da1,
+ 0x2be5fa9c00750000, 0xffff007cfae41daa,
+ 0x2bddfa9b00760000, 0xffff007cfae31db3,
+ 0x2bd5fa9a00760000, 0xffff007cfae31dbd,
+ 0x2bcefa9a00760000, 0xffff007cfae21dc6,
+ 0x2bc6fa9900760000, 0xffff007cfae11dcf,
+ 0x2bbefa9800760000, 0xffff007cfae01dd8,
+ 0x2bb6fa9800760000, 0xffff007dfadf1de1,
+ 0x2baefa9700770000, 0xffff007dfadf1dea,
+ 0x2ba6fa9600770000, 0xffff007dfade1df3,
+ 0x2b9ffa9600770000, 0xffff007dfadd1dfc,
+ 0x2b97fa9500770000, 0xffff007dfadc1e05,
+ 0x2b8ffa9500770000, 0xffff007dfadb1e0e,
+ 0x2b87fa9400770000, 0xffff007dfadb1e17,
+ 0x2b7ffa9300770000, 0xffff007dfada1e20,
+ 0x2b77fa9300780000, 0xffff007dfad91e29,
+ 0x2b6ffa9200780000, 0xffff007dfad81e32,
+ 0x2b67fa9200780000, 0xffff007dfad71e3b,
+ 0x2b5ffa9100780000, 0xffff007dfad71e44,
+ 0x2b57fa9000780000, 0xffff007efad61e4d,
+ 0x2b50fa9000780000, 0xffff007efad51e56,
+ 0x2b48fa8f00780000, 0xffff007efad41e5f,
+ 0x2b40fa8f00790000, 0xffff007efad31e69,
+ 0x2b38fa8e00790000, 0xffff007efad31e72,
+ 0x2b30fa8e00790000, 0xffff007efad21e7b,
+ 0x2b28fa8d00790000, 0xffff007efad11e84,
+ 0x2b20fa8d00790000, 0xffff007efad01e8d,
+ 0x2b18fa8c00790000, 0xffff007efad01e96,
+ 0x2b10fa8b00790000, 0xffff007efacf1e9f,
+ 0x2b08fa8b00790000, 0xffff007eface1ea8,
+ 0x2b00fa8a007a0000, 0xffff007efacd1eb1,
+ 0x2af8fa8a007a0000, 0xffff007efacd1eba,
+ 0x2af0fa89007a0000, 0xffff007ffacc1ec3,
+ 0x2ae8fa89007a0000, 0xffff007ffacb1ecc,
+ 0x2ae0fa88007a0000, 0xffff007ffaca1ed5,
+ 0x2ad8fa88007a0000, 0xffff007ffaca1ede,
+ 0x2ad0fa87007a0000, 0xffff007ffac91ee7,
+ 0x2ac8fa87007a0000, 0xffff007ffac81ef0,
+ 0x2ac0fa86007b0000, 0x0000007ffac71ef9,
+ 0x2ab8fa86007b0000, 0x0000007ffac71f02,
+ 0x2ab0fa85007b0000, 0x0000007ffac61f0b,
+ 0x2aa8fa85007b0000, 0x0000007ffac51f14,
+ 0x2aa0fa84007b0000, 0x0000007ffac41f1d,
+ 0x2a98fa84007b0000, 0x0000007ffac41f26,
+ 0x2a90fa84007b0000, 0x0000007ffac31f2f,
+ 0x2a88fa83007b0000, 0x00000080fac21f38,
+ 0x2a80fa83007c0000, 0x00000080fac21f42,
+ 0x2a78fa82007c0000, 0x00000080fac11f4b,
+ 0x2a70fa82007c0000, 0x00000080fac01f54,
+ 0x2a68fa81007c0000, 0x00000080fabf1f5d,
+ 0x2a5ffa81007c0000, 0x00000080fabf1f66,
+ 0x2a57fa80007c0000, 0x00000080fabe1f6f,
+ 0x2a4ffa80007c0000, 0x00000080fabd1f78,
+ 0x2a47fa80007c0000, 0x00000080fabd1f81,
+ 0x2a3ffa7f007d0000, 0x00000080fabc1f8a,
+ 0x2a37fa7f007d0000, 0x00000080fabb1f93,
+ 0x2a2ffa7e007d0000, 0x00000080fabb1f9c,
+ 0x2a27fa7e007d0000, 0x00000080faba1fa5,
+ 0x2a1ffa7d007d0000, 0x00000080fab91fae,
+ 0x2a16fa7d007d0000, 0x00000080fab81fb7,
+ 0x2a0efa7d007d0000, 0x00000081fab81fc0,
+ 0x2a06fa7c007d0000, 0x00000081fab71fc9,
+ 0x29fefa7c007d0000, 0x00000081fab61fd2,
+ 0x29f6fa7c007d0000, 0x00000081fab61fdb,
+ 0x29eefa7b007e0000, 0x00000081fab51fe4,
+ 0x29e6fa7b007e0000, 0x00000081fab41fed,
+ 0x29ddfa7a007e0000, 0x00000081fab41ff6,
+ 0x29d5fa7a007e0000, 0x00000081fab31fff,
+ 0x29cdfa7a007e0000, 0x00000081fab22008,
+ 0x29c5fa79007e0000, 0x00000081fab22011,
+ 0x29bdfa79007e0000, 0x00000081fab1201a,
+ 0x29b5fa79007e0000, 0x00000081fab02023,
+ 0x29acfa78007e0000, 0x00000081fab0202c,
+ 0x29a4fa78007e0000, 0x00000081faaf2035,
+ 0x299cfa78007f0000, 0x00000081faaf203e,
+ 0x2994fa77007f0000, 0x00000081faae2047,
+ 0x298cfa77007f0000, 0x00000082faad2050,
+ 0x2983fa77007f0000, 0x00000082faad2059,
+ 0x297bfa76007f0000, 0x00000082faac2062,
+ 0x2973fa76007f0000, 0x00000082faab206b,
+ 0x296bfa76007f0000, 0x00000082faab2074,
+ 0x2963fa76007f0000, 0x00000082faaa207d,
+ 0x295afa75007f0000, 0x00000082faa92086,
+ 0x2952fa75007f0000, 0x00000082faa9208f,
+ 0x294afa7500800000, 0x00000082faa82098,
+ 0x2942fa7400800000, 0x00000082faa820a1,
+ 0x2939fa7400800000, 0x00000082faa720aa,
+ 0x2931fa7400800000, 0x00000082faa620b3,
+ 0x2929fa7400800000, 0x00000082faa620bc,
+ 0x2920fa7300800000, 0x00000082faa520c5,
+ 0x2918fa7300800000, 0x00000082faa520ce,
+ 0x2910fa7300800000, 0x00000082faa420d7,
+ 0x2908fa7300800000, 0x00000082faa320e0,
+ 0x28fffa7200800000, 0x00000083faa320e9,
+ 0x28f7fa7200800000, 0x00000083faa220f2,
+ 0x28effa7200800000, 0x00000083faa220fb,
+ 0x28e6fa7200810000, 0x00000083faa12104,
+ 0x28defa7100810000, 0x00000083faa0210d,
+ 0x28d6fa7100810000, 0x00000083faa02116,
+ 0x28cefa7100810000, 0x00000083fa9f211f,
+ 0x28c5fa7100810000, 0x00000083fa9f2128,
+ 0x28bdfa7000810000, 0x00000083fa9e2131,
+ 0x28b5fa7000810000, 0x00000083fa9e213a,
+ 0x28acfa7000810000, 0x00000083fa9d2143,
+ 0x28a4fa7000810000, 0x00000083fa9c214c,
+ 0x289cfa7000810000, 0x00000083fa9c2155,
+ 0x2893fa6f00810000, 0x00000083fa9b215e,
+ 0x288bfa6f00810000, 0x00000083fa9b2167,
+ 0x2883fa6f00810000, 0x00000083fa9a2170,
+ 0x287afa6f00820000, 0x00000083fa9a2179,
+ 0x2872fa6f00820000, 0x00000083fa992182,
+ 0x2869fa6f00820000, 0x00000083fa99218b,
+ 0x2861fa6e00820000, 0x00000083fa982194,
+ 0x2859fa6e00820000, 0x00000083fa97219d,
+ 0x2850fa6e00820000, 0x00000084fa9721a5,
+ 0x2848fa6e00820000, 0x00000084fa9621ae,
+ 0x2840fa6e00820000, 0x00000084fa9621b7,
+ 0x2837fa6e00820000, 0x00000084fa9521c0,
+ 0x282ffa6d00820000, 0x00000084fa9521c9,
+ 0x2826fa6d00820000, 0x00000084fa9421d2,
+ 0x281efa6d00820000, 0x00000084fa9421db,
+ 0x2816fa6d00820000, 0x00000084fa9321e4,
+ 0x280dfa6d00820000, 0x00000084fa9321ed,
+ 0x2805fa6d00820000, 0x00000084fa9221f6,
+ 0x27fcfa6d00830000, 0x00000084fa9221ff,
+ 0x27f4fa6d00830000, 0x00000084fa912208,
+ 0x27ecfa6c00830000, 0x00000084fa912211,
+ 0x27e3fa6c00830000, 0x00000084fa90221a,
+ 0x27dbfa6c00830000, 0x00000084fa902223,
+ 0x27d2fa6c00830000, 0x00000084fa8f222c,
+ 0x27cafa6c00830000, 0x00000084fa8f2234,
+ 0x27c1fa6c00830000, 0x00000084fa8e223d,
+ 0x27b9fa6c00830000, 0x00000084fa8e2246,
+ 0x27b0fa6c00830000, 0x00000084fa8d224f,
+ 0x27a8fa6c00830000, 0x00000084fa8d2258,
+ 0x279ffa6c00830000, 0x00000084fa8c2261,
+ 0x2797fa6c00830000, 0x00000084fa8c226a,
+ 0x278ffa6c00830000, 0x00000084fa8b2273,
+ 0x2786fa6b00830000, 0x00000084fa8b227c,
+ 0x277efa6b00830000, 0x00000084fa8b2285,
+ 0x2775fa6b00830000, 0x00000084fa8a228e,
+ 0x276dfa6b00830000, 0x00000085fa8a2297,
+ 0x2764fa6b00840000, 0x00000085fa89229f,
+ 0x275cfa6b00840000, 0x00000085fa8922a8,
+ 0x2753fa6b00840000, 0x00000085fa8822b1,
+ 0x274bfa6b00840000, 0x00000085fa8822ba,
+ 0x2742fa6b00840000, 0x00000085fa8722c3,
+ 0x273afa6b00840000, 0x00000085fa8722cc,
+ 0x2731fa6b00840000, 0x00000085fa8722d5,
+ 0x2729fa6b00840000, 0x00000085fa8622de,
+ 0x2720fa6b00840000, 0x00000085fa8622e7,
+ 0x2718fa6b00840000, 0x00000085fa8522f0,
+ 0x270ffa6b00840000, 0x00000085fa8522f8,
+ 0x2706fa6b00840000, 0x00000085fa842301,
+ 0x26fefa6b00840000, 0x00000085fa84230a,
+ 0x26f5fa6b00840000, 0x00000085fa842313,
+ 0x26edfa6b00840000, 0x00000085fa83231c,
+ 0x26e4fa6b00840000, 0x00000085fa832325,
+ 0x26dcfa6b00840000, 0x00000085fa82232e,
+ 0x26d3fa6b00840000, 0x00000085fa822337,
+ 0x26cbfa6b00840000, 0x00000085fa82233f,
+ 0x26c2fa6b00840000, 0x00000085fa812348,
+ 0x26bafa6b00840000, 0x00000085fa812351,
+ 0x26b1fa6b00840000, 0x00000085fa80235a,
+ 0x26a8fa6b00840000, 0x00000085fa802363,
+ 0x26a0fa6b00840000, 0x00000085fa80236c,
+ 0x2697fa6b00850000, 0x00000085fa7f2375,
+ 0x268ffa6b00850000, 0x00000085fa7f237d,
+ 0x2686fa6b00850000, 0x00000085fa7f2386,
+ 0x267dfa6c00850000, 0x00000085fa7e238f,
+ 0x2675fa6c00850000, 0x00000085fa7e2398,
+ 0x266cfa6c00850000, 0x00000085fa7d23a1,
+ 0x2664fa6c00850000, 0x00000085fa7d23aa,
+ 0x265bfa6c00850000, 0x00000085fa7d23b2,
+ 0x2652fa6c00850000, 0x00000085fa7c23bb,
+ 0x264afa6c00850000, 0x00000085fa7c23c4,
+ 0x2641fa6c00850000, 0x00000085fa7c23cd,
+ 0x2639fa6c00850000, 0x00000085fa7b23d6,
+ 0x2630fa6c00850000, 0x00000085fa7b23df,
+ 0x2627fa6c00850000, 0x00000085fa7b23e7,
+ 0x261ffa6c00850000, 0x00000085fa7a23f0,
+ 0x2616fa6d00850000, 0x00000085fa7a23f9,
+ 0x260dfa6d00850000, 0x00000085fa7a2402,
+ 0x2605fa6d00850000, 0x00000085fa79240b,
+ 0x25fcfa6d00850000, 0x00000085fa792413,
+ 0x25f4fa6d00850000, 0x00000085fa79241c,
+ 0x25ebfa6d00850000, 0x00000085fa782425,
+ 0x25e2fa6d00850000, 0x00000085fa78242e,
+ 0x25dafa6d00850000, 0x00000085fa782437,
+ 0x25d1fa6e00850000, 0x00000085fa78243f,
+ 0x25c8fa6e00850000, 0x00000085fa772448,
+ 0x25c0fa6e00850000, 0x00000085fa772451,
+ 0x25b7fa6e00850000, 0x00000085fa77245a,
+ 0x25aefa6e00850000, 0x00000085fa762463,
+ 0x25a6fa6e00850000, 0x00000085fa76246b,
+ 0x259dfa6e00850000, 0x00000085fa762474,
+ 0x2594fa6f00850000, 0x00000085fa76247d,
+ 0x258cfa6f00850000, 0x00000085fa752486,
+ 0x2583fa6f00850000, 0x00000085fa75248e,
+ 0x257afa6f00850000, 0x00000085fa752497,
+ 0x2572fa6f00850000, 0x00000085fa7424a0,
+ 0x2569fa6f00850000, 0x00000085fa7424a9,
+ 0x2560fa7000850000, 0x00000085fa7424b2,
+ 0x2557fa7000850000, 0x00000085fa7424ba,
+ 0x254ffa7000850000, 0x00000085fa7324c3,
+ 0x2546fa7000850000, 0x00000085fa7324cc,
+ 0x253dfa7000850000, 0x00000085fa7324d5,
+ 0x2535fa7100850000, 0x00000085fa7324dd,
+ 0x252cfa7100850000, 0x00000085fa7324e6,
+ 0x2523fa7100850000, 0x00000085fa7224ef,
+ 0x251afa7100850000, 0x00000085fa7224f8,
+ 0x2512fa7100850000, 0x00000085fa722500,
+ 0x2509fa7200850000, 0x00000085fa722509,
+ 0x2500fa7200850000, 0x00000085fa712512,
+ 0x24f8fa7200850000, 0x00000085fa71251a,
+ 0x24effa7200850000, 0x00000085fa712523,
+ 0x24e6fa7300850000, 0x00000085fa71252c,
+ 0x24ddfa7300850000, 0x00000085fa712535,
+ 0x24d5fa7300850000, 0x00000085fa70253d,
+ 0x24ccfa7300850000, 0x00000085fa702546,
+ 0x24c3fa7300850000, 0x00000085fa70254f,
+ 0x24bafa7400850000, 0x00000085fa702557,
+ 0x24b2fa7400850000, 0x00000085fa702560,
+ 0x24a9fa7400850000, 0x00000085fa6f2569,
+ 0x24a0fa7400850000, 0x00000085fa6f2572,
+ 0x2497fa7500850000, 0x00000085fa6f257a,
+ 0x248efa7500850000, 0x00000085fa6f2583,
+ 0x2486fa7500850000, 0x00000085fa6f258c,
+ 0x247dfa7600850000, 0x00000085fa6f2594,
+ 0x2474fa7600850000, 0x00000085fa6e259d,
+ 0x246bfa7600850000, 0x00000085fa6e25a6,
+ 0x2463fa7600850000, 0x00000085fa6e25ae,
+ 0x245afa7700850000, 0x00000085fa6e25b7,
+ 0x2451fa7700850000, 0x00000085fa6e25c0,
+ 0x2448fa7700850000, 0x00000085fa6e25c8,
+ 0x243ffa7800850000, 0x00000085fa6e25d1,
+ 0x2437fa7800850000, 0x00000085fa6d25da,
+ 0x242efa7800850000, 0x00000085fa6d25e2,
+ 0x2425fa7800850000, 0x00000085fa6d25eb,
+ 0x241cfa7900850000, 0x00000085fa6d25f4,
+ 0x2413fa7900850000, 0x00000085fa6d25fc,
+ 0x240bfa7900850000, 0x00000085fa6d2605,
+ 0x2402fa7a00850000, 0x00000085fa6d260d,
+ 0x23f9fa7a00850000, 0x00000085fa6d2616,
+ 0x23f0fa7a00850000, 0x00000085fa6c261f,
+ 0x23e7fa7b00850000, 0x00000085fa6c2627,
+ 0x23dffa7b00850000, 0x00000085fa6c2630,
+ 0x23d6fa7b00850000, 0x00000085fa6c2639,
+ 0x23cdfa7c00850000, 0x00000085fa6c2641,
+ 0x23c4fa7c00850000, 0x00000085fa6c264a,
+ 0x23bbfa7c00850000, 0x00000085fa6c2652,
+ 0x23b2fa7d00850000, 0x00000085fa6c265b,
+ 0x23aafa7d00850000, 0x00000085fa6c2664,
+ 0x23a1fa7d00850000, 0x00000085fa6c266c,
+ 0x2398fa7e00850000, 0x00000085fa6c2675,
+ 0x238ffa7e00850000, 0x00000085fa6c267d,
+ 0x2386fa7f00850000, 0x00000085fa6b2686,
+ 0x237dfa7f00850000, 0x00000085fa6b268f,
+ 0x2375fa7f00850000, 0x00000085fa6b2697,
+ 0x236cfa8000850000, 0x00000084fa6b26a0,
+ 0x2363fa8000850000, 0x00000084fa6b26a8,
+ 0x235afa8000850000, 0x00000084fa6b26b1,
+ 0x2351fa8100850000, 0x00000084fa6b26ba,
+ 0x2348fa8100850000, 0x00000084fa6b26c2,
+ 0x233ffa8200850000, 0x00000084fa6b26cb,
+ 0x2337fa8200850000, 0x00000084fa6b26d3,
+ 0x232efa8200850000, 0x00000084fa6b26dc,
+ 0x2325fa8300850000, 0x00000084fa6b26e4,
+ 0x231cfa8300850000, 0x00000084fa6b26ed,
+ 0x2313fa8400850000, 0x00000084fa6b26f5,
+ 0x230afa8400850000, 0x00000084fa6b26fe,
+ 0x2301fa8400850000, 0x00000084fa6b2706,
+ 0x22f8fa8500850000, 0x00000084fa6b270f,
+ 0x22f0fa8500850000, 0x00000084fa6b2718,
+ 0x22e7fa8600850000, 0x00000084fa6b2720,
+ 0x22defa8600850000, 0x00000084fa6b2729,
+ 0x22d5fa8700850000, 0x00000084fa6b2731,
+ 0x22ccfa8700850000, 0x00000084fa6b273a,
+ 0x22c3fa8700850000, 0x00000084fa6b2742,
+ 0x22bafa8800850000, 0x00000084fa6b274b,
+ 0x22b1fa8800850000, 0x00000084fa6b2753,
+ 0x22a8fa8900850000, 0x00000084fa6b275c,
+ 0x229ffa8900850000, 0x00000084fa6b2764,
+ 0x2297fa8a00850000, 0x00000083fa6b276d,
+ 0x228efa8a00840000, 0x00000083fa6b2775,
+ 0x2285fa8b00840000, 0x00000083fa6b277e,
+ 0x227cfa8b00840000, 0x00000083fa6b2786,
+ 0x2273fa8b00840000, 0x00000083fa6c278f,
+ 0x226afa8c00840000, 0x00000083fa6c2797,
+ 0x2261fa8c00840000, 0x00000083fa6c279f,
+ 0x2258fa8d00840000, 0x00000083fa6c27a8,
+ 0x224ffa8d00840000, 0x00000083fa6c27b0,
+ 0x2246fa8e00840000, 0x00000083fa6c27b9,
+ 0x223dfa8e00840000, 0x00000083fa6c27c1,
+ 0x2234fa8f00840000, 0x00000083fa6c27ca,
+ 0x222cfa8f00840000, 0x00000083fa6c27d2,
+ 0x2223fa9000840000, 0x00000083fa6c27db,
+ 0x221afa9000840000, 0x00000083fa6c27e3,
+ 0x2211fa9100840000, 0x00000083fa6c27ec,
+ 0x2208fa9100840000, 0x00000083fa6d27f4,
+ 0x21fffa9200840000, 0x00000083fa6d27fc,
+ 0x21f6fa9200840000, 0x00000082fa6d2805,
+ 0x21edfa9300840000, 0x00000082fa6d280d,
+ 0x21e4fa9300840000, 0x00000082fa6d2816,
+ 0x21dbfa9400840000, 0x00000082fa6d281e,
+ 0x21d2fa9400840000, 0x00000082fa6d2826,
+ 0x21c9fa9500840000, 0x00000082fa6d282f,
+ 0x21c0fa9500840000, 0x00000082fa6e2837,
+ 0x21b7fa9600840000, 0x00000082fa6e2840,
+ 0x21aefa9600840000, 0x00000082fa6e2848,
+ 0x21a5fa9700840000, 0x00000082fa6e2850,
+ 0x219dfa9700830000, 0x00000082fa6e2859,
+ 0x2194fa9800830000, 0x00000082fa6e2861,
+ 0x218bfa9900830000, 0x00000082fa6f2869,
+ 0x2182fa9900830000, 0x00000082fa6f2872,
+ 0x2179fa9a00830000, 0x00000082fa6f287a,
+ 0x2170fa9a00830000, 0x00000081fa6f2883,
+ 0x2167fa9b00830000, 0x00000081fa6f288b,
+ 0x215efa9b00830000, 0x00000081fa6f2893,
+ 0x2155fa9c00830000, 0x00000081fa70289c,
+ 0x214cfa9c00830000, 0x00000081fa7028a4,
+ 0x2143fa9d00830000, 0x00000081fa7028ac,
+ 0x213afa9e00830000, 0x00000081fa7028b5,
+ 0x2131fa9e00830000, 0x00000081fa7028bd,
+ 0x2128fa9f00830000, 0x00000081fa7128c5,
+ 0x211ffa9f00830000, 0x00000081fa7128ce,
+ 0x2116faa000830000, 0x00000081fa7128d6,
+ 0x210dfaa000830000, 0x00000081fa7128de,
+ 0x2104faa100830000, 0x00000081fa7228e6,
+ 0x20fbfaa200830000, 0x00000080fa7228ef,
+ 0x20f2faa200830000, 0x00000080fa7228f7,
+ 0x20e9faa300830000, 0x00000080fa7228ff,
+ 0x20e0faa300820000, 0x00000080fa732908,
+ 0x20d7faa400820000, 0x00000080fa732910,
+ 0x20cefaa500820000, 0x00000080fa732918,
+ 0x20c5faa500820000, 0x00000080fa732920,
+ 0x20bcfaa600820000, 0x00000080fa742929,
+ 0x20b3faa600820000, 0x00000080fa742931,
+ 0x20aafaa700820000, 0x00000080fa742939,
+ 0x20a1faa800820000, 0x00000080fa742942,
+ 0x2098faa800820000, 0x00000080fa75294a,
+ 0x208ffaa900820000, 0x0000007ffa752952,
+ 0x2086faa900820000, 0x0000007ffa75295a,
+ 0x207dfaaa00820000, 0x0000007ffa762963,
+ 0x2074faab00820000, 0x0000007ffa76296b,
+ 0x206bfaab00820000, 0x0000007ffa762973,
+ 0x2062faac00820000, 0x0000007ffa76297b,
+ 0x2059faad00820000, 0x0000007ffa772983,
+ 0x2050faad00820000, 0x0000007ffa77298c,
+ 0x2047faae00810000, 0x0000007ffa772994,
+ 0x203efaaf00810000, 0x0000007ffa78299c,
+ 0x2035faaf00810000, 0x0000007efa7829a4,
+ 0x202cfab000810000, 0x0000007efa7829ac,
+ 0x2023fab000810000, 0x0000007efa7929b5,
+ 0x201afab100810000, 0x0000007efa7929bd,
+ 0x2011fab200810000, 0x0000007efa7929c5,
+ 0x2008fab200810000, 0x0000007efa7a29cd,
+ 0x1ffffab300810000, 0x0000007efa7a29d5,
+ 0x1ff6fab400810000, 0x0000007efa7a29dd,
+ 0x1fedfab400810000, 0x0000007efa7b29e6,
+ 0x1fe4fab500810000, 0x0000007efa7b29ee,
+ 0x1fdbfab600810000, 0x0000007dfa7c29f6,
+ 0x1fd2fab600810000, 0x0000007dfa7c29fe,
+ 0x1fc9fab700810000, 0x0000007dfa7c2a06,
+ 0x1fc0fab800810000, 0x0000007dfa7d2a0e,
+ 0x1fb7fab800800000, 0x0000007dfa7d2a16,
+ 0x1faefab900800000, 0x0000007dfa7d2a1f,
+ 0x1fa5faba00800000, 0x0000007dfa7e2a27,
+ 0x1f9cfabb00800000, 0x0000007dfa7e2a2f,
+ 0x1f93fabb00800000, 0x0000007dfa7f2a37,
+ 0x1f8afabc00800000, 0x0000007dfa7f2a3f,
+ 0x1f81fabd00800000, 0x0000007cfa802a47,
+ 0x1f78fabd00800000, 0x0000007cfa802a4f,
+ 0x1f6ffabe00800000, 0x0000007cfa802a57,
+ 0x1f66fabf00800000, 0x0000007cfa812a5f,
+ 0x1f5dfabf00800000, 0x0000007cfa812a68,
+ 0x1f54fac000800000, 0x0000007cfa822a70,
+ 0x1f4bfac100800000, 0x0000007cfa822a78,
+ 0x1f42fac200800000, 0x0000007cfa832a80,
+ 0x1f38fac200800000, 0x0000007bfa832a88,
+ 0x1f2ffac3007f0000, 0x0000007bfa842a90,
+ 0x1f26fac4007f0000, 0x0000007bfa842a98,
+ 0x1f1dfac4007f0000, 0x0000007bfa842aa0,
+ 0x1f14fac5007f0000, 0x0000007bfa852aa8,
+ 0x1f0bfac6007f0000, 0x0000007bfa852ab0,
+ 0x1f02fac7007f0000, 0x0000007bfa862ab8,
+ 0x1ef9fac7007f0000, 0x0000007bfa862ac0,
+ 0x1ef0fac8007fffff, 0x0000007afa872ac8,
+ 0x1ee7fac9007fffff, 0x0000007afa872ad0,
+ 0x1edefaca007fffff, 0x0000007afa882ad8,
+ 0x1ed5faca007fffff, 0x0000007afa882ae0,
+ 0x1eccfacb007fffff, 0x0000007afa892ae8,
+ 0x1ec3facc007fffff, 0x0000007afa892af0,
+ 0x1ebafacd007effff, 0x0000007afa8a2af8,
+ 0x1eb1facd007effff, 0x0000007afa8a2b00,
+ 0x1ea8face007effff, 0x00000079fa8b2b08,
+ 0x1e9ffacf007effff, 0x00000079fa8b2b10,
+ 0x1e96fad0007effff, 0x00000079fa8c2b18,
+ 0x1e8dfad0007effff, 0x00000079fa8d2b20,
+ 0x1e84fad1007effff, 0x00000079fa8d2b28,
+ 0x1e7bfad2007effff, 0x00000079fa8e2b30,
+ 0x1e72fad3007effff, 0x00000079fa8e2b38,
+ 0x1e69fad3007effff, 0x00000079fa8f2b40,
+ 0x1e5ffad4007effff, 0x00000078fa8f2b48,
+ 0x1e56fad5007effff, 0x00000078fa902b50,
+ 0x1e4dfad6007effff, 0x00000078fa902b57,
+ 0x1e44fad7007dffff, 0x00000078fa912b5f,
+ 0x1e3bfad7007dffff, 0x00000078fa922b67,
+ 0x1e32fad8007dffff, 0x00000078fa922b6f,
+ 0x1e29fad9007dffff, 0x00000078fa932b77,
+ 0x1e20fada007dffff, 0x00000077fa932b7f,
+ 0x1e17fadb007dffff, 0x00000077fa942b87,
+ 0x1e0efadb007dffff, 0x00000077fa952b8f,
+ 0x1e05fadc007dffff, 0x00000077fa952b97,
+ 0x1dfcfadd007dffff, 0x00000077fa962b9f,
+ 0x1df3fade007dffff, 0x00000077fa962ba6,
+ 0x1deafadf007dffff, 0x00000077fa972bae,
+ 0x1de1fadf007dffff, 0x00000076fa982bb6,
+ 0x1dd8fae0007cffff, 0x00000076fa982bbe,
+ 0x1dcffae1007cffff, 0x00000076fa992bc6,
+ 0x1dc6fae2007cffff, 0x00000076fa9a2bce,
+ 0x1dbdfae3007cffff, 0x00000076fa9a2bd5,
+ 0x1db3fae3007cffff, 0x00000076fa9b2bdd,
+ 0x1daafae4007cffff, 0x00000075fa9c2be5,
+ 0x1da1fae5007cffff, 0x00000075fa9c2bed,
+ 0x1d98fae6007cffff, 0x00000075fa9d2bf5,
+ 0x1d8ffae7007cffff, 0x00000075fa9e2bfd,
+ 0x1d86fae8007cffff, 0x00000075fa9e2c04,
+ 0x1d7dfae8007cffff, 0x00000075fa9f2c0c,
+ 0x1d74fae9007cffff, 0x00000075faa02c14,
+ 0x1d6bfaea007bffff, 0x00000074faa02c1c,
+ 0x1d62faeb007bffff, 0x00000074faa12c24,
+ 0x1d59faec007bffff, 0x00000074faa22c2b,
+ 0x1d50faed007bffff, 0x00000074faa22c33,
+ 0x1d47faed007bffff, 0x00000074faa32c3b,
+ 0x1d3efaee007bffff, 0x00000074faa42c43,
+ 0x1d35faef007bffff, 0x00000073faa52c4a,
+ 0x1d2cfaf0007bffff, 0x00000073faa52c52,
+ 0x1d23faf1007bffff, 0x00000073faa62c5a,
+ 0x1d1afaf2007bffff, 0x00000073faa72c62,
+ 0x1d10faf3007bffff, 0x00000073faa82c69,
+ 0x1d07faf3007affff, 0x00000073faa82c71,
+ 0x1cfefaf4007affff, 0x00000072faa92c79,
+ 0x1cf5faf5007affff, 0x00000072faaa2c80,
+ 0x1cecfaf6007affff, 0x00000072faab2c88,
+ 0x1ce3faf7007affff, 0x00000072faab2c90,
+ 0x1cdafaf8007affff, 0x00000072faac2c97,
+ 0x1cd1faf9007affff, 0x00000072faad2c9f,
+ 0x1cc8faf9007affff, 0x00000071faae2ca7,
+ 0x1cbffafa007affff, 0x00000071faae2cae,
+ 0x1cb6fafb007affff, 0x00000071faaf2cb6,
+ 0x1cadfafc007affff, 0x00000071fab02cbe,
+ 0x1ca4fafd0079ffff, 0x00000071fab12cc5,
+ 0x1c9bfafe0079ffff, 0x00000070fab22ccd,
+ 0x1c92faff0079ffff, 0x00000070fab22cd5,
+ 0x1c89fb000079ffff, 0x00000070fab32cdc,
+ 0x1c80fb010079ffff, 0x00000070fab42ce4,
+ 0x1c77fb010079ffff, 0x00000070fab52cec,
+ 0x1c6dfb020079ffff, 0x00000070fab62cf3,
+ 0x1c64fb030079ffff, 0x0000006ffab72cfb,
+ 0x1c5bfb040079ffff, 0x0000006ffab72d02,
+ 0x1c52fb050079ffff, 0x0000006ffab82d0a,
+ 0x1c49fb060078ffff, 0x0000006ffab92d12,
+ 0x1c40fb070078ffff, 0x0000006ffaba2d19,
+ 0x1c37fb080078ffff, 0x0000006efabb2d21,
+ 0x1c2efb090078ffff, 0x0000006efabc2d28,
+ 0x1c25fb0a0078ffff, 0x0000006efabd2d30,
+ 0x1c1cfb0b0078ffff, 0x0000006efabd2d38,
+ 0x1c13fb0b0078ffff, 0x0000006efabe2d3f,
+ 0x1c0afb0c0078ffff, 0x0000006dfabf2d47,
+ 0x1c01fb0d0078ffff, 0x0000006dfac02d4e,
+ 0x1bf8fb0e0078ffff, 0x0000006dfac12d56,
+ 0x1beffb0f0078ffff, 0x0000006dfac22d5d,
+ 0x1be6fb100077ffff, 0x0000006dfac32d65,
+ 0x1bddfb110077ffff, 0x0000006cfac42d6c,
+ 0x1bd4fb120077ffff, 0x0000006cfac52d74,
+ 0x1bcbfb130077ffff, 0x0000006cfac62d7b,
+ 0x1bc2fb140077ffff, 0x0000006cfac72d83,
+ 0x1bb8fb150077ffff, 0x0000006cfac72d8a,
+ 0x1baffb160077ffff, 0x0000006bfac82d92,
+ 0x1ba6fb170077ffff, 0x0000006bfac92d99,
+ 0x1b9dfb170077ffff, 0x0000006bfaca2da1,
+ 0x1b94fb180076ffff, 0x0000006bfacb2da8,
+ 0x1b8bfb190076ffff, 0x0000006bfacc2db0,
+ 0x1b82fb1a0076ffff, 0x0000006afacd2db7,
+ 0x1b79fb1b0076ffff, 0x0000006aface2dbf,
+ 0x1b70fb1c0076ffff, 0x0000006afacf2dc6,
+ 0x1b67fb1d0076ffff, 0x0000006afad02dcd,
+ 0x1b5efb1e0076ffff, 0x0000006afad12dd5,
+ 0x1b55fb1f0076ffff, 0x00000069fad22ddc,
+ 0x1b4cfb200076ffff, 0x00000069fad32de4,
+ 0x1b43fb210076ffff, 0x00000069fad42deb,
+ 0x1b3afb220075ffff, 0x00000069fad52df2,
+ 0x1b31fb230075ffff, 0x00000069fad62dfa,
+ 0x1b28fb240075fffe, 0x00000068fad72e01,
+ 0x1b1ffb250075fffe, 0x00000068fad82e09,
+ 0x1b16fb260075fffe, 0x00000068fad92e10,
+ 0x1b0dfb270075fffe, 0x00000068fada2e17,
+ 0x1b04fb280075fffe, 0x00000067fadb2e1f,
+ 0x1afbfb290075fffe, 0x00000067fadc2e26,
+ 0x1af2fb2a0075fffe, 0x00000067fadd2e2d,
+ 0x1ae9fb2b0074fffe, 0x00000067fade2e35,
+ 0x1ae0fb2c0074fffe, 0x00000067fadf2e3c,
+ 0x1ad7fb2d0074fffe, 0x00000066fae02e43,
+ 0x1acefb2e0074fffe, 0x00000066fae22e4b,
+ 0x1ac4fb2f0074fffe, 0x00000066fae32e52,
+ 0x1abbfb300074fffe, 0x00000066fae42e59,
+ 0x1ab2fb310074fffe, 0x00000065fae52e61,
+ 0x1aa9fb320074fffe, 0x00000065fae62e68,
+ 0x1aa0fb330074fffe, 0x00000065fae72e6f,
+ 0x1a97fb340074fffe, 0x00000065fae82e77,
+ 0x1a8efb350073fffe, 0x00000065fae92e7e,
+ 0x1a85fb360073fffe, 0x00000064faea2e85,
+ 0x1a7cfb370073fffe, 0x00000064faeb2e8c,
+ 0x1a73fb380073fffe, 0x00000064faed2e94,
+ 0x1a6afb390073fffe, 0x00000064faee2e9b,
+ 0x1a61fb3a0073fffe, 0x00000063faef2ea2,
+ 0x1a58fb3b0073fffe, 0x00000063faf02ea9,
+ 0x1a4ffb3c0073fffe, 0x00000063faf12eb1,
+ 0x1a46fb3d0073fffe, 0x00000063faf22eb8,
+ 0x1a3dfb3e0072fffe, 0x00000062faf32ebf,
+ 0x1a34fb3f0072fffe, 0x00000062faf52ec6,
+ 0x1a2bfb400072fffe, 0x00000062faf62ecd,
+ 0x1a22fb410072fffe, 0x00000062faf72ed5,
+ 0x1a19fb420072fffe, 0x00000061faf82edc,
+ 0x1a10fb430072fffe, 0x00000061faf92ee3,
+ 0x1a07fb440072fffe, 0x00000061fafa2eea,
+ 0x19fefb450072fffe, 0x00000061fafc2ef1,
+ 0x19f5fb460072fffe, 0x00000060fafd2ef8,
+ 0x19ecfb470071fffe, 0x00000060fafe2f00,
+ 0x19e3fb480071fffe, 0x00000060faff2f07,
+ 0x19dafb490071fffe, 0x00000060fb002f0e,
+ 0x19d1fb4a0071fffe, 0x0000005ffb022f15,
+ 0x19c8fb4b0071fffe, 0x0000005ffb032f1c,
+ 0x19bffb4c0071fffe, 0x0000005ffb042f23,
+ 0x19b6fb4d0071fffe, 0x0000005ffb052f2a,
+ 0x19adfb4e0071fffe, 0x0000005efb072f32,
+ 0x19a4fb4f0071fffe, 0x0000005efb082f39,
+ 0x199bfb500070fffe, 0x0000005efb092f40,
+ 0x1992fb510070fffe, 0x0000005efb0a2f47,
+ 0x1989fb520070fffe, 0x0000005dfb0c2f4e,
+ 0x1980fb530070fffe, 0x0000005dfb0d2f55,
+ 0x1977fb540070fffe, 0x0000005dfb0e2f5c,
+ 0x196efb550070fffe, 0x0000005dfb0f2f63,
+ 0x1965fb560070fffe, 0x0000005cfb112f6a,
+ 0x195cfb570070fffe, 0x0000005cfb122f71,
+ 0x1953fb58006ffffe, 0x0000005cfb132f78,
+ 0x194afb59006ffffe, 0x0000005cfb152f7f,
+ 0x1941fb5a006ffffe, 0x0000005bfb162f86,
+ 0x1938fb5c006ffffe, 0x0000005bfb172f8d,
+ 0x192ffb5d006ffffe, 0x0000005bfb192f94,
+ 0x1926fb5e006ffffe, 0x0000005afb1a2f9b,
+ 0x191dfb5f006ffffe, 0x0000005afb1b2fa2,
+ 0x1914fb60006ffffe, 0x0000005afb1c2fa9,
+ 0x190bfb61006ffffe, 0x0000005afb1e2fb0,
+ 0x1902fb62006efffe, 0x00000059fb1f2fb7,
+ 0x18f9fb63006efffe, 0x00000059fb212fbe,
+ 0x18f1fb64006efffe, 0x00000059fb222fc5,
+ 0x18e8fb65006efffe, 0x00000059fb232fcc,
+ 0x18dffb66006efffe, 0x00000058fb252fd3,
+ 0x18d6fb67006efffe, 0x00000058fb262fda,
+ 0x18cdfb68006efffe, 0x00000058fb272fe1,
+ 0x18c4fb69006efffe, 0x00000057fb292fe8,
+ 0x18bbfb6a006dfffe, 0x00000057fb2a2fef,
+ 0x18b2fb6b006dfffd, 0x00000057fb2c2ff5,
+ 0x18a9fb6d006dfffd, 0x00000057fb2d2ffc,
+ 0x18a0fb6e006dfffd, 0x00000056fb2e3003,
+ 0x1897fb6f006dfffd, 0x00000056fb30300a,
+ 0x188efb70006dfffd, 0x00000056fb313011,
+ 0x1885fb71006dfffd, 0x00000055fb333018,
+ 0x187cfb72006dfffd, 0x00000055fb34301f,
+ 0x1873fb73006dfffd, 0x00000055fb353026,
+ 0x186afb74006cfffd, 0x00000055fb37302c,
+ 0x1861fb75006cfffd, 0x00000054fb383033,
+ 0x1858fb76006cfffd, 0x00000054fb3a303a,
+ 0x184ffb77006cfffd, 0x00000054fb3b3041,
+ 0x1846fb79006cfffd, 0x00000053fb3d3048,
+ 0x183dfb7a006cfffd, 0x00000053fb3e304f,
+ 0x1835fb7b006cfffd, 0x00000053fb403055,
+ 0x182cfb7c006cfffd, 0x00000052fb41305c,
+ 0x1823fb7d006bfffd, 0x00000052fb433063,
+ 0x181afb7e006bfffd, 0x00000052fb44306a,
+ 0x1811fb7f006bfffd, 0x00000052fb463070,
+ 0x1808fb80006bfffd, 0x00000051fb473077,
+ 0x17fffb81006bfffd, 0x00000051fb49307e,
+ 0x17f6fb82006bfffd, 0x00000051fb4a3085,
+ 0x17edfb84006bfffd, 0x00000050fb4c308b,
+ 0x17e4fb85006bfffd, 0x00000050fb4d3092,
+ 0x17dbfb86006afffd, 0x00000050fb4f3099,
+ 0x17d2fb87006afffd, 0x0000004ffb5030a0,
+ 0x17c9fb88006afffd, 0x0000004ffb5230a6,
+ 0x17c1fb89006afffd, 0x0000004ffb5330ad,
+ 0x17b8fb8a006afffd, 0x0000004efb5530b4,
+ 0x17affb8b006afffd, 0x0000004efb5630ba,
+ 0x17a6fb8c006afffd, 0x0000004efb5830c1,
+ 0x179dfb8e006afffd, 0x0000004efb5a30c8,
+ 0x1794fb8f0069fffd, 0x0000004dfb5b30ce,
+ 0x178bfb900069fffd, 0x0000004dfb5d30d5,
+ 0x1782fb910069fffd, 0x0000004dfb5e30dc,
+ 0x1779fb920069fffd, 0x0000004cfb6030e2,
+ 0x1770fb930069fffd, 0x0000004cfb6230e9,
+ 0x1768fb940069fffd, 0x0000004cfb6330f0,
+ 0x175ffb950069fffd, 0x0000004bfb6530f6,
+ 0x1756fb960069fffd, 0x0000004bfb6630fd,
+ 0x174dfb980068fffd, 0x0000004bfb683103,
+ 0x1744fb990068fffd, 0x0000004afb6a310a,
+ 0x173bfb9a0068fffd, 0x0000004afb6b3110,
+ 0x1732fb9b0068fffd, 0x0000004afb6d3117,
+ 0x1729fb9c0068fffd, 0x00000049fb6f311e,
+ 0x1721fb9d0068fffd, 0x00000049fb703124,
+ 0x1718fb9e0068fffd, 0x00000049fb72312b,
+ 0x170ffba00068fffd, 0x00000048fb733131,
+ 0x1706fba10067fffd, 0x00000048fb753138,
+ 0x16fdfba20067fffd, 0x00000048fb77313e,
+ 0x16f4fba30067fffd, 0x00000047fb793145,
+ 0x16ebfba40067fffd, 0x00000047fb7a314b,
+ 0x16e2fba50067fffd, 0x00000047fb7c3152,
+ 0x16dafba60067fffd, 0x00000046fb7e3158,
+ 0x16d1fba80067fffd, 0x00000046fb7f315f,
+ 0x16c8fba90067fffc, 0x00000046fb813165,
+ 0x16bffbaa0066fffc, 0x00000045fb83316c,
+ 0x16b6fbab0066fffc, 0x00000045fb843172,
+ 0x16adfbac0066fffc, 0x00000045fb863179,
+ 0x16a4fbad0066fffc, 0x00000044fb88317f,
+ 0x169cfbae0066fffc, 0x00000044fb8a3186,
+ 0x1693fbb00066fffc, 0x00000044fb8b318c,
+ 0x168afbb10066fffc, 0x00000043fb8d3192,
+ 0x1681fbb20066fffc, 0x00000043fb8f3199,
+ 0x1678fbb30065fffc, 0x00000043fb91319f,
+ 0x166ffbb40065fffc, 0x00010042fb9231a6,
+ 0x1667fbb50065fffc, 0x00010042fb9431ac,
+ 0x165efbb70065fffc, 0x00010042fb9631b2,
+ 0x1655fbb80065fffc, 0x00010041fb9831b9,
+ 0x164cfbb90065fffc, 0x00010041fb9a31bf,
+ 0x1643fbba0065fffc, 0x00010040fb9b31c6,
+ 0x163bfbbb0064fffc, 0x00010040fb9d31cc,
+ 0x1632fbbc0064fffc, 0x00010040fb9f31d2,
+ 0x1629fbbd0064fffc, 0x0001003ffba131d9,
+ 0x1620fbbf0064fffc, 0x0001003ffba331df,
+ 0x1617fbc00064fffc, 0x0001003ffba431e5,
+ 0x160efbc10064fffc, 0x0001003efba631ec,
+ 0x1606fbc20064fffc, 0x0001003efba831f2,
+ 0x15fdfbc30064fffc, 0x0001003efbaa31f8,
+ 0x15f4fbc40063fffc, 0x0001003dfbac31fe,
+ 0x15ebfbc60063fffc, 0x0001003dfbae3205,
+ 0x15e2fbc70063fffc, 0x0001003cfbb0320b,
+ 0x15dafbc80063fffc, 0x0001003cfbb13211,
+ 0x15d1fbc90063fffc, 0x0001003cfbb33217,
+ 0x15c8fbca0063fffc, 0x0001003bfbb5321e,
+ 0x15bffbcc0063fffc, 0x0001003bfbb73224,
+ 0x15b7fbcd0063fffc, 0x0001003bfbb9322a,
+ 0x15aefbce0062fffc, 0x0001003afbbb3230,
+ 0x15a5fbcf0062fffc, 0x0001003afbbd3237,
+ 0x159cfbd00062fffc, 0x00010039fbbf323d,
+ 0x1593fbd10062fffc, 0x00010039fbc13243,
+ 0x158bfbd30062fffc, 0x00010039fbc33249,
+ 0x1582fbd40062fffc, 0x00010038fbc4324f,
+ 0x1579fbd50062fffc, 0x00010038fbc63255,
+ 0x1570fbd60062fffc, 0x00010038fbc8325c,
+ 0x1568fbd70061fffc, 0x00010037fbca3262,
+ 0x155ffbd90061fffc, 0x00010037fbcc3268,
+ 0x1556fbda0061fffc, 0x00010036fbce326e,
+ 0x154dfbdb0061fffc, 0x00010036fbd03274,
+ 0x1545fbdc0061fffc, 0x00010036fbd2327a,
+ 0x153cfbdd0061fffc, 0x00010035fbd43280,
+ 0x1533fbde0061fffc, 0x00010035fbd63286,
+ 0x152afbe00060fffb, 0x00010034fbd8328d,
+ 0x1522fbe10060fffb, 0x00010034fbda3293,
+ 0x1519fbe20060fffb, 0x00010034fbdc3299,
+ 0x1510fbe30060fffb, 0x00010033fbde329f,
+ 0x1507fbe40060fffb, 0x00010033fbe032a5,
+ 0x14fffbe60060fffb, 0x00010032fbe232ab,
+ 0x14f6fbe70060fffb, 0x00010032fbe432b1,
+ 0x14edfbe80060fffb, 0x00010032fbe632b7,
+ 0x14e5fbe9005ffffb, 0x00010031fbe832bd,
+ 0x14dcfbea005ffffb, 0x00010031fbea32c3,
+ 0x14d3fbec005ffffb, 0x00010030fbec32c9,
+ 0x14cafbed005ffffb, 0x00010030fbee32cf,
+ 0x14c2fbee005ffffb, 0x00010030fbf032d5,
+ 0x14b9fbef005ffffb, 0x0001002ffbf332db,
+ 0x14b0fbf0005ffffb, 0x0001002ffbf532e1,
+ 0x14a8fbf2005efffb, 0x0001002efbf732e7,
+ 0x149ffbf3005efffb, 0x0001002efbf932ed,
+ 0x1496fbf4005efffb, 0x0001002efbfb32f3,
+ 0x148efbf5005efffb, 0x0001002dfbfd32f9,
+ 0x1485fbf6005efffb, 0x0001002dfbff32ff,
+ 0x147cfbf8005efffb, 0x0001002cfc013305,
+ 0x1473fbf9005efffb, 0x0001002cfc03330b,
+ 0x146bfbfa005efffb, 0x0001002cfc053310,
+ 0x1462fbfb005dfffb, 0x0001002bfc083316,
+ 0x1459fbfd005dfffb, 0x0001002bfc0a331c,
+ 0x1451fbfe005dfffb, 0x0001002afc0c3322,
+ 0x1448fbff005dfffb, 0x0001002afc0e3328,
+ 0x143ffc00005dfffb, 0x00010029fc10332e,
+ 0x1437fc01005dfffb, 0x00010029fc123334,
+ 0x142efc03005dfffb, 0x00010029fc143339,
+ 0x1425fc04005cfffb, 0x00010028fc17333f,
+ 0x141dfc05005cfffb, 0x00010028fc193345,
+ 0x1414fc06005cfffb, 0x00010027fc1b334b,
+ 0x140cfc07005cfffb, 0x00010027fc1d3351,
+ 0x1403fc09005cfffb, 0x00010027fc1f3357,
+ 0x13fafc0a005cfffb, 0x00010026fc22335c,
+ 0x13f2fc0b005cfffb, 0x00010026fc243362,
+ 0x13e9fc0c005cfffb, 0x00010025fc263368,
+ 0x13e0fc0e005bfffb, 0x00010025fc28336e,
+ 0x13d8fc0f005bfffb, 0x00010024fc2b3373,
+ 0x13cffc10005bfffb, 0x00010024fc2d3379,
+ 0x13c6fc11005bfffb, 0x00010023fc2f337f,
+ 0x13befc12005bfffa, 0x00010023fc313385,
+ 0x13b5fc14005bfffa, 0x00010023fc34338a,
+ 0x13adfc15005bfffa, 0x00010022fc363390,
+ 0x13a4fc16005afffa, 0x00020022fc383396,
+ 0x139bfc17005afffa, 0x00020021fc3a339b,
+ 0x1393fc19005afffa, 0x00020021fc3d33a1,
+ 0x138afc1a005afffa, 0x00020020fc3f33a7,
+ 0x1382fc1b005afffa, 0x00020020fc4133ac,
+ 0x1379fc1c005afffa, 0x0002001ffc4333b2,
+ 0x1370fc1e005afffa, 0x0002001ffc4633b8,
+ 0x1368fc1f005afffa, 0x0002001ffc4833bd,
+ 0x135ffc200059fffa, 0x0002001efc4a33c3,
+ 0x1357fc210059fffa, 0x0002001efc4d33c9,
+ 0x134efc220059fffa, 0x0002001dfc4f33ce,
+ 0x1346fc240059fffa, 0x0002001dfc5133d4,
+ 0x133dfc250059fffa, 0x0002001cfc5433d9,
+ 0x1334fc260059fffa, 0x0002001cfc5633df,
+ 0x132cfc270059fffa, 0x0002001bfc5833e5,
+ 0x1323fc290058fffa, 0x0002001bfc5b33ea,
+ 0x131bfc2a0058fffa, 0x0002001afc5d33f0,
+ 0x1312fc2b0058fffa, 0x0002001afc6033f5,
+ 0x130afc2c0058fffa, 0x0002001afc6233fb,
+ 0x1301fc2e0058fffa, 0x00020019fc643400,
+ 0x12f9fc2f0058fffa, 0x00020019fc673406,
+ 0x12f0fc300058fffa, 0x00020018fc69340b,
+ 0x12e7fc310057fffa, 0x00020018fc6c3411,
+ 0x12dffc330057fffa, 0x00020017fc6e3416,
+ 0x12d6fc340057fffa, 0x00020017fc70341c,
+ 0x12cefc350057fffa, 0x00020016fc733421,
+ 0x12c5fc360057fffa, 0x00020016fc753427,
+ 0x12bdfc370057fffa, 0x00020015fc78342c,
+ 0x12b4fc390057fffa, 0x00020015fc7a3432,
+ 0x12acfc3a0057fffa, 0x00020014fc7d3437,
+ 0x12a3fc3b0056fffa, 0x00020014fc7f343c,
+ 0x129bfc3c0056fffa, 0x00020013fc823442,
+ 0x1292fc3e0056fffa, 0x00020013fc843447,
+ 0x128afc3f0056fffa, 0x00020013fc86344d,
+ 0x1281fc400056fffa, 0x00020012fc893452,
+ 0x1279fc410056fff9, 0x00020012fc8b3457,
+ 0x1270fc430056fff9, 0x00020011fc8e345d,
+ 0x1268fc440055fff9, 0x00020011fc903462,
+ 0x125ffc450055fff9, 0x00020010fc933468,
+ 0x1257fc460055fff9, 0x00020010fc95346d,
+ 0x124efc480055fff9, 0x0002000ffc983472,
+ 0x1246fc490055fff9, 0x0002000ffc9b3478,
+ 0x123dfc4a0055fff9, 0x0002000efc9d347d,
+ 0x1235fc4b0055fff9, 0x0002000efca03482,
+ 0x122dfc4d0054fff9, 0x0002000dfca23487,
+ 0x1224fc4e0054fff9, 0x0002000dfca5348d,
+ 0x121cfc4f0054fff9, 0x0002000cfca73492,
+ 0x1213fc500054fff9, 0x0002000cfcaa3497,
+ 0x120bfc520054fff9, 0x0002000bfcac349d,
+ 0x1202fc530054fff9, 0x0002000bfcaf34a2,
+ 0x11fafc540054fff9, 0x0002000afcb234a7,
+ 0x11f1fc550054fff9, 0x0002000afcb434ac,
+ 0x11e9fc570053fff9, 0x00020009fcb734b1,
+ 0x11e1fc580053fff9, 0x00020009fcb934b7,
+ 0x11d8fc590053fff9, 0x00030008fcbc34bc,
+ 0x11d0fc5a0053fff9, 0x00030008fcbf34c1,
+ 0x11c7fc5c0053fff9, 0x00030007fcc134c6,
+ 0x11bffc5d0053fff9, 0x00030007fcc434cb,
+ 0x11b7fc5e0053fff9, 0x00030006fcc734d1,
+ 0x11aefc600052fff9, 0x00030006fcc934d6,
+ 0x11a6fc610052fff9, 0x00030005fccc34db,
+ 0x119dfc620052fff9, 0x00030005fcce34e0,
+ 0x1195fc630052fff9, 0x00030004fcd134e5,
+ 0x118dfc650052fff9, 0x00030004fcd434ea,
+ 0x1184fc660052fff9, 0x00030003fcd634ef,
+ 0x117cfc670052fff9, 0x00030003fcd934f4,
+ 0x1173fc680052fff9, 0x00030002fcdc34fa,
+ 0x116bfc6a0051fff9, 0x00030002fcdf34ff,
+ 0x1163fc6b0051fff9, 0x00030001fce13504,
+ 0x115afc6c0051fff9, 0x00030000fce43509,
+ 0x1152fc6d0051fff8, 0x00030000fce7350e,
+ 0x114afc6f0051fff8, 0x0003fffffce93513,
+ 0x1141fc700051fff8, 0x0003fffffcec3518,
+ 0x1139fc710051fff8, 0x0003fffefcef351d,
+ 0x1130fc720050fff8, 0x0003fffefcf23522,
+ 0x1128fc740050fff8, 0x0003fffdfcf43527,
+ 0x1120fc750050fff8, 0x0003fffdfcf7352c,
+ 0x1117fc760050fff8, 0x0003fffcfcfa3531,
+ 0x110ffc770050fff8, 0x0003fffcfcfd3536,
+ 0x1107fc790050fff8, 0x0003fffbfcff353b,
+ 0x10fefc7a0050fff8, 0x0003fffbfd023540,
+ 0x10f6fc7b004ffff8, 0x0003fffafd053545,
+ 0x10eefc7d004ffff8, 0x0003fffafd08354a,
+ 0x10e6fc7e004ffff8, 0x0003fff9fd0b354f,
+ 0x10ddfc7f004ffff8, 0x0003fff8fd0d3553,
+ 0x10d5fc80004ffff8, 0x0003fff8fd103558,
+ 0x10cdfc82004ffff8, 0x0003fff7fd13355d,
+ 0x10c4fc83004ffff8, 0x0003fff7fd163562,
+ 0x10bcfc84004ffff8, 0x0003fff6fd193567,
+ 0x10b4fc85004efff8, 0x0003fff6fd1c356c,
+ 0x10abfc87004efff8, 0x0003fff5fd1e3571,
+ 0x10a3fc88004efff8, 0x0003fff5fd213576,
+ 0x109bfc89004efff8, 0x0003fff4fd24357a,
+ 0x1093fc8a004efff8, 0x0003fff4fd27357f,
+ 0x108afc8c004efff8, 0x0003fff3fd2a3584,
+ 0x1082fc8d004efff8, 0x0003fff2fd2d3589,
+ 0x107afc8e004dfff8, 0x0003fff2fd30358e,
+ 0x1072fc90004dfff8, 0x0004fff1fd333592,
+ 0x1069fc91004dfff8, 0x0004fff1fd353597,
+ 0x1061fc92004dfff8, 0x0004fff0fd38359c,
+ 0x1059fc93004dfff8, 0x0004fff0fd3b35a1,
+ 0x1051fc95004dfff8, 0x0004ffeffd3e35a5,
+ 0x1048fc96004dfff8, 0x0004ffeffd4135aa,
+ 0x1040fc97004cfff7, 0x0004ffeefd4435af,
+ 0x1038fc98004cfff7, 0x0004ffedfd4735b4,
+ 0x1030fc9a004cfff7, 0x0004ffedfd4a35b8,
+ 0x1028fc9b004cfff7, 0x0004ffecfd4d35bd,
+ 0x101ffc9c004cfff7, 0x0004ffecfd5035c2,
+ 0x1017fc9d004cfff7, 0x0004ffebfd5335c6,
+ 0x100ffc9f004cfff7, 0x0004ffebfd5635cb,
+ 0x1007fca0004cfff7, 0x0004ffeafd5935d0,
+ 0x0ffefca1004bfff7, 0x0004ffe9fd5c35d4,
+ 0x0ff6fca3004bfff7, 0x0004ffe9fd5f35d9,
+ 0x0feefca4004bfff7, 0x0004ffe8fd6235de,
+ 0x0fe6fca5004bfff7, 0x0004ffe8fd6535e2,
+ 0x0fdefca6004bfff7, 0x0004ffe7fd6835e7,
+ 0x0fd6fca8004bfff7, 0x0004ffe7fd6b35eb,
+ 0x0fcdfca9004bfff7, 0x0004ffe6fd6e35f0,
+ 0x0fc5fcaa004afff7, 0x0004ffe5fd7135f5,
+ 0x0fbdfcab004afff7, 0x0004ffe5fd7435f9,
+ 0x0fb5fcad004afff7, 0x0004ffe4fd7735fe,
+ 0x0fadfcae004afff7, 0x0004ffe4fd7a3602,
+ 0x0fa5fcaf004afff7, 0x0004ffe3fd7d3607,
+ 0x0f9cfcb1004afff7, 0x0004ffe3fd80360b,
+ 0x0f94fcb2004afff7, 0x0004ffe2fd833610,
+ 0x0f8cfcb3004afff7, 0x0004ffe1fd863614,
+ 0x0f84fcb40049fff7, 0x0004ffe1fd893619,
+ 0x0f7cfcb60049fff7, 0x0004ffe0fd8d361d,
+ 0x0f74fcb70049fff7, 0x0004ffe0fd903622,
+ 0x0f6cfcb80049fff7, 0x0004ffdffd933626,
+ 0x0f64fcb90049fff7, 0x0004ffdefd96362b,
+ 0x0f5bfcbb0049fff7, 0x0004ffdefd99362f,
+ 0x0f53fcbc0049fff7, 0x0005ffddfd9c3634,
+ 0x0f4bfcbd0048fff7, 0x0005ffddfd9f3638,
+ 0x0f43fcbf0048fff6, 0x0005ffdcfda2363d,
+ 0x0f3bfcc00048fff6, 0x0005ffdbfda63641,
+ 0x0f33fcc10048fff6, 0x0005ffdbfda93645,
+ 0x0f2bfcc20048fff6, 0x0005ffdafdac364a,
+ 0x0f23fcc40048fff6, 0x0005ffdafdaf364e,
+ 0x0f1bfcc50048fff6, 0x0005ffd9fdb23652,
+ 0x0f13fcc60048fff6, 0x0005ffd8fdb53657,
+ 0x0f0bfcc70047fff6, 0x0005ffd8fdb9365b,
+ 0x0f03fcc90047fff6, 0x0005ffd7fdbc3660,
+ 0x0efafcca0047fff6, 0x0005ffd7fdbf3664,
+ 0x0ef2fccb0047fff6, 0x0005ffd6fdc23668,
+ 0x0eeafccd0047fff6, 0x0005ffd5fdc5366c,
+ 0x0ee2fcce0047fff6, 0x0005ffd5fdc93671,
+ 0x0edafccf0047fff6, 0x0005ffd4fdcc3675,
+ 0x0ed2fcd00046fff6, 0x0005ffd3fdcf3679,
+ 0x0ecafcd20046fff6, 0x0005ffd3fdd2367e,
+ 0x0ec2fcd30046fff6, 0x0005ffd2fdd63682,
+ 0x0ebafcd40046fff6, 0x0005ffd2fdd93686,
+ 0x0eb2fcd60046fff6, 0x0005ffd1fddc368a,
+ 0x0eaafcd70046fff6, 0x0005ffd0fddf368f,
+ 0x0ea2fcd80046fff6, 0x0005ffd0fde33693,
+ 0x0e9afcd90046fff6, 0x0005ffcffde63697,
+ 0x0e92fcdb0045fff6, 0x0005ffcefde9369b,
+ 0x0e8afcdc0045fff6, 0x0005ffcefded369f,
+ 0x0e82fcdd0045fff6, 0x0005ffcdfdf036a3,
+ 0x0e7afcde0045fff6, 0x0005ffcdfdf336a8,
+ 0x0e72fce00045fff6, 0x0005ffccfdf636ac,
+ 0x0e6afce10045fff6, 0x0005ffcbfdfa36b0,
+ 0x0e62fce20045fff6, 0x0005ffcbfdfd36b4,
+ 0x0e5afce40044fff6, 0x0005ffcafe0036b8,
+ 0x0e52fce50044fff5, 0x0006ffc9fe0436bc,
+ 0x0e4afce60044fff5, 0x0006ffc9fe0736c0,
+ 0x0e42fce70044fff5, 0x0006ffc8fe0b36c4,
+ 0x0e3afce90044fff5, 0x0006ffc7fe0e36c9,
+ 0x0e33fcea0044fff5, 0x0006ffc7fe1136cd,
+ 0x0e2bfceb0044fff5, 0x0006ffc6fe1536d1,
+ 0x0e23fcec0044fff5, 0x0006ffc6fe1836d5,
+ 0x0e1bfcee0043fff5, 0x0006ffc5fe1b36d9,
+ 0x0e13fcef0043fff5, 0x0006ffc4fe1f36dd,
+ 0x0e0bfcf00043fff5, 0x0006ffc4fe2236e1,
+ 0x0e03fcf20043fff5, 0x0006ffc3fe2636e5,
+ 0x0dfbfcf30043fff5, 0x0006ffc2fe2936e9,
+ 0x0df3fcf40043fff5, 0x0006ffc2fe2c36ed,
+ 0x0debfcf50043fff5, 0x0006ffc1fe3036f1,
+ 0x0de3fcf70042fff5, 0x0006ffc0fe3336f5,
+ 0x0ddbfcf80042fff5, 0x0006ffc0fe3736f9,
+ 0x0dd4fcf90042fff5, 0x0006ffbffe3a36fd,
+ 0x0dccfcfa0042fff5, 0x0006ffbefe3e3701,
+ 0x0dc4fcfc0042fff5, 0x0006ffbefe413705,
+ 0x0dbcfcfd0042fff5, 0x0006ffbdfe453708,
+ 0x0db4fcfe0042fff5, 0x0006ffbcfe48370c,
+ 0x0dacfd000042fff5, 0x0006ffbcfe4c3710,
+ 0x0da4fd010041fff5, 0x0006ffbbfe4f3714,
+ 0x0d9dfd020041fff5, 0x0006ffbafe533718,
+ 0x0d95fd030041fff5, 0x0006ffbafe56371c,
+ 0x0d8dfd050041fff5, 0x0006ffb9fe5a3720,
+ 0x0d85fd060041fff5, 0x0006ffb8fe5d3724,
+ 0x0d7dfd070041fff5, 0x0006ffb8fe613727,
+ 0x0d75fd080041fff5, 0x0007ffb7fe64372b,
+ 0x0d6efd0a0040fff4, 0x0007ffb6fe68372f,
+ 0x0d66fd0b0040fff4, 0x0007ffb6fe6b3733,
+ 0x0d5efd0c0040fff4, 0x0007ffb5fe6f3737,
+ 0x0d56fd0e0040fff4, 0x0007ffb4fe72373a,
+ 0x0d4efd0f0040fff4, 0x0007ffb4fe76373e,
+ 0x0d47fd100040fff4, 0x0007ffb3fe7a3742,
+ 0x0d3ffd110040fff4, 0x0007ffb2fe7d3746,
+ 0x0d37fd130040fff4, 0x0007ffb2fe813749,
+ 0x0d2ffd14003ffff4, 0x0007ffb1fe84374d,
+ 0x0d27fd15003ffff4, 0x0007ffb0fe883751,
+ 0x0d20fd16003ffff4, 0x0007ffb0fe8c3754,
+ 0x0d18fd18003ffff4, 0x0007ffaffe8f3758,
+ 0x0d10fd19003ffff4, 0x0007ffaefe93375c,
+ 0x0d08fd1a003ffff4, 0x0007ffaefe96375f,
+ 0x0d01fd1c003ffff4, 0x0007ffadfe9a3763,
+ 0x0cf9fd1d003ffff4, 0x0007ffacfe9e3767,
+ 0x0cf1fd1e003efff4, 0x0007ffabfea1376a,
+ 0x0ce9fd1f003efff4, 0x0007ffabfea5376e,
+ 0x0ce2fd21003efff4, 0x0007ffaafea93772,
+ 0x0cdafd22003efff4, 0x0007ffa9feac3775,
+ 0x0cd2fd23003efff4, 0x0007ffa9feb03779,
+ 0x0ccafd24003efff4, 0x0007ffa8feb4377c,
+ 0x0cc3fd26003efff4, 0x0007ffa7feb73780,
+ 0x0cbbfd27003efff4, 0x0007ffa7febb3784,
+ 0x0cb3fd28003dfff4, 0x0008ffa6febf3787,
+ 0x0cacfd29003dfff4, 0x0008ffa5fec3378b,
+ 0x0ca4fd2b003dfff4, 0x0008ffa5fec6378e,
+ 0x0c9cfd2c003dfff4, 0x0008ffa4feca3792,
+ 0x0c95fd2d003dfff3, 0x0008ffa3fece3795,
+ 0x0c8dfd2f003dfff3, 0x0008ffa2fed23799,
+ 0x0c85fd30003dfff3, 0x0008ffa2fed5379c,
+ 0x0c7efd31003cfff3, 0x0008ffa1fed937a0,
+ 0x0c76fd32003cfff3, 0x0008ffa0fedd37a3,
+ 0x0c6efd34003cfff3, 0x0008ffa0fee137a7,
+ 0x0c67fd35003cfff3, 0x0008ff9ffee437aa,
+ 0x0c5ffd36003cfff3, 0x0008ff9efee837ad,
+ 0x0c57fd37003cfff3, 0x0008ff9dfeec37b1,
+ 0x0c50fd39003cfff3, 0x0008ff9dfef037b4,
+ 0x0c48fd3a003cfff3, 0x0008ff9cfef437b8,
+ 0x0c40fd3b003bfff3, 0x0008ff9bfef737bb,
+ 0x0c39fd3c003bfff3, 0x0008ff9bfefb37be,
+ 0x0c31fd3e003bfff3, 0x0008ff9afeff37c2,
+ 0x0c2afd3f003bfff3, 0x0008ff99ff0337c5,
+ 0x0c22fd40003bfff3, 0x0008ff98ff0737c9,
+ 0x0c1afd41003bfff3, 0x0008ff98ff0b37cc,
+ 0x0c13fd43003bfff3, 0x0008ff97ff0e37cf,
+ 0x0c0bfd44003bfff3, 0x0008ff96ff1237d3,
+ 0x0c04fd45003afff3, 0x0008ff95ff1637d6,
+ 0x0bfcfd47003afff3, 0x0009ff95ff1a37d9,
+ 0x0bf4fd48003afff3, 0x0009ff94ff1e37dc,
+ 0x0bedfd49003afff3, 0x0009ff93ff2237e0,
+ 0x0be5fd4a003afff3, 0x0009ff92ff2637e3,
+ 0x0bdefd4c003afff3, 0x0009ff92ff2a37e6,
+ 0x0bd6fd4d003afff3, 0x0009ff91ff2d37e9,
+ 0x0bcffd4e003afff3, 0x0009ff90ff3137ed,
+ 0x0bc7fd4f0039fff3, 0x0009ff90ff3537f0,
+ 0x0bc0fd510039fff2, 0x0009ff8fff3937f3,
+ 0x0bb8fd520039fff2, 0x0009ff8eff3d37f6,
+ 0x0bb1fd530039fff2, 0x0009ff8dff4137f9,
+ 0x0ba9fd540039fff2, 0x0009ff8dff4537fd,
+ 0x0ba2fd560039fff2, 0x0009ff8cff493800,
+ 0x0b9afd570039fff2, 0x0009ff8bff4d3803,
+ 0x0b93fd580039fff2, 0x0009ff8aff513806,
+ 0x0b8bfd590038fff2, 0x0009ff8aff553809,
+ 0x0b84fd5b0038fff2, 0x0009ff89ff59380c,
+ 0x0b7cfd5c0038fff2, 0x0009ff88ff5d380f,
+ 0x0b75fd5d0038fff2, 0x0009ff87ff613813,
+ 0x0b6dfd5e0038fff2, 0x0009ff87ff653816,
+ 0x0b66fd600038fff2, 0x0009ff86ff693819,
+ 0x0b5efd610038fff2, 0x000aff85ff6d381c,
+ 0x0b57fd620038fff2, 0x000aff84ff71381f,
+ 0x0b4ffd630037fff2, 0x000aff84ff753822,
+ 0x0b48fd650037fff2, 0x000aff83ff793825,
+ 0x0b40fd660037fff2, 0x000aff82ff7d3828,
+ 0x0b39fd670037fff2, 0x000aff81ff81382b,
+ 0x0b32fd680037fff2, 0x000aff80ff85382e,
+ 0x0b2afd6a0037fff2, 0x000aff80ff893831,
+ 0x0b23fd6b0037fff2, 0x000aff7fff8d3834,
+ 0x0b1bfd6c0037fff2, 0x000aff7eff913837,
+ 0x0b14fd6d0036fff2, 0x000aff7dff96383a,
+ 0x0b0cfd6f0036fff2, 0x000aff7dff9a383d,
+ 0x0b05fd700036fff2, 0x000aff7cff9e3840,
+ 0x0afefd710036fff1, 0x000aff7bffa23843,
+ 0x0af6fd720036fff1, 0x000aff7affa63845,
+ 0x0aeffd740036fff1, 0x000aff7affaa3848,
+ 0x0ae7fd750036fff1, 0x000aff79ffae384b,
+ 0x0ae0fd760036fff1, 0x000aff78ffb2384e,
+ 0x0ad9fd770035fff1, 0x000aff77ffb73851,
+ 0x0ad1fd790035fff1, 0x000aff76ffbb3854,
+ 0x0acafd7a0035fff1, 0x000aff76ffbf3857,
+ 0x0ac3fd7b0035fff1, 0x000bff75ffc3385a,
+ 0x0abbfd7c0035fff1, 0x000bff74ffc7385c,
+ 0x0ab4fd7e0035fff1, 0x000bff73ffcb385f,
+ 0x0aadfd7f0035fff1, 0x000bff73ffd03862,
+ 0x0aa5fd800035fff1, 0x000bff72ffd43865,
+ 0x0a9efd810034fff1, 0x000bff71ffd83867,
+ 0x0a97fd830034fff1, 0x000bff70ffdc386a,
+ 0x0a8ffd840034fff1, 0x000bff6fffe0386d,
+ 0x0a88fd850034fff1, 0x000bff6fffe53870,
+ 0x0a81fd860034fff1, 0x000bff6effe93872,
+ 0x0a79fd880034fff1, 0x000bff6dffed3875,
+ 0x0a72fd890034fff1, 0x000bff6cfff13878,
+ 0x0a6bfd8a0034fff1, 0x000bff6bfff6387b,
+ 0x0a64fd8b0033fff1, 0x000bff6bfffa387d,
+ 0x0a5cfd8c0033fff1, 0x000bff6afffe3880,
+ 0x0a55fd8e0033fff1, 0x000bff6900023883,
+ 0x0a4efd8f0033fff1, 0x000bff6800073885,
+ 0x0a47fd900033fff1, 0x000bff67000b3888,
+ 0x0a3ffd910033fff1, 0x000bff67000f388b,
+ 0x0a38fd930033fff0, 0x000cff660014388d,
+ 0x0a31fd940033fff0, 0x000cff6500183890,
+ 0x0a2afd950033fff0, 0x000cff64001c3892,
+ 0x0a22fd960032fff0, 0x000cff6300203895,
+ 0x0a1bfd980032fff0, 0x000cff6300253898,
+ 0x0a14fd990032fff0, 0x000cff620029389a,
+ 0x0a0dfd9a0032fff0, 0x000cff61002d389d,
+ 0x0a06fd9b0032fff0, 0x000cff600032389f,
+ 0x09fefd9d0032fff0, 0x000cff5f003638a2,
+ 0x09f7fd9e0032fff0, 0x000cff5e003b38a4,
+ 0x09f0fd9f0032fff0, 0x000cff5e003f38a7,
+ 0x09e9fda00031fff0, 0x000cff5d004338a9,
+ 0x09e2fda10031fff0, 0x000cff5c004838ac,
+ 0x09dafda30031fff0, 0x000cff5b004c38ae,
+ 0x09d3fda40031fff0, 0x000cff5a005038b1,
+ 0x09ccfda50031fff0, 0x000cff5a005538b3,
+ 0x09c5fda60031fff0, 0x000cff59005938b6,
+ 0x09befda80031fff0, 0x000cff58005e38b8,
+ 0x09b7fda90031fff0, 0x000dff57006238ba,
+ 0x09b0fdaa0031fff0, 0x000dff56006738bd,
+ 0x09a8fdab0030fff0, 0x000dff55006b38bf,
+ 0x09a1fdac0030fff0, 0x000dff55006f38c2,
+ 0x099afdae0030fff0, 0x000dff54007438c4,
+ 0x0993fdaf0030fff0, 0x000dff53007838c6,
+ 0x098cfdb00030fff0, 0x000dff52007d38c9,
+ 0x0985fdb10030fff0, 0x000dff51008138cb,
+ 0x097efdb30030ffef, 0x000dff50008638cd,
+ 0x0977fdb40030ffef, 0x000dff50008a38d0,
+ 0x0970fdb5002fffef, 0x000dff4f008f38d2,
+ 0x0969fdb6002fffef, 0x000dff4e009338d4,
+ 0x0962fdb7002fffef, 0x000dff4d009838d7,
+ 0x095afdb9002fffef, 0x000dff4c009c38d9,
+ 0x0953fdba002fffef, 0x000dff4b00a138db,
+ 0x094cfdbb002fffef, 0x000dff4a00a538dd,
+ 0x0945fdbc002fffef, 0x000dff4a00aa38e0,
+ 0x093efdbe002fffef, 0x000dff4900ae38e2,
+ 0x0937fdbf002fffef, 0x000eff4800b338e4,
+ 0x0930fdc0002effef, 0x000eff4700b838e6,
+ 0x0929fdc1002effef, 0x000eff4600bc38e8,
+ 0x0922fdc2002effef, 0x000eff4500c138eb,
+ 0x091bfdc4002effef, 0x000eff4400c538ed,
+ 0x0914fdc5002effef, 0x000eff4400ca38ef,
+ 0x090dfdc6002effef, 0x000eff4300ce38f1,
+ 0x0906fdc7002effef, 0x000eff4200d338f3,
+ 0x08fffdc8002effef, 0x000eff4100d838f5,
+ 0x08f8fdca002dffef, 0x000eff4000dc38f7,
+ 0x08f1fdcb002dffef, 0x000eff3f00e138f9,
+ 0x08eafdcc002dffef, 0x000eff3e00e638fc,
+ 0x08e3fdcd002dffef, 0x000eff3e00ea38fe,
+ 0x08dcfdce002dffef, 0x000eff3d00ef3900,
+ 0x08d5fdd0002dffef, 0x000eff3c00f33902,
+ 0x08cefdd1002dffee, 0x000eff3b00f83904,
+ 0x08c7fdd2002dffee, 0x000fff3a00fd3906,
+ 0x08c1fdd3002dffee, 0x000fff3901013908,
+ 0x08bafdd5002cffee, 0x000fff380106390a,
+ 0x08b3fdd6002cffee, 0x000fff38010b390c,
+ 0x08acfdd7002cffee, 0x000fff370110390e,
+ 0x08a5fdd8002cffee, 0x000fff3601143910,
+ 0x089efdd9002cffee, 0x000fff3501193912,
+ 0x0897fddb002cffee, 0x000fff34011e3914,
+ 0x0890fddc002cffee, 0x000fff3301223916,
+ 0x0889fddd002cffee, 0x000fff3201273918,
+ 0x0882fdde002cffee, 0x000fff31012c391a,
+ 0x087cfddf002bffee, 0x000fff310131391b,
+ 0x0875fde1002bffee, 0x000fff300135391d,
+ 0x086efde2002bffee, 0x000fff2f013a391f,
+ 0x0867fde3002bffee, 0x000fff2e013f3921,
+ 0x0860fde4002bffee, 0x000fff2d01443923,
+ 0x0859fde5002bffee, 0x0010ff2c01483925,
+ 0x0852fde6002bffee, 0x0010ff2b014d3927,
+ 0x084cfde8002bffee, 0x0010ff2a01523928,
+ 0x0845fde9002bffee, 0x0010ff290157392a,
+ 0x083efdea002affee, 0x0010ff29015c392c,
+ 0x0837fdeb002affee, 0x0010ff280160392e,
+ 0x0830fdec002affee, 0x0010ff2701653930,
+ 0x082afdee002affee, 0x0010ff26016a3931,
+ 0x0823fdef002affee, 0x0010ff25016f3933,
+ 0x081cfdf0002affed, 0x0010ff2401743935,
+ 0x0815fdf1002affed, 0x0010ff2301793937,
+ 0x080efdf2002affed, 0x0010ff22017d3938,
+ 0x0808fdf4002affed, 0x0010ff210182393a,
+ 0x0801fdf50029ffed, 0x0010ff200187393c,
+ 0x07fafdf60029ffed, 0x0010ff20018c393d,
+ 0x07f3fdf70029ffed, 0x0010ff1f0191393f,
+ 0x07edfdf80029ffed, 0x0011ff1e01963941,
+ 0x07e6fdf90029ffed, 0x0011ff1d019b3942,
+ 0x07dffdfb0029ffed, 0x0011ff1c01a03944,
+ 0x07d8fdfc0029ffed, 0x0011ff1b01a43946,
+ 0x07d2fdfd0029ffed, 0x0011ff1a01a93947,
+ 0x07cbfdfe0029ffed, 0x0011ff1901ae3949,
+ 0x07c4fdff0028ffed, 0x0011ff1801b3394a,
+ 0x07befe010028ffed, 0x0011ff1701b8394c,
+ 0x07b7fe020028ffed, 0x0011ff1601bd394e,
+ 0x07b0fe030028ffed, 0x0011ff1501c2394f,
+ 0x07a9fe040028ffed, 0x0011ff1501c73951,
+ 0x07a3fe050028ffed, 0x0011ff1401cc3952,
+ 0x079cfe060028ffed, 0x0011ff1301d13954,
+ 0x0795fe080028ffed, 0x0011ff1201d63955,
+ 0x078ffe090028ffed, 0x0011ff1101db3957,
+ 0x0788fe0a0027ffed, 0x0012ff1001e03958,
+ 0x0782fe0b0027ffed, 0x0012ff0f01e5395a,
+ 0x077bfe0c0027ffed, 0x0012ff0e01ea395b,
+ 0x0774fe0d0027ffed, 0x0012ff0d01ef395d,
+ 0x076efe0f0027ffec, 0x0012ff0c01f4395e,
+ 0x0767fe100027ffec, 0x0012ff0b01f93960,
+ 0x0760fe110027ffec, 0x0012ff0a01fe3961,
+ 0x075afe120027ffec, 0x0012ff0902033962,
+ 0x0753fe130027ffec, 0x0012ff0802083964,
+ 0x074dfe140027ffec, 0x0012ff08020d3965,
+ 0x0746fe160026ffec, 0x0012ff0702123967,
+ 0x073ffe170026ffec, 0x0012ff0602173968,
+ 0x0739fe180026ffec, 0x0012ff05021c3969,
+ 0x0732fe190026ffec, 0x0012ff040222396b,
+ 0x072cfe1a0026ffec, 0x0013ff030227396c,
+ 0x0725fe1b0026ffec, 0x0013ff02022c396d,
+ 0x071ffe1d0026ffec, 0x0013ff010231396f,
+ 0x0718fe1e0026ffec, 0x0013ff0002363970,
+ 0x0711fe1f0026ffec, 0x0013feff023b3971,
+ 0x070bfe200025ffec, 0x0013fefe02403972,
+ 0x0704fe210025ffec, 0x0013fefd02453974,
+ 0x06fefe220025ffec, 0x0013fefc024a3975,
+ 0x06f7fe240025ffec, 0x0013fefb02503976,
+ 0x06f1fe250025ffec, 0x0013fefa02553977,
+ 0x06eafe260025ffec, 0x0013fef9025a3979,
+ 0x06e4fe270025ffec, 0x0013fef8025f397a,
+ 0x06ddfe280025ffec, 0x0013fef70264397b,
+ 0x06d7fe290025ffec, 0x0013fef70269397c,
+ 0x06d0fe2a0025ffec, 0x0014fef6026f397d,
+ 0x06cafe2c0024ffeb, 0x0014fef50274397e,
+ 0x06c3fe2d0024ffeb, 0x0014fef402793980,
+ 0x06bdfe2e0024ffeb, 0x0014fef3027e3981,
+ 0x06b7fe2f0024ffeb, 0x0014fef202833982,
+ 0x06b0fe300024ffeb, 0x0014fef102893983,
+ 0x06aafe310024ffeb, 0x0014fef0028e3984,
+ 0x06a3fe320024ffeb, 0x0014feef02933985,
+ 0x069dfe340024ffeb, 0x0014feee02983986,
+ 0x0696fe350024ffeb, 0x0014feed029e3987,
+ 0x0690fe360024ffeb, 0x0014feec02a33988,
+ 0x068afe370023ffeb, 0x0014feeb02a83989,
+ 0x0683fe380023ffeb, 0x0014feea02ad398a,
+ 0x067dfe390023ffeb, 0x0015fee902b3398b,
+ 0x0676fe3a0023ffeb, 0x0015fee802b8398c,
+ 0x0670fe3c0023ffeb, 0x0015fee702bd398d,
+ 0x066afe3d0023ffeb, 0x0015fee602c3398e,
+ 0x0663fe3e0023ffeb, 0x0015fee502c8398f,
+ 0x065dfe3f0023ffeb, 0x0015fee402cd3990,
+ 0x0657fe400023ffeb, 0x0015fee302d33991,
+ 0x0650fe410023ffeb, 0x0015fee202d83992,
+ 0x064afe420022ffeb, 0x0015fee102dd3993,
+ 0x0644fe430022ffeb, 0x0015fee002e33994,
+ 0x063dfe450022ffeb, 0x0015fedf02e83995,
+ 0x0637fe460022ffeb, 0x0015fede02ed3996,
+ 0x0631fe470022ffeb, 0x0015fedd02f33997,
+ 0x062afe480022ffeb, 0x0016fedc02f83998,
+ 0x0624fe490022ffea, 0x0016fedb02fd3998,
+ 0x061efe4a0022ffea, 0x0016feda03033999,
+ 0x0617fe4b0022ffea, 0x0016fed90308399a,
+ 0x0611fe4c0022ffea, 0x0016fed8030e399b,
+ 0x060bfe4e0021ffea, 0x0016fed70313399c,
+ 0x0605fe4f0021ffea, 0x0016fed60318399c,
+ 0x05fefe500021ffea, 0x0016fed5031e399d,
+ 0x05f8fe510021ffea, 0x0016fed40323399e,
+ 0x05f2fe520021ffea, 0x0016fed30329399f,
+ 0x05ecfe530021ffea, 0x0016fed2032e399f,
+ 0x05e5fe540021ffea, 0x0016fed1033339a0,
+ 0x05dffe550021ffea, 0x0016fed0033939a1,
+ 0x05d9fe570021ffea, 0x0017fecf033e39a2,
+ 0x05d3fe580021ffea, 0x0017fece034439a2,
+ 0x05ccfe590020ffea, 0x0017fecd034939a3,
+ 0x05c6fe5a0020ffea, 0x0017fecc034f39a4,
+ 0x05c0fe5b0020ffea, 0x0017fecb035439a4,
+ 0x05bafe5c0020ffea, 0x0017feca035a39a5,
+ 0x05b4fe5d0020ffea, 0x0017fec9035f39a6,
+ 0x05adfe5e0020ffea, 0x0017fec8036539a6,
+ 0x05a7fe5f0020ffea, 0x0017fec7036a39a7,
+ 0x05a1fe610020ffea, 0x0017fec6037039a8,
+ 0x059bfe620020ffea, 0x0017fec5037539a8,
+ 0x0595fe630020ffea, 0x0017fec4037b39a9,
+ 0x058ffe64001fffea, 0x0018fec3038039a9,
+ 0x0589fe65001fffea, 0x0018fec2038639aa,
+ 0x0582fe66001fffe9, 0x0018fec1038c39aa,
+ 0x057cfe67001fffe9, 0x0018fec0039139ab,
+ 0x0576fe68001fffe9, 0x0018febf039739ab,
+ 0x0570fe69001fffe9, 0x0018febe039c39ac,
+ 0x056afe6a001fffe9, 0x0018febd03a239ac,
+ 0x0564fe6c001fffe9, 0x0018febc03a739ad,
+ 0x055efe6d001fffe9, 0x0018febb03ad39ad,
+ 0x0558fe6e001fffe9, 0x0018feba03b339ae,
+ 0x0552fe6f001fffe9, 0x0018feb903b839ae,
+ 0x054bfe70001effe9, 0x0018feb803be39af,
+ 0x0545fe71001effe9, 0x0018feb703c339af,
+ 0x053ffe72001effe9, 0x0019feb603c939b0,
+ 0x0539fe73001effe9, 0x0019feb503cf39b0,
+ 0x0533fe74001effe9, 0x0019feb403d439b0,
+ 0x052dfe75001effe9, 0x0019feb303da39b1,
+ 0x0527fe76001effe9, 0x0019feb203e039b1,
+ 0x0521fe78001effe9, 0x0019feb103e539b1,
+ 0x051bfe79001effe9, 0x0019feb003eb39b2,
+ 0x0515fe7a001effe9, 0x0019feaf03f139b2,
+ 0x050ffe7b001effe9, 0x0019feae03f639b2,
+ 0x0509fe7c001dffe9, 0x0019fead03fc39b3,
+ 0x0503fe7d001dffe9, 0x0019feac040239b3,
+ 0x04fdfe7e001dffe9, 0x001afeab040739b3,
+ 0x04f7fe7f001dffe9, 0x001afeaa040d39b4,
+ 0x04f1fe80001dffe9, 0x001afea9041339b4,
+ 0x04ebfe81001dffe9, 0x001afea7041939b4,
+ 0x04e5fe82001dffe9, 0x001afea6041e39b4,
+ 0x04dffe83001dffe8, 0x001afea5042439b5,
+ 0x04d9fe85001dffe8, 0x001afea4042a39b5,
+ 0x04d3fe86001dffe8, 0x001afea3043039b5,
+ 0x04cdfe87001cffe8, 0x001afea2043539b5,
+ 0x04c7fe88001cffe8, 0x001afea1043b39b5,
+ 0x04c2fe89001cffe8, 0x001afea0044139b6,
+ 0x04bcfe8a001cffe8, 0x001afe9f044739b6,
+ 0x04b6fe8b001cffe8, 0x001bfe9e044c39b6,
+ 0x04b0fe8c001cffe8, 0x001bfe9d045239b6,
+ 0x04aafe8d001cffe8, 0x001bfe9c045839b6,
+ 0x04a4fe8e001cffe8, 0x001bfe9b045e39b6,
+ 0x049efe8f001cffe8, 0x001bfe9a046439b6,
+ 0x0498fe90001cffe8, 0x001bfe99046939b6,
+ 0x0492fe91001cffe8, 0x001bfe98046f39b6,
+ 0x048dfe92001cffe8, 0x001bfe97047539b7,
+ 0x0487fe93001bffe8, 0x001bfe96047b39b7,
+ 0x0481fe95001bffe8, 0x001bfe95048139b7
+};
diff --git a/Src/Plugins/Input/in_mod/mikamp/in_mod.rc b/Src/Plugins/Input/in_mod/mikamp/in_mod.rc
new file mode 100644
index 00000000..16d37864
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/in_mod.rc
@@ -0,0 +1,391 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_PREFS DIALOGEX 0, 0, 293, 205
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ CONTROL "Tab1",MM_PREFTAB,"SysTabControl32",WS_TABSTOP,4,3,285,180
+ DEFPUSHBUTTON "OK",IDOK,185,188,50,13
+ PUSHBUTTON "Cancel",IDCANCEL,239,188,50,13
+END
+
+IDD_ID3EDIT DIALOGEX 0, 0, 273, 239
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Module Info"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ EDITTEXT IDC_ID3_FN,4,4,265,12,ES_AUTOHSCROLL | ES_READONLY
+ RTEXT "Title",IDC_STATIC,4,22,14,8
+ EDITTEXT IDC_TITLE,22,21,133,12,ES_AUTOHSCROLL | ES_READONLY
+ RTEXT "Type",IDC_STATIC,160,22,15,8
+ EDITTEXT IDC_TYPE,180,21,89,12,ES_AUTOHSCROLL | ES_READONLY
+ GROUPBOX "Header Info",IDC_STATIC,4,38,130,57
+ LTEXT "File Size:\nLength:\nChannels:\nSamples:\nInstruments:",IDC_STATIC,8,49,45,40
+ LTEXT "",IDC_INFOLEFT,61,49,70,40
+ GROUPBOX "Player Info",IDC_STATIC,139,38,130,57
+ LTEXT "BPM:\nSong Spd:\nPosition:\nRow:\nVoices:",IDC_STATIC,142,49,45,40
+ LTEXT "",IDC_INFORIGHT,195,49,70,40
+ CONTROL "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,4,99,265,120
+ CONTROL "Track song",IDC_TRACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,224,52,10
+ DEFPUSHBUTTON "Close",IDOK,227,223,42,13
+END
+
+IDD_INSTRUMENTS DIALOGEX 0, 0, 262, 103
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LISTBOX IDC_INSTLIST,2,3,128,98,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Instrument Header",IDC_STATIC,134,0,125,101
+ LTEXT "Def. Volume:\nAuto-Vibrato:\nFade out:",IDC_STATIC,138,9,44,24
+ LTEXT "",IDC_INSTHEAD,190,9,64,24
+ GROUPBOX "Envelopes",IDC_STATIC,134,34,125,67
+ LTEXT "Volume:\nPanning:\nPitch:",IDC_STATIC,138,42,44,24
+ LTEXT "",IDC_INSTENV,190,42,64,24
+ GROUPBOX "Samples Used",IDC_STATIC,134,67,125,34
+ EDITTEXT TB_SAMPLELIST,137,77,119,21,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
+END
+
+IDD_SAMPLES DIALOGEX 0, 0, 262, 103
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LISTBOX IDC_SAMPLIST,2,3,128,98,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Sample Header",IDC_STATIC,134,0,125,68
+ LTEXT "Length:\nFormat:\nQuality:\nLooping:\nAuto-Vibrato:\nVolume:\nPanning:",IDC_STATIC,139,8,45,56
+ LTEXT "",IDC_SAMPINFO,190,8,66,56
+END
+
+IDD_COMMENT DIALOGEX 0, 0, 262, 103
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ EDITTEXT CEMENT_BOX,2,3,258,98,ES_MULTILINE | ES_READONLY | WS_VSCROLL | WS_HSCROLL
+END
+
+IDD_PREFTAB_DECODER DIALOGEX 0, 0, 282, 163
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ GROUPBOX "Song Looping",IDC_STATIC,4,1,273,64
+ CONTROL "Slider1",IDC_LOOPS,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,7,15,127,12
+ LTEXT "",IDC_LOOPTEXT,141,15,129,12
+ CONTROL "Unconditional Looping\n(Forces all songs to loop even if they lack specific loop information)",IDC_LOOPALL,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,9,32,126,27
+ CONTROL "Continue Play After Loop\n(useful for some games' modules, that contain several songs indeed)",IDC_CONT_LOOP,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,144,32,127,27
+ CONTROL "Play Unlisted Patterns\n(Otherwise-unplayed pattern data is tacked onto the end of the song)",IDC_PLAYALL,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_DISABLED | WS_TABSTOP,9,69,130,27
+ CONTROL "Use Resonant Lowpass Filters\n(Used by some Impulse Tracker songs; CPU intensive)",IDC_RESONANCE,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,144,69,131,27
+ CONTROL "Strip Trailing Silence\n(May cause some songs to end or loop a few seconds prematurely)",IDC_STRIPSILENCE,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,8,100,130,26
+ CONTROL "Seek by orders (as opposed to seek by seconds; song length will be displayed in orders, too)",IDC_SEEKBYORDERS,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,144,100,131,27
+ LTEXT "Stereo Separation",IDC_STATIC,4,140,42,18
+ LTEXT "0%",IDC_STATIC,48,132,17,9
+ LTEXT "100%",IDC_STATIC,102,132,21,9
+ LTEXT "400%",IDC_STATIC,159,132,22,9
+ CONTROL "Slider1",IDC_PANSEP,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,48,145,123,9
+ CONTROL "Fadeout for...",IDC_FADECHECK,"Button",BS_AUTOCHECKBOX | BS_TOP | WS_TABSTOP,205,132,69,10
+ EDITTEXT IDC_FADEOUT,205,145,49,12,ES_RIGHT | ES_AUTOHSCROLL | WS_DISABLED
+ CONTROL "Spin1",IDC_FADESPIN,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,248,145,8,13
+ LTEXT "sec.",IDC_FADESEC,260,148,14,10,WS_DISABLED
+END
+
+IDD_PREFTAB_MIXER DIALOGEX 0, 0, 282, 163
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+EXSTYLE WS_EX_TRANSPARENT | WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Output Mode",IDC_STATIC,4,1,134,47
+ CONTROL "Reverse Stereo",OUTMODE_REVERSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,15,72,10
+ LTEXT "Max voices:",IDC_STATIC,12,31,39,8
+ COMBOBOX IDC_VOICES,60,29,42,88,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Streaming",IDC_STATIC,4,49,134,29
+ CONTROL "Prompt to save to disk",IDC_SAVESTR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,61,85,11
+ GROUPBOX "Output Quality",IDC_STATIC,143,1,134,149
+ LTEXT "Mixing Rate:",IDC_STATIC,149,17,41,9
+ COMBOBOX OQ_QUALITY,195,15,66,76,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Interpolation\n(Disable for lower-quality sound and 20% improvement in mixer efficiency)",OQ_INTERP,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,149,33,121,35
+ CONTROL "FIR interpolation (high quality)",OQ_CUBIC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,149,71,109,10
+ CONTROL "Micro Volume-Ramping\n(Helps remove clicks and pops from interpolated sound)",OQ_NOCLICK,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,149,86,124,27
+ LTEXT "Note: Try lower sample rates before disabling interpolation for slower machines. It sounds better that way.",IDC_STATIC,150,116,121,30
+END
+
+IDD_PREFTAB_LOADER DIALOGEX 0, 0, 282, 163
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+EXSTYLE WS_EX_TRANSPARENT | WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Available Loaders:",IDC_STATIC,4,2,80,9
+ LISTBOX IDLDR_LIST,4,11,118,59,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Default Panning",IDC_STATIC,4,72,118,88
+ LTEXT "Mono",IDC_STATIC,8,81,19,8
+ LTEXT "Full Stereo",IDC_STATIC,83,81,34,9
+ CONTROL "Slider1",IDLDR_PANPOS,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,14,92,96,12
+ CTEXT "Default panning is only set at load-time and can be overridden by the song during replay",IDC_STATIC,8,111,108,25
+ PUSHBUTTON "Reset",IDC_DEFPAN,30,141,65,13
+ LTEXT "",IDLDR_DESCRIPTION,133,4,143,34
+ CONTROL "Enabled\n(When disabled, this filetype is ignored by Mikamp)",IDLDR_ENABLED,
+ "Button",BS_3STATE | BS_TOP | BS_MULTILINE | WS_TABSTOP,133,42,137,27
+ GROUPBOX "Advanced Effects Options",IDC_STATIC,128,72,149,88
+ CONTROL "Disable DMP Panning Effects (8xx)\n(Select this for songs that seem to incorrectly pan to the left speaker)",IDLDR_EFFOPT1,
+ "Button",BS_3STATE | BS_TOP | BS_MULTILINE | WS_TABSTOP,133,84,137,25
+ CONTROL "Disable Resonance Filter Effects (Zxx)",IDLDR_EFFOPT2,
+ "Button",BS_3STATE | BS_TOP | WS_TABSTOP,133,113,138,10
+ CTEXT "It is not recommended to change the advanced options unless you really\nknow what you are doing",IDC_ADV_TEXT_INFO,132,129,138,25,WS_DISABLED
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "#include ""version.rc2""\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_PREFS, DIALOG
+ BEGIN
+ LEFTMARGIN, 4
+ RIGHTMARGIN, 289
+ TOPMARGIN, 3
+ BOTTOMMARGIN, 201
+ END
+
+ IDD_ID3EDIT, DIALOG
+ BEGIN
+ LEFTMARGIN, 4
+ RIGHTMARGIN, 269
+ TOPMARGIN, 2
+ BOTTOMMARGIN, 236
+ END
+
+ IDD_INSTRUMENTS, DIALOG
+ BEGIN
+ LEFTMARGIN, 2
+ RIGHTMARGIN, 259
+ TOPMARGIN, 3
+ BOTTOMMARGIN, 101
+ END
+
+ IDD_SAMPLES, DIALOG
+ BEGIN
+ LEFTMARGIN, 2
+ RIGHTMARGIN, 259
+ TOPMARGIN, 3
+ BOTTOMMARGIN, 101
+ END
+
+ IDD_COMMENT, DIALOG
+ BEGIN
+ LEFTMARGIN, 2
+ RIGHTMARGIN, 260
+ TOPMARGIN, 3
+ BOTTOMMARGIN, 100
+ END
+
+ IDD_PREFTAB_DECODER, DIALOG
+ BEGIN
+ LEFTMARGIN, 4
+ RIGHTMARGIN, 278
+ TOPMARGIN, 1
+ BOTTOMMARGIN, 159
+ END
+
+ IDD_PREFTAB_MIXER, DIALOG
+ BEGIN
+ LEFTMARGIN, 4
+ RIGHTMARGIN, 278
+ BOTTOMMARGIN, 159
+ END
+
+ IDD_PREFTAB_LOADER, DIALOG
+ BEGIN
+ LEFTMARGIN, 4
+ RIGHTMARGIN, 277
+ TOPMARGIN, 2
+ BOTTOMMARGIN, 160
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDS_NULLSOFT_MODULE_DECODER "Nullsoft Module Decoder v%s"
+ 65535 "{A1A39D49-671A-4c2f-AE42-BEA134EAF6A9}"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_NULLSOFT_MODULE_DECODER_OLD "Nullsoft Module Decoder"
+ IDS_PROTRACKER_AND_CLONES
+ "Protracker and clones [mod]:\nIncludes Protracker, Fasttracker 1, Taketracker, Startrekker. Limited to 31 samples."
+ IDS_OLD_SKOOL_AMIGA_MODULES
+ "Old-skool Amiga Modules [mod]:\nSoundtracker, Ultimate Soundtracker. Very old and extremely limited in many ways (4 channels, 15 samples)"
+ IDS_SCREAM_TRACKER_2XX "Scream Tracker 2.xx [stm]:\nSimilar to ST3 modules, but limited to 4 channels; Various format quirks."
+ IDS_SCREAM_TRACKER_3XX "Scream Tracker 3.xx [s3m]:\nUp to 32 channels; Features a wavetable/FM combo (albeit rarely used)."
+ IDS_IMPULSE_TRACKER "Impulse Tracker (all versions) [it]:\nSupports 64 channels, new note actions, and resonance filters."
+ IDS_FASTTRACKER_2XX "Fasttracker 2.xx [xm]:\nSupports 32 channels, 128 instruments, and volume/panning envelopes."
+ IDS_MULTITRACKER "Multitracker [mtm]:\nA ""superfied"" Protracker-based format, features std effects /w 32 channels."
+ IDS_ULTRA_TRACKER "Ultra Tracker [ult]:\nDesigned specifically for the Gravis Ultrasound, features 32 channels and two effects per row."
+ IDS_COMPOSER_669 "Composer 669/UNIS 669 [669]:\nOne of the first PC trackers. 8 channels, up to 64 samples, few effects."
+ IDS_FARANDOLE_COMPOSER "Farandole Composer [far]:\nYet another composer. The 16 channel version of the Composer 669, but with more messy effects."
+ IDS_DIGITAL_SOUND_AND_MUSIC_INTERFACE
+ "Digital Sound and Music Interface [amf]:\nAdvanced Module Format... May be even too advanced to support it... Anyway, here it goes."
+ IDS_AMIGA_OKTALYZER "Amiga Oktalyzer [okt]:\n4-8 voices, 36 samples (usually), rather strange effects. The source code is about 20000 lines!"
+ IDS_POLYTRACKER "PolyTracker [ptm]:\nA Scream Tracker 3 clone (with ""protrac- kerized"" effects and some extra features), created by Lone Ranger / AcmE."
+ IDS_MULTIPLE_ITEMS_SELECTED "Multiple items selected..."
+ IDS_MUSIC_MODULES "Music Modules"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_MIXER "Mixer"
+ IDS_PLAYER "Player"
+ IDS_LOADERS "Loaders"
+ IDS_DEFAULT " (default)"
+ IDS_SELECT_ANY_LOADER "Select any loader(s) to edit their properties..."
+ IDS_DO_NOT_LOOP "Do not loop"
+ IDS_LOOP_FOREVER "Loop forever"
+ IDS_LOOP_X_TIMES "Loop %d times"
+ IDS_PREFERENCES_TITLE "%s Preferences"
+ IDS_SAMPLES "Samples"
+ IDS_INSTRUMENTS "Instruments"
+ IDS_COMMENT "Comment"
+ IDS_YES "Yes"
+ IDS_NO "No"
+ IDS_SUSTAIN "Sustain"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_FINETUNE "(finetune)"
+ IDS_HZ_SIGNED "Hz signed"
+ IDS_HZ_UNSIGNED "Hz unsigned"
+ IDS_PING_PONG "Ping-Pong"
+ IDS_REVERSE "Reverse"
+ IDS_FORWARD "Forward"
+ IDS_SUSTAIN_PING_PONG "Sustain Ping-Pong"
+ IDS_NONE "None"
+ IDS_X_X_X_OF_X_NOT_PLAYING "%d\n%d\n0 of %d\n\nNot Playing..."
+ IDS_X_X_X_OF_X_X_OF_X_X_OF_X "%d\n%d\n%d of %d (%d)\n%d of %d\n%d (%d)"
+ IDS_X_BTYES_X_OF_X_MINUTES "%d bytes\n%d:%02d minutes\n%d\n%d\n%d"
+ IDS_URLS_ONLY_SUPPORTED_IN_2_10_PLUS "URLs only supported in Winamp 2.10+"
+ IDS_MOD_PLUGIN_ERROR "Module Plug-in Error"
+ IDS_SAVE_MODULE "Save Module"
+ IDS_ALL_FILES "All files"
+ IDS_RETRIEVING_MODULE "Retrieving Module"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_ERROR_KILLING_DECODING_THREAD "Error killing decoding thread."
+ IDS_LOOP "Loop"
+ IDS_ON "On"
+ IDS_OFF "Off"
+ IDS_BYTES "bytes"
+ IDS_BITS "bits"
+ IDS_FAMILY_STRING_COMPOSER_669 "Composer 669"
+ IDS_FAMILY_STRING_DSMI_AMF "DSMI AMF"
+ IDS_FAMILY_STRING_FARANDOLE_COMPOSER "Farandole Composer"
+ IDS_FAMILY_STRING_IMPULSETRACKER "Impulsetracker"
+ IDS_FAMILY_STRING_SOUNDTRACKER "Soundtracker (15-inst)"
+ IDS_FAMILY_STRING_PROTRACKER "Protracker"
+ IDS_FAMILY_STRING_MULTITRACKER "Multitracker"
+ IDS_FAMILY_STRING_AMIGA_OKTALYZER "Amiga Oktalyzer"
+ IDS_FAMILY_STRING_POLYTRACKER "PolyTracker"
+ IDS_FAMILY_STRING_SCREAMTRACKER3 "Screamtracker 3"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_FAMILY_STRING_SCREAMTRACKER2 "Screamtracker 2"
+ IDS_FAMILY_STRING_ULTRATRACKER "Ultratracker"
+ IDS_FAMILY_STRING_FASTRACKER2 "Fasttracker 2"
+ IDS_FAMILY_STRING_NOISETRACKER "NoiseTracker Module"
+ IDS_X_MODULE "%s Module"
+ IDS_X_COMPRESSED_MODULE "%s Compressed Module"
+ IDS_ABOUT_TEXT "%s\n© 1998-2014 Winamp SA\nWritten by: Justin Frankel & Jake Stine\nBuild date: %hs\n\nMikamp - Nullsoft Module Decoder plug-in\nbased on the Mikmod Sound System\n\nModule loading & rendering by: Jake Stine\nThanks to Jeffrey Lim for additional Impulse Tracker info.\nAdditional code by: Peter Pawlowski & X-Fixer"
+ IDS_CORRUPT_UNSUPPORTED_TYPE "Corrupt file or unsupported module type."
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+#include "version.rc2"
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/Src/Plugins/Input/in_mod/mikamp/include/Main.h b/Src/Plugins/Input/in_mod/mikamp/include/Main.h
new file mode 100644
index 00000000..9f9b9171
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/include/Main.h
@@ -0,0 +1,106 @@
+#ifndef __MIKAMP_MAIN_H__
+#define __MIKAMP_MAIN_H__
+
+#include <windows.h>
+#include <stdio.h>
+#include "mikmod.h"
+#include "mplayer.h"
+#include "resource.h"
+#include "in2.h"
+
+#define INFO_CPAGES 3
+
+#define CPLAYFLG_LOOPALL (1ul<<0) // disables selective looping - loop everything!
+#define CPLAYFLG_PLAYALL (1ul<<1) // plays hidden patterns (tack onto end of the song)
+#define CPLAYFLG_FADEOUT (1ul<<2) // Fadeout the song before the end cometh?
+#define CPLAYFLG_STRIPSILENCE (1ul<<3) // Strip silence at the end of the song?
+#define CPLAYFLG_SEEKBYORDERS (1ul<<4) // Seek by orders instead of seconds
+#define CPLAYFLG_CONT_LOOP (1ul<<5) // continue after loop
+
+typedef struct tag_dlghdr
+{
+ HWND hwndTab; // tab control
+ HWND hwndDisplay; // current child dialog box
+ int left,top;
+ HWND apRes[INFO_CPAGES];
+
+ UNIMOD *module;
+ MPLAYER *seeker;
+ int maxv;
+
+ BOOL inUse, ownModule;
+ BOOL *suse;
+
+} DLGHDR;
+
+
+typedef struct INFOBOX
+{
+ HWND hwnd;
+ DLGHDR dlg;
+ struct INFOBOX *next;
+} INFOBOX;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern UBYTE config_nopan, config_savestr;
+extern MD_DEVICE drv_amp;
+extern MD_DEVICE drv_buffer;
+extern In_Module mikmod;
+extern UNIMOD *mf;
+extern MPLAYER *mp;
+
+// Defined in INFO.C
+// -----------------
+extern INFOBOX *infobox_list;
+extern void infoDlg(HWND hwnd, UNIMOD *m, BOOL activate, BOOL primiary);
+extern int config_info_x, config_info_y, config_track;
+
+
+// Defined in INFO.C
+// -----------------
+// defined in config.c
+
+extern UBYTE config_interp;
+extern UBYTE config_panrev;
+extern UBYTE config_cpu;
+extern uint config_srate, config_voices, config_playflag;
+extern int config_pansep, config_loopcount;
+extern UBYTE config_samplesize;
+
+extern UBYTE config_resonance;
+extern int config_fadeout;
+extern int config_tsel;
+
+extern int paused;
+
+
+// config.c shizat
+// ---------------
+extern void set_priority(void);
+
+extern void __cdecl config(HWND hwndParent);
+extern void __cdecl about(HWND hwndParent);
+
+extern void config_read();
+extern void config_write();
+
+extern void info_killseeker(HWND hwnd);
+
+int GetNumChannels();
+int AllowSurround();
+int GetThreadPriorityConfig();
+
+BOOL GetTypeInfo(LPCWSTR pszType, LPWSTR pszDest, INT cchDest);
+
+#ifdef __cplusplus
+};
+#endif
+
+//#define PLUGIN_NAME "Nullsoft Module Decoder"
+#define PLUGIN_VER L"2.94"
+
+#endif
diff --git a/Src/Plugins/Input/in_mod/mikamp/include/in2.h b/Src/Plugins/Input/in_mod/mikamp/include/in2.h
new file mode 100644
index 00000000..2c045b84
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/include/in2.h
@@ -0,0 +1 @@
+#include "../../../Winamp/in2.h" \ No newline at end of file
diff --git a/Src/Plugins/Input/in_mod/mikamp/int64.lib b/Src/Plugins/Input/in_mod/mikamp/int64.lib
new file mode 100644
index 00000000..92201d43
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/int64.lib
Binary files differ
diff --git a/Src/Plugins/Input/in_mod/mikamp/mikamp.dsp b/Src/Plugins/Input/in_mod/mikamp/mikamp.dsp
new file mode 100644
index 00000000..5107ca40
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/mikamp.dsp
@@ -0,0 +1,167 @@
+# Microsoft Developer Studio Project File - Name="mikamp" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=mikamp - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "mikamp.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "mikamp.mak" CFG="mikamp - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "mikamp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "mikamp - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "mikamp - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /Z7 /Ox /Ow /Og /Oi /Os /Gf /Gy /I "." /I "include" /I "..\lib\mikmod\include" /I "..\lib\mmio\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /Gs0 /FD /c
+# SUBTRACT CPP /Ot /Fr
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib int64.lib /nologo /dll /machine:I386 /out:"c:\program files\winamp\plugins\in_mod.dll" /opt:nowin98
+# SUBTRACT LINK32 /pdb:none /nodefaultlib
+
+!ELSEIF "$(CFG)" == "mikamp - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "include" /I "..\lib\mikmod\include" /I "..\lib\mmio\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /dll /debug /machine:I386 /out:"c:\program files\winamp\plugins\in_mod.dll" /pdbtype:sept
+# SUBTRACT LINK32 /nodefaultlib
+
+!ENDIF
+
+# Begin Target
+
+# Name "mikamp - Win32 Release"
+# Name "mikamp - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\src\config.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\src\drv_amp.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\src\info.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\src\main.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\src\rf_wrapper.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\src\tagz.cpp
+
+!IF "$(CFG)" == "mikamp - Win32 Release"
+
+# ADD CPP /GX-
+
+!ELSEIF "$(CFG)" == "mikamp - Win32 Debug"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\src\tagz.h
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\include\in2.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\include\main.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\include\out.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\Winamp\wa_ipc.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\resource.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\script1.rc
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/Src/Plugins/Input/in_mod/mikamp/mikamp.sln b/Src/Plugins/Input/in_mod/mikamp/mikamp.sln
new file mode 100644
index 00000000..b782d75b
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/mikamp.sln
@@ -0,0 +1,31 @@
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "in_mod (mikamp)", "mikamp.vcproj", "{3580EE92-4F7B-4322-A04C-B2B7B5578879}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "in_mod (mikmod)", "..\lib\mikmod\mikmod.vcproj", "{47FCA4AF-1F6B-4A1A-8AF2-1BD9E11672DD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "in_mod (mmio)", "..\lib\mmio\mmio.vcproj", "{BE408A85-4302-4EB8-8DE3-E3F9A5B25715}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3580EE92-4F7B-4322-A04C-B2B7B5578879}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3580EE92-4F7B-4322-A04C-B2B7B5578879}.Debug|Win32.Build.0 = Debug|Win32
+ {3580EE92-4F7B-4322-A04C-B2B7B5578879}.Release|Win32.ActiveCfg = Release|Win32
+ {3580EE92-4F7B-4322-A04C-B2B7B5578879}.Release|Win32.Build.0 = Release|Win32
+ {47FCA4AF-1F6B-4A1A-8AF2-1BD9E11672DD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {47FCA4AF-1F6B-4A1A-8AF2-1BD9E11672DD}.Debug|Win32.Build.0 = Debug|Win32
+ {47FCA4AF-1F6B-4A1A-8AF2-1BD9E11672DD}.Release|Win32.ActiveCfg = Release|Win32
+ {47FCA4AF-1F6B-4A1A-8AF2-1BD9E11672DD}.Release|Win32.Build.0 = Release|Win32
+ {BE408A85-4302-4EB8-8DE3-E3F9A5B25715}.Debug|Win32.ActiveCfg = Debug|Win32
+ {BE408A85-4302-4EB8-8DE3-E3F9A5B25715}.Debug|Win32.Build.0 = Debug|Win32
+ {BE408A85-4302-4EB8-8DE3-E3F9A5B25715}.Release|Win32.ActiveCfg = Release|Win32
+ {BE408A85-4302-4EB8-8DE3-E3F9A5B25715}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Src/Plugins/Input/in_mod/mikamp/mikamp.vcproj b/Src/Plugins/Input/in_mod/mikamp/mikamp.vcproj
new file mode 100644
index 00000000..3186535b
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/mikamp.vcproj
@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="in_mod (mikamp)"
+ ProjectGUID="{3580EE92-4F7B-4322-A04C-B2B7B5578879}"
+ RootNamespace="in_mod (mikamp)"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/mikamp.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../Wasabi;.;include;..\lib\mikmod\include;..\lib\mmio\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile=".\Debug/mikamp.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ BrowseInformation="1"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="4"
+ CompileAs="0"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="comctl32.lib int64.lib shlwapi.lib ../../nsutil/nsutil.lib"
+ OutputFile="$(ProgramFiles)\winamp\plugins\in_mod.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\Debug/in_mod.pdb"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary=".\Debug/in_mod.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/mikamp.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="1"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="2"
+ AdditionalIncludeDirectories="../../Wasabi;.;include;..\lib\mikmod\include;..\lib\mmio\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile=".\Release/mikamp.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile="$(IntDir)/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="comctl32.lib int64.lib shlwapi.lib ../../nsutil/nsutil.lib"
+ OutputFile="$(ProgramFiles)\winamp\plugins\in_mod.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateManifest="false"
+ IgnoreDefaultLibraryNames="msvcprt.lib"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/$(ProjectName).pdb"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ ImportLibrary=".\Release/in_mod.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ <ProjectReference
+ ReferencedProjectIdentifier="{47FCA4AF-1F6B-4A1A-8AF2-1BD9E11672DD}"
+ RelativePathToProject="..\in_mod\lib\mikmod\mikmod.vcproj"
+ />
+ <ProjectReference
+ ReferencedProjectIdentifier="{BE408A85-4302-4EB8-8DE3-E3F9A5B25715}"
+ RelativePathToProject="..\in_mod\lib\mmio\mmio.vcproj"
+ />
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ <File
+ RelativePath="src\config.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;$(NoInherit)"
+ BasicRuntimeChecks="3"
+ BrowseInformation="1"
+ CompileAs="2"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ CompileAs="2"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="src\drv_amp.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;$(NoInherit)"
+ BasicRuntimeChecks="3"
+ BrowseInformation="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\src\drv_buffer.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\src\drv_buffer.h"
+ >
+ </File>
+ <File
+ RelativePath=".\src\ExtendedRead.cpp"
+ >
+ </File>
+ <File
+ RelativePath="src\info.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;$(NoInherit)"
+ BasicRuntimeChecks="3"
+ BrowseInformation="1"
+ CompileAs="2"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ CompileAs="2"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="src\main.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;$(NoInherit)"
+ BasicRuntimeChecks="3"
+ BrowseInformation="1"
+ CompileAs="2"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ CompileAs="2"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\playbackconfig.cpp"
+ >
+ </File>
+ <File
+ RelativePath="src\rf_wrapper.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;$(NoInherit)"
+ BasicRuntimeChecks="3"
+ BrowseInformation="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ <File
+ RelativePath=".\src\api.h"
+ >
+ </File>
+ <File
+ RelativePath="include\in2.h"
+ >
+ </File>
+ <File
+ RelativePath="include\main.h"
+ >
+ </File>
+ <File
+ RelativePath="include\out.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ <File
+ RelativePath=".\in_mod.rc"
+ >
+ </File>
+ <File
+ RelativePath="resource.h"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath=".\int64.lib"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/Src/Plugins/Input/in_mod/mikamp/playbackconfig.cpp b/Src/Plugins/Input/in_mod/mikamp/playbackconfig.cpp
new file mode 100644
index 00000000..24e7d16f
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/playbackconfig.cpp
@@ -0,0 +1,78 @@
+#include "main.h"
+#include "../winamp/wa_ipc.h"
+#include <api/service/waServiceFactory.h>
+#include "../../Agave/Config/api_config.h"
+
+// {B6CB4A7C-A8D0-4c55-8E60-9F7A7A23DA0F}
+static const GUID playbackConfigGroupGUID =
+{ 0xb6cb4a7c, 0xa8d0, 0x4c55, { 0x8e, 0x60, 0x9f, 0x7a, 0x7a, 0x23, 0xda, 0xf } };
+
+static api_config *configApi=0;
+
+api_config *GetConfigAPI()
+{
+ if (mikmod.service && !configApi)
+ {
+ waServiceFactory *sf = (waServiceFactory *)mikmod.service->service_getServiceByGuid(AgaveConfigGUID);
+ configApi = (api_config *)sf->getInterface();
+ }
+
+ return configApi;
+}
+extern "C"
+int GetSampleSizeFlag()
+{
+ api_config *config = GetConfigAPI();
+ int bits=16;
+ if (config)
+ bits = config->GetUnsigned(playbackConfigGroupGUID, L"bits", 16);
+
+ switch(bits)
+ {
+ case 8:
+ return 0;
+ case 24:
+ return DMODE_24BITS;
+ case 16:
+ default:
+ return DMODE_16BITS;
+ }
+
+}
+
+extern "C"
+int GetNumChannels()
+{
+ api_config *config = GetConfigAPI();
+ bool mono=false;
+ if (config)
+ mono = config->GetBool(playbackConfigGroupGUID, L"mono", false);
+
+ if (mono)
+ return 1;
+ else
+ return 2;
+
+}
+
+extern "C"
+int AllowSurround()
+{
+ api_config *config = GetConfigAPI();
+ bool surround=true;
+ if (config)
+ surround= config->GetBool(playbackConfigGroupGUID, L"surround", true);
+
+ return surround?1:0;
+}
+
+extern "C"
+int GetThreadPriorityConfig()
+{
+ api_config *config = GetConfigAPI();
+ int priority=THREAD_PRIORITY_HIGHEST;
+ if (config)
+ priority = config->GetInt(playbackConfigGroupGUID, L"priority", THREAD_PRIORITY_HIGHEST);
+
+ return priority;
+} \ No newline at end of file
diff --git a/Src/Plugins/Input/in_mod/mikamp/resource.h b/Src/Plugins/Input/in_mod/mikamp/resource.h
new file mode 100644
index 00000000..d5f5721a
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/resource.h
@@ -0,0 +1,149 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by script1.rc
+//
+#define IDS_NULLSOFT_MODULE_DECODER_OLD 0
+#define IDS_PROTRACKER_AND_CLONES 1
+#define IDS_OLD_SKOOL_AMIGA_MODULES 2
+#define IDS_SCREAM_TRACKER_2XX 3
+#define IDS_SCREAM_TRACKER_3XX 4
+#define IDS_IMPULSE_TRACKER 5
+#define IDS_FASTTRACKER_2XX 6
+#define IDS_MULTITRACKER 7
+#define IDS_ULTRA_TRACKER 8
+#define IDS_COMPOSER_669 9
+#define IDS_FARANDOLE_COMPOSER 10
+#define IDS_DIGITAL_SOUND_AND_MUSIC_INTERFACE 11
+#define IDS_AMIGA_OKTALYZER 12
+#define IDS_POLYTRACKER 13
+#define IDS_MULTIPLE_ITEMS_SELECTED 14
+#define IDS_MUSIC_MODULES 15
+#define IDS_MIXER 16
+#define IDS_PLAYER 17
+#define IDS_LOADERS 18
+#define IDS_DEFAULT 19
+#define IDS_SELECT_ANY_LOADER 20
+#define IDS_DO_NOT_LOOP 21
+#define IDS_LOOP_FOREVER 22
+#define IDS_LOOP_X_TIMES 23
+#define IDS_PREFERENCES_TITLE 24
+#define IDS_SAMPLES 26
+#define IDS_INSTRUMENTS 27
+#define IDS_COMMENT 28
+#define IDS_YES 29
+#define IDS_NO 30
+#define IDS_SUSTAIN 31
+#define IDS_FINETUNE 32
+#define IDS_HZ_SIGNED 33
+#define IDS_HZ_UNSIGNED 34
+#define IDS_PING_PONG 35
+#define IDS_REVERSE 36
+#define IDS_FORWARD 37
+#define IDS_SUSTAIN_PING_PONG 38
+#define IDS_NONE 39
+#define IDS_X_X_X_OF_X_NOT_PLAYING 40
+#define IDS_X_X_X_OF_X_X_OF_X_X_OF_X 41
+#define IDS_X_BTYES_X_OF_X_MINUTES 42
+#define IDS_URLS_ONLY_SUPPORTED_IN_2_10_PLUS 43
+#define IDS_MOD_PLUGIN_ERROR 44
+#define IDS_SAVE_MODULE 45
+#define IDS_ALL_FILES 46
+#define IDS_RETRIEVING_MODULE 47
+#define IDS_ERROR_KILLING_DECODING_THREAD 48
+#define IDS_LOOP 49
+#define IDS_ON 50
+#define IDS_OFF 51
+#define IDS_BYTES 52
+#define IDS_BYTES2 53
+#define IDS_BITS 53
+#define IDS_FAMILY_STRING_COMPOSER_669 54
+#define IDS_FAMILY_STRING_DSMI_AMF 55
+#define IDS_FAMILY_STRING_FARANDOLE_COMPOSER 56
+#define IDS_FAMILY_STRING_IMPULSETRACKER 57
+#define IDS_FAMILY_STRING_SOUNDTRACKER 58
+#define IDS_FAMILY_STRING_PROTRACKER 59
+#define IDS_FAMILY_STRING_MULTITRACKER 60
+#define IDS_FAMILY_STRING_AMIGA_OKTALYZER 61
+#define IDS_FAMILY_STRING_POLYTRACKER 62
+#define IDS_FAMILY_STRING_SCREAMTRACKER3 63
+#define IDS_FAMILY_STRING_SCREAMTRACKER2 64
+#define IDS_FAMILY_STRING_ULTRATRACKER 65
+#define IDS_FAMILY_STRING_FASTRACKER2 66
+#define IDS_FAMILY_STRING_NOISETRACKER 67
+#define IDS_X_MODULE 68
+#define IDS_X_COMPRESSED_MODULE 69
+#define IDS_ABOUT_TEXT 70
+#define IDS_CORRUPT_UNSUPPORTED_TYPE 71
+#define IDS_NULLSOFT_DS_OUTPUT 72
+#define IDD_ID3EDIT 101
+#define IDD_SAMPLES 108
+#define IDD_COMMENT 109
+#define IDD_INSTRUMENTS 111
+#define IDD_PREFS 116
+#define IDD_PREFTAB_DECODER 118
+#define IDD_PREFTAB_MIXER 119
+#define IDD_PREFTAB_LOADER 123
+#define IDC_PREFS_PRIORITY_DECODE 1076
+#define IDC_TYPE 1078
+#define IDC_TITLE 1079
+#define IDC_ID3_FN 1090
+#define OQ_INTERP 1100
+#define IDLDR_EFFOPT1 1102
+#define OQ_NOCLICK 1103
+#define IDC_SAVESTR 1105
+#define IDC_VOICES 1106
+#define IDC_INSTLIST 1108
+#define TB_SAMPLELIST 1109
+#define IDC_SAMPLIST 1110
+#define IDC_INFORIGHT 1111
+#define IDC_INFOLEFT 1112
+#define IDC_TAB 1113
+#define IDC_SAMPINFO 1115
+#define CEMENT_BOX 1116
+#define IDC_INSTENV 1118
+#define IDC_INSTHEAD 1120
+#define IDC_ID3FORMAT 1127
+#define MM_PREFTAB 1132
+#define IDC_PANSEP 1132
+#define IDC_DEFPAN 1137
+#define OQ_QUALITY 1139
+#define IDLDR_LIST 1140
+#define IDLDR_PANPOS 1141
+#define IDLDR_ENABLED 1142
+#define IDLDR_EFFOPT2 1144
+#define IDLDR_DESCRIPTION 1145
+#define IDC_LOOPALL 1146
+#define IDC_CONT_LOOP 1147
+#define IDC_FADEOUT 1148
+#define IDC_FADESPIN 1149
+#define IDC_PLAYALL 1150
+#define IDC_RESONANCE 1151
+#define IDC_FADECHECK 1152
+#define IDC_FADESEC 1153
+#define IDC_STRIPSILENCE 1154
+#define IDC_SEEKBYORDERS 1155
+#define IDC_TITLE_FORMAT 1156
+#define IDC_TAGZ_HELP 1157
+#define OQ_CUBIC 1158
+#define IDC_TAGZ_DEF 1158
+#define IDC_SAMPLESIZE 1159
+#define IDC_TITLE_FORMAT2 1159
+#define IDC_LOOPTEXT 1160
+#define IDC_LOOPS 1161
+#define IDC_TRACK 1162
+#define IDC_ADV_TEXT_INFO 1163
+#define OUTMODE_STEREO 1201
+#define OUTMODE_SURROUND 1202
+#define OUTMODE_REVERSE 1203
+#define IDS_NULLSOFT_MODULE_DECODER 65534
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 130
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1164
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/Src/Plugins/Input/in_mod/mikamp/src/Config.c b/Src/Plugins/Input/in_mod/mikamp/src/Config.c
new file mode 100644
index 00000000..75ba79e4
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/src/Config.c
@@ -0,0 +1,1320 @@
+/*
+ Mikmod for Winamp
+
+ By Jake Stine and Justin Frankel. Really.
+
+ Done in 1998, 1999. The millenium cometh!
+ Done more in 2000. The millenium passeth by!
+ Redone lots in 2001. The REAL millenium cometh! haha.
+*/
+
+#include "api.h"
+extern "C" {
+#include "main.h"
+}
+#include <shlobj.h>
+#include <commctrl.h>
+#include "../../winamp/wa_ipc.h"
+#include <strsafe.h>
+#include "../nu/AutoWide.h"
+
+#define TabCtrl_InsertItemW(hwnd, iItem, pitem) \
+ (int)SNDMSG((hwnd), TCM_INSERTITEMW, (WPARAM)(int)(iItem), (LPARAM)(const TC_ITEMW *)(pitem))
+
+#define C_PAGES 4
+
+#define CFG_UNCHANGED (-1)
+
+#define EFFECT_8XX (1ul<<0)
+#define EFFECT_ZXX (1ul<<1)
+
+#define CPUTBL_COUNT 23
+#define MIXTBL_COUNT 7
+#define VOICETBL_COUNT 8
+#define DEF_SRATE 44100
+
+
+typedef struct tag_cdlghdr
+{
+ HWND hwndTab; // tab control
+ HWND hwndDisplay; // current child dialog box
+ int left,top;
+ HWND apRes[C_PAGES];
+
+} CFG_DLGHDR;
+
+
+// Winamp Stuff
+UBYTE config_savestr = 0; // save stream to disk
+
+// Output Settings
+UBYTE config_nch = 2;
+UBYTE config_cpu;
+
+// Player Settings...
+// ------------------
+
+int config_loopcount = 0; // Auto-looping count, if the song has a natural loop.
+uint config_playflag = 0; // See CPLAYFLG_* defines above for flags
+int config_pansep = 128; // master panning separation (0 == mono, 128 == stereo, 512 = way-separate)
+UBYTE config_resonance = 1;
+int config_fadeout = 1000; // fadeout when the song is ending last loop (in ms)
+
+// Mixer Settings...
+// -----------------
+
+UBYTE config_panrev = 0, // Reverse panning (left<->right)
+ config_interp = 3; // interpolation (bit 0) / noclick (bit 1) / cubic (bit 2)
+uint config_srate = DEF_SRATE;
+uint config_voices = 96; // maximum voices player can use.
+
+
+// Local Crud...
+// -------------
+
+static const char *INI_FILE;
+static const char app_name[] = "Nullsoft Module Decoder";
+
+static int l_quality, l_srate, // l_quality indexes mixertbl. l_srate is the actual number.
+ l_voices;
+static BOOL l_useres, l_nch,
+ l_iflags;
+int config_tsel = 0;
+
+
+static uint voicetable[VOICETBL_COUNT] = { 24, 32, 48, 64, 96, 128, 256, 512 };
+static uint mixertbl[MIXTBL_COUNT] =
+{
+ 48000,
+ 44100,
+ 33075,
+ 22050,
+ 16000,
+ 11025,
+ 8000,
+};
+
+
+// Define Extended Loader Details/Options
+// --------------------------------------
+
+typedef struct _MLCONF
+{
+ CHAR *cfgname; // configuration name prefix.
+ INT desc_id; // long-style multi-line description!
+ CHAR *exts;
+ MLOADER *loader; // mikmod loader to register
+ BOOL enabled;
+ uint defpan, // default panning separation \ range 0 - 128
+ pan; // current panning separation / (mono to stereo)
+ uint optavail, // available advanced effects options
+ optset; // current settings for those options.
+} MLCONF;
+
+
+static MLCONF c_mod[] =
+{
+ "mod",
+ IDS_PROTRACKER_AND_CLONES,
+ "mod;mdz;nst",
+ &load_mod,
+ TRUE,
+
+ 0,0,
+ EFFECT_8XX, 0,
+
+ "m15",
+ IDS_OLD_SKOOL_AMIGA_MODULES,
+ "mod;mdz",
+ &load_m15,
+ TRUE,
+
+ 0,0,
+ EFFECT_8XX, 0,
+
+ "stm",
+ IDS_SCREAM_TRACKER_2XX,
+ "stm;stz",
+ &load_stm,
+ TRUE,
+
+ 0,0,
+ EFFECT_8XX | EFFECT_ZXX, 0,
+
+ "st3",
+ IDS_SCREAM_TRACKER_3XX,
+ "s3m;s3z",
+ &load_s3m,
+ TRUE,
+
+ 32,32,
+ EFFECT_8XX | EFFECT_ZXX, 0,
+
+
+ "it",
+ IDS_IMPULSE_TRACKER,
+ "it;itz",
+ &load_it,
+ TRUE,
+
+ 0,0,
+ EFFECT_ZXX, 0,
+
+ "ft2",
+ IDS_FASTTRACKER_2XX,
+ "xm;xmz",
+ &load_xm,
+ TRUE,
+
+ 0,0,
+ 0, 0,
+
+ "mtm",
+ IDS_MULTITRACKER,
+ "mtm",
+ &load_mtm,
+ TRUE,
+
+ 0,0,
+ EFFECT_8XX, 0,
+
+ "ult",
+ IDS_ULTRA_TRACKER,
+ "ult",
+ &load_ult,
+ TRUE,
+
+ 0,0,
+ EFFECT_8XX, 0,
+
+ "669",
+ IDS_COMPOSER_669,
+ "669",
+ &load_669,
+ TRUE,
+
+ 0,0,
+ 0, 0,
+
+ "far",
+ IDS_FARANDOLE_COMPOSER,
+ "far",
+ &load_far,
+ TRUE,
+
+ 0,0,
+ 0, 0,
+
+ "amf",
+ IDS_DIGITAL_SOUND_AND_MUSIC_INTERFACE,
+ "amf",
+ &load_amf,
+ TRUE,
+
+ 0,0,
+ 0, 0,
+
+ "okt",
+ IDS_AMIGA_OKTALYZER,
+ "okt",
+ &load_okt,
+ TRUE,
+
+ 0, 0,
+ 0, 0,
+
+ "ptm",
+ IDS_POLYTRACKER,
+ "ptm",
+ &load_ptm,
+ TRUE,
+
+ 0, 0,
+ EFFECT_8XX, 0,
+};
+
+#define C_NUMLOADERS (sizeof(c_mod)/sizeof(c_mod[0]))
+
+static MLCONF l_mod[C_NUMLOADERS]; // local copy, for cancelability
+
+
+// =====================================================================================
+ static int _r_i(char *name, int def)
+// =====================================================================================
+{
+ name += 7;
+ return GetPrivateProfileInt(app_name,name,def,INI_FILE);
+}
+#define RI(x) (( x ) = _r_i(#x,( x )))
+
+
+// =====================================================================================
+ static void _w_i(char *name, int d)
+// =====================================================================================
+{
+ char str[120] = {0};
+ StringCchPrintf(str,100,"%d",d);
+ name += 7;
+ WritePrivateProfileString(app_name,name,str,INI_FILE);
+}
+#define WI(x) _w_i(#x,( x ))
+
+
+// =====================================================================================
+ static void config_buildbindings(CHAR *datext)
+// =====================================================================================
+// Creates the binding string.
+{
+#define SEP_CHAR ';'
+
+ uint i;
+ char *base = datext;
+
+ base[0] = 0;
+
+ for (i=0; i<C_NUMLOADERS; i++)
+ if (c_mod[i].enabled)
+ {
+ char *ext = c_mod[i].exts;
+
+ for (;;)
+ {
+ char temp[64] = {0};
+ int len;
+ // find next
+ char *next = strchr(ext, SEP_CHAR), *s;
+
+ if (next)
+ len = next - ext;
+ else len = strlen(ext);
+ memcpy(temp, ext, len);
+ temp[len++] = SEP_CHAR;
+ temp[len] = 0;
+ // check for duplicate exts
+ s = strstr(base, temp);
+ if (!s || (s!=base && *(s-1)!=SEP_CHAR))
+ {
+ memcpy(datext, temp, len);
+ datext += len;
+ *datext = 0; // prevent using old content
+ }
+ // advance
+ if (!next)
+ break;
+ ext = next + 1;
+ }
+ }
+
+ if (datext > base)
+ {
+ *(datext-1) = 0;
+ StringCchCopy(datext,4096,WASABI_API_LNGSTRING(IDS_MUSIC_MODULES));
+ }
+}
+
+
+// =====================================================================================
+ static void config_init(void)
+// =====================================================================================
+{
+ INI_FILE = (const char *)SendMessage(mikmod.hMainWindow, WM_WA_IPC, 0, IPC_GETINIFILE);
+}
+
+
+// =====================================================================================
+ void config_read(void)
+// =====================================================================================
+{
+ uint t;
+
+ config_init();
+
+
+ RI(config_savestr);
+
+ RI(config_nch);
+ RI(config_srate);
+ RI(config_interp);
+
+ RI(config_voices);
+
+ RI(config_loopcount);
+ RI(config_playflag);
+ RI(config_resonance);
+ RI(config_fadeout);
+
+ RI(config_pansep);
+ RI(config_panrev);
+
+ RI(config_info_x);
+ RI(config_info_y);
+ RI(config_track);
+ RI(config_tsel);
+
+ config_cpu = _mm_cpudetect();
+
+ // Load settings for each of the individual loaders
+ // ------------------------------------------------
+
+ for(t=0; t<C_NUMLOADERS; t++)
+ {
+ CHAR stmp[72] = {0};
+
+ StringCchPrintf(stmp,72,"%s%s",c_mod[t].cfgname,"enabled");
+ c_mod[t].enabled = GetPrivateProfileInt(app_name,stmp,c_mod[t].enabled,INI_FILE);
+
+ StringCchPrintf(stmp,72,"%s%s",c_mod[t].cfgname,"panning");
+ c_mod[t].pan = GetPrivateProfileInt(app_name, stmp, c_mod[t].defpan, INI_FILE);
+ c_mod[t].pan = _mm_boundscheck(c_mod[t].pan, 0, 128);
+
+ StringCchPrintf(stmp,72,"%s%s",c_mod[t].cfgname,"effects");
+ c_mod[t].optset = GetPrivateProfileInt(app_name,stmp,c_mod[t].optset,INI_FILE);
+
+ // configure the loaders
+ c_mod[t].loader->enabled = c_mod[t].enabled;
+ c_mod[t].loader->defpan = c_mod[t].pan;
+ c_mod[t].loader->nopaneff = (c_mod[t].optset | EFFECT_8XX) ? FALSE : TRUE;
+ c_mod[t].loader->noreseff = (c_mod[t].optset | EFFECT_ZXX) ? FALSE : TRUE;
+ }
+
+ config_buildbindings(mikmod.FileExtensions);
+
+ // Bounds checking!
+ // ----------------
+ // This is important to ensure stability of the product in case some
+ // doof goes and starts hacking the ini values carelessly - or if some sort
+ // of version conflict or corruption causes skewed readings.
+
+ config_pansep = _mm_boundscheck(config_pansep, 0, 512);
+ config_voices = _mm_boundscheck(config_voices, 2, 1024);
+
+ config_fadeout = _mm_boundscheck(config_fadeout, 0, 1000l*1000l);
+ config_loopcount = _mm_boundscheck(config_loopcount, -1, 63);
+}
+
+
+// =====================================================================================
+ void config_write(void)
+// =====================================================================================
+{
+ uint t = 0;
+
+ WI(config_savestr);
+
+ WI(config_nch);
+ WI(config_srate);
+ WI(config_interp);
+ WI(config_voices);
+
+ WI(config_loopcount);
+ WI(config_playflag);
+ WI(config_resonance);
+ WI(config_fadeout);
+
+ WI(config_pansep);
+ WI(config_panrev);
+
+ WI(config_info_x);
+ WI(config_info_y);
+ WI(config_track);
+ WI(config_tsel);
+
+ // Save settings for each of the individual loaders
+ // ------------------------------------------------
+
+ for(; t < C_NUMLOADERS; t++)
+ {
+ CHAR stmp[72] = {0}, sint[12] = {0};
+
+ StringCchPrintf(stmp,72,"%s%s",c_mod[t].cfgname,"enabled");
+ StringCchPrintf(sint,12,"%d",c_mod[t].enabled);
+ WritePrivateProfileString(app_name,stmp,sint,INI_FILE);
+
+ StringCchPrintf(stmp,72,"%s%s",c_mod[t].cfgname,"panning");
+ StringCchPrintf(sint,12,"%d",c_mod[t].pan);
+ WritePrivateProfileString(app_name,stmp,sint,INI_FILE);
+
+ StringCchPrintf(stmp,72,"%s%s",c_mod[t].cfgname,"effects");
+ StringCchPrintf(sint,12,"%d",c_mod[t].optset);
+ WritePrivateProfileString(app_name,stmp,sint,INI_FILE);
+
+ // configure the loaders
+ c_mod[t].loader->enabled = c_mod[t].enabled;
+ c_mod[t].loader->nopaneff = (c_mod[t].optset | EFFECT_8XX) ? FALSE : TRUE;
+ c_mod[t].loader->noreseff = (c_mod[t].optset | EFFECT_ZXX) ? FALSE : TRUE;
+ }
+
+ config_buildbindings(mikmod.FileExtensions);
+}
+
+
+static BOOL CALLBACK prefsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
+
+
+// =====================================================================================
+ void __cdecl config(HWND hwndParent)
+// =====================================================================================
+{
+ WASABI_API_DIALOGBOXW(IDD_PREFS,hwndParent,prefsProc);
+ config_write();
+}
+
+
+static BOOL CALLBACK tabProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static BOOL CALLBACK mixerProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static BOOL CALLBACK loaderProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static void OnSelChanged(HWND hwndDlg, int initonly);
+
+// =====================================================================================
+ static void prefsTabInit(HWND hwndDlg, CFG_DLGHDR *pHdr)
+// =====================================================================================
+{
+ DWORD dwDlgBase = GetDialogBaseUnits();
+ int cxMargin = LOWORD(dwDlgBase) / 4,
+ cyMargin = HIWORD(dwDlgBase) / 8;
+ TC_ITEMW tie;
+ int tabCounter;
+
+ tie.mask = TCIF_TEXT | TCIF_IMAGE;
+ tie.iImage = -1;
+
+ tabCounter = 0;
+
+ SendMessage(mikmod.hMainWindow,WM_WA_IPC,(WPARAM)pHdr->hwndTab,IPC_USE_UXTHEME_FUNC);
+
+ tie.pszText = WASABI_API_LNGSTRINGW(IDS_MIXER);
+ TabCtrl_InsertItemW(pHdr->hwndTab, tabCounter, &tie);
+ pHdr->apRes[tabCounter] = WASABI_API_CREATEDIALOGPARAMW(IDD_PREFTAB_MIXER, hwndDlg, mixerProc, IDD_PREFTAB_MIXER);
+ SetWindowPos(pHdr->apRes[tabCounter], HWND_TOP, pHdr->left, pHdr->top, 0, 0, SWP_NOSIZE);
+ SendMessage(mikmod.hMainWindow,WM_WA_IPC,(WPARAM)pHdr->apRes[tabCounter],IPC_USE_UXTHEME_FUNC);
+ ShowWindow(pHdr->apRes[tabCounter++], SW_HIDE);
+
+ tie.pszText = WASABI_API_LNGSTRINGW(IDS_PLAYER);
+ TabCtrl_InsertItemW(pHdr->hwndTab, tabCounter, &tie);
+ pHdr->apRes[tabCounter] = WASABI_API_CREATEDIALOGPARAMW(IDD_PREFTAB_DECODER, hwndDlg, tabProc, IDD_PREFTAB_DECODER);
+ SetWindowPos(pHdr->apRes[tabCounter], HWND_TOP, pHdr->left, pHdr->top, 0, 0, SWP_NOSIZE);
+ SendMessage(mikmod.hMainWindow,WM_WA_IPC,(WPARAM)pHdr->apRes[tabCounter],IPC_USE_UXTHEME_FUNC);
+ ShowWindow(pHdr->apRes[tabCounter++], SW_HIDE);
+
+ tie.pszText = WASABI_API_LNGSTRINGW(IDS_LOADERS);
+ TabCtrl_InsertItemW(pHdr->hwndTab, tabCounter, &tie);
+ pHdr->apRes[tabCounter] = WASABI_API_CREATEDIALOGPARAMW(IDD_PREFTAB_LOADER, hwndDlg, loaderProc, IDD_PREFTAB_LOADER);
+ SetWindowPos(pHdr->apRes[tabCounter], HWND_TOP, pHdr->left, pHdr->top, 0, 0, SWP_NOSIZE);
+ SendMessage(mikmod.hMainWindow,WM_WA_IPC,(WPARAM)pHdr->apRes[tabCounter],IPC_USE_UXTHEME_FUNC);
+ ShowWindow(pHdr->apRes[tabCounter++], SW_HIDE);
+
+ // Simulate selection of the first item.
+ OnSelChanged(hwndDlg,1);
+}
+
+
+// =====================================================================================
+ static void OnSelChanged(HWND hwndDlg, int initonly)
+// =====================================================================================
+{
+ CFG_DLGHDR *pHdr = (CFG_DLGHDR *) GetWindowLong(hwndDlg, GWL_USERDATA);
+ if(!initonly)
+ config_tsel = TabCtrl_GetCurSel(pHdr->hwndTab);
+ else
+ TabCtrl_SetCurSel(pHdr->hwndTab,config_tsel);
+
+ if(pHdr->hwndDisplay) ShowWindow(pHdr->hwndDisplay,SW_HIDE);
+ ShowWindow(pHdr->apRes[config_tsel],SW_SHOW);
+ pHdr->hwndDisplay = pHdr->apRes[config_tsel];
+
+}
+
+
+// =====================================================================================
+ static void FadeOutSetup(HWND hwndDlg, BOOL enabled)
+// =====================================================================================
+{
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FADEOUT), enabled);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FADESEC), enabled);
+}
+
+
+// =====================================================================================
+ static void Stereo_Dependencies(HWND hwndDlg)
+// =====================================================================================
+// Enable or Disable the options which are dependant on stereo being enabled
+{
+ BOOL val = (l_nch==1) ? 0 : 1;
+ EnableWindow(GetDlgItem(hwndDlg,OUTMODE_REVERSE), val);
+ EnableWindow(GetDlgItem(hwndDlg,OUTMODE_SURROUND),val);
+}
+
+
+// =====================================================================================
+ static void SetVoiceList(HWND hwndMisc)
+// =====================================================================================
+// erg is the current quality mode (indexes mixertbl).
+{
+ uint i,k;
+ BOOL picked = FALSE;
+ uint cfgv;
+
+ cfgv = (l_voices==CFG_UNCHANGED) ? config_voices : voicetable[l_voices];
+
+ SendMessage(hwndMisc,CB_RESETCONTENT,0,0);
+
+ for(i=0; i<VOICETBL_COUNT; i++)
+ { CHAR buf[24] = {0};
+
+ // Find the appropriate megaherz, by doing a pretty wacky little logic snippet
+ // which matches up the multipled mhz with the closet legit CPU bracket (as
+ // listed in cputable).
+
+ StringCchPrintf(buf,24,"%s%d",(voicetable[i]<100) ? " " : "", voicetable[i]);
+
+ SendMessage(hwndMisc,CB_ADDSTRING,0,(LPARAM)buf);
+ if(!picked && (voicetable[i] >= cfgv))
+ { k = i; picked = TRUE; }
+ }
+
+ // If picked is false, then set to 96 (default)
+
+ if(!picked) k = 4;
+
+ SendMessage(hwndMisc,CB_SETCURSEL,k,0);
+}
+
+
+// =====================================================================================
+ static BOOL cmod_and_the_moo(HWND dagnergit, int *moo, int count, uint flag)
+// =====================================================================================
+{
+ int l;
+ BOOL oneway, otherway, thisway, thatway;
+
+ oneway = otherway = thisway = thatway = FALSE;
+
+ // Set oneway/otherway true for selected/unselected options.
+ // Set thisway/thatway true for avail/nonawail options.
+
+ for(l=0; l<count; l++)
+ { if(l_mod[moo[l]].optavail & flag)
+ { thisway = TRUE;
+ if(l_mod[moo[l]].optset & flag) oneway = TRUE; else otherway = TRUE;
+ } else thatway = TRUE;
+ }
+
+ EnableWindow(dagnergit, thisway);
+ SendMessage(dagnergit, BM_SETCHECK, (!thisway || (oneway != otherway)) ? (oneway ? BST_CHECKED : BST_UNCHECKED) : BST_INDETERMINATE, 0);
+ return thisway;
+}
+
+
+// =====================================================================================
+ static BOOL CALLBACK mixerProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+// =====================================================================================
+{
+
+ switch (uMsg)
+ {
+ // =============================================================================
+ case WM_INITDIALOG:
+ // =============================================================================
+ // Windows dialog box startup message. This is messaged for each tab form created.
+ // Initialize all of the controls on each of those forms!
+ {
+ HWND hwndMisc;
+ CFG_DLGHDR *pHdr = (CFG_DLGHDR *)GetWindowLong(GetParent(hwndDlg), GWL_USERDATA);
+
+ CheckDlgButton(hwndDlg, IDC_SAVESTR, config_savestr ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,OQ_INTERP, (config_interp & 1) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,OQ_NOCLICK, (config_interp & 2) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,OQ_CUBIC, (config_interp & 4) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,OUTMODE_REVERSE, config_panrev ? BST_CHECKED : BST_UNCHECKED);
+
+ l_voices = CFG_UNCHANGED;
+ l_srate = config_srate;
+ l_iflags = config_interp;
+ l_nch = GetNumChannels();
+ l_useres = config_resonance;
+
+ hwndMisc = GetDlgItem(hwndDlg,OQ_QUALITY);
+
+ {
+ uint erg, i, def=0;
+ BOOL picked = FALSE;
+
+ for(i=0; i<MIXTBL_COUNT; i++)
+ {
+ wchar_t buf[24] = {0};
+ StringCchPrintfW(buf,24,L"%d%s", mixertbl[i], mixertbl[i]==DEF_SRATE ? (def=i, WASABI_API_LNGSTRINGW(IDS_DEFAULT)) : L"");
+ SendMessageW(hwndMisc,CB_ADDSTRING,0,(LPARAM)buf);
+ if (!picked && mixertbl[i]<config_srate)
+ {
+ erg = i ? (i-1) : 0;
+ picked = TRUE;
+ }
+ }
+ // If picked is false, then set to default
+ if(!picked) erg = def;
+ SendMessage(hwndMisc,CB_SETCURSEL,erg,0);
+ l_quality = erg;
+ }
+
+ SetVoiceList(GetDlgItem(hwndDlg,IDC_VOICES));
+ Stereo_Dependencies(hwndDlg);
+
+ return TRUE;
+ }
+ break;
+
+ // =============================================================================
+ case WM_COMMAND:
+ // =============================================================================
+ // Process commands and notification messages recieved from our child controls.
+
+ switch(LOWORD(wParam))
+ { case IDOK:
+ {
+
+ if(l_voices != CFG_UNCHANGED) config_voices = voicetable[l_voices];
+
+ config_srate = l_srate;
+ config_interp = l_iflags;
+ config_resonance = l_useres;
+
+ config_panrev = IsDlgButtonChecked(hwndDlg,OUTMODE_REVERSE) ? 1 : 0;
+
+ config_voices = _mm_boundscheck(config_voices, 2,1024);
+
+ config_savestr = IsDlgButtonChecked(hwndDlg,IDC_SAVESTR) ? 1 : 0;
+ }
+ break;
+
+ // Output Quality / Mixing Performance
+ // -----------------------------------
+ // From here on down we handle the messages from those controls which affect
+ // the performance (and therefore the cpu requirements) of the module decoder.
+ // Each one assigns values into a temp variable (l_*) so that if the user
+ // cancels the changes are not saved.
+
+
+ case OQ_INTERP:
+ case OQ_CUBIC:
+ case OQ_NOCLICK:
+ if(HIWORD(wParam) == BN_CLICKED)
+ { l_iflags = IsDlgButtonChecked(hwndDlg,OQ_INTERP) ? 1 : 0;
+ l_iflags |= IsDlgButtonChecked(hwndDlg,OQ_NOCLICK) ? 2 : 0;
+ l_iflags |= IsDlgButtonChecked(hwndDlg,OQ_CUBIC) ? 4 : 0;
+ SetVoiceList(GetDlgItem(hwndDlg,IDC_VOICES));
+ }
+ break;
+
+ case IDC_VOICES:
+ if(HIWORD(wParam) == CBN_SELCHANGE)
+ { int taxi = SendMessage((HWND)lParam,CB_GETCURSEL,0,0);
+ l_voices = taxi;
+ }
+ break;
+
+ case OQ_QUALITY:
+ if(HIWORD(wParam) == CBN_SELCHANGE)
+ { int taxi = SendMessage((HWND)lParam,CB_GETCURSEL,0,0);
+ l_quality = taxi;
+ l_srate = mixertbl[l_quality];
+ SetVoiceList(GetDlgItem(hwndDlg,IDC_VOICES));
+ }
+ break;
+ }
+ break;
+ }
+ return 0;
+}
+
+
+// =====================================================================================
+ static BOOL CALLBACK loaderProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+// =====================================================================================
+// This is the callback procedure used by each of the three forms under the tab control
+// on the Preferences dialog box. It handles all the messages for all of the controls
+// within those dialog boxes.
+{
+ switch (uMsg)
+ {
+ // =============================================================================
+ case WM_INITDIALOG:
+ // =============================================================================
+ // Windows dialog box startup message. This is messaged for each tab form created.
+ // Initialize all of the controls on each of those forms!
+ {
+ HWND hwndMisc;
+ CFG_DLGHDR *pHdr = (CFG_DLGHDR *)GetWindowLong(GetParent(hwndDlg), GWL_USERDATA);
+
+ uint i;
+
+ // Set the range on the panning slider (0 to 16)
+
+ hwndMisc = GetDlgItem(hwndDlg,IDLDR_PANPOS);
+ SendMessage(hwndMisc,TBM_SETRANGEMAX,0,16);
+ SendMessage(hwndMisc,TBM_SETRANGEMIN,0,0);
+ SendMessage(hwndMisc,TBM_SETPOS, 1, 16);
+
+ // Build our list of loaders in the loader box
+ // -------------------------------------------
+ // TODO: eventually I would like to display little checkmarks (or llamas or
+ // something) in this list to indicate (at a glance) which are enabled and
+ // which are not.
+
+ hwndMisc = GetDlgItem(hwndDlg,IDLDR_LIST);
+
+ for (i=0; i<C_NUMLOADERS; i++)
+ {
+ l_mod[i] = c_mod[i];
+ SendMessageW(hwndMisc, LB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW(c_mod[i].loader->DescStrID));
+ }
+
+ SendMessage(hwndMisc, LB_SETCURSEL, 0, 0);
+ loaderProc(hwndDlg, WM_COMMAND, (WPARAM)((LBN_SELCHANGE << 16) + IDLDR_LIST), (LPARAM)hwndMisc);
+
+ if (NULL != WASABI_API_APP)
+ WASABI_API_APP->DirectMouseWheel_EnableConvertToMouseWheel(hwndMisc, TRUE);
+ }
+ return TRUE;
+
+ case WM_DESTROY:
+ {
+ HWND hwndMisc = GetDlgItem(hwndDlg, IDLDR_LIST);
+ if (NULL != WASABI_API_APP)
+ WASABI_API_APP->DirectMouseWheel_EnableConvertToMouseWheel(hwndMisc, FALSE);
+ }
+ break;
+
+ // =============================================================================
+ case WM_COMMAND:
+ // =============================================================================
+ // Process commands and notification messages recieved from our child controls.
+
+ switch(LOWORD(wParam))
+ {
+ case IDOK:
+ { uint i;
+ for (i=0; i<C_NUMLOADERS; i++)
+ {
+ c_mod[i] = l_mod[i];
+ c_mod[i].loader->defpan = c_mod[i].pan;
+ }
+ }
+ break;
+
+ case IDLDR_LIST:
+
+ // The Loader Box Update Balloofie
+ // -------------------------------
+ // Updates the various controls on the 'loader tab' dialog box. Involves
+ // enabling/disabling advanced-effects boxes, checking the Enabled box, and
+ // setting the panning position. Also: extra care is taken to allow proper
+ // and intuitive support for multiple selections!
+
+ if(HIWORD(wParam) == LBN_SELCHANGE)
+ { int moo[C_NUMLOADERS], count,l;
+ BOOL oneway, otherway, opt1, opt2;
+ HWND beiownd;
+
+ // Fetch the array of selected items!
+
+ count = SendMessage((HWND)lParam, LB_GETSELITEMS, C_NUMLOADERS, (LPARAM)moo);
+ if(!count || (count == LB_ERR))
+ {
+ // Something's not right, so just disable all the controls.
+
+ SetWindowTextW(GetDlgItem(hwndDlg, IDLDR_DESCRIPTION), WASABI_API_LNGSTRINGW(IDS_SELECT_ANY_LOADER));
+ EnableWindow(beiownd = GetDlgItem(hwndDlg, IDLDR_PANPOS), FALSE);
+ EnableWindow(beiownd = GetDlgItem(hwndDlg, IDLDR_ENABLED), FALSE);
+ SendMessage(hwndDlg, BM_GETCHECK, BST_UNCHECKED,0);
+ EnableWindow(beiownd = GetDlgItem(hwndDlg, IDLDR_EFFOPT1), FALSE);
+ SendMessage(hwndDlg, BM_GETCHECK, BST_UNCHECKED,0);
+ EnableWindow(beiownd = GetDlgItem(hwndDlg, IDLDR_EFFOPT2), FALSE);
+ SendMessage(hwndDlg, BM_GETCHECK, BST_UNCHECKED,0);
+ EnableWindow(beiownd = GetDlgItem(hwndDlg, IDC_DEFPAN), FALSE);
+
+ break;
+ }
+
+ SetWindowTextW(GetDlgItem(hwndDlg, IDLDR_DESCRIPTION),
+ WASABI_API_LNGSTRINGW(
+ (count==1) ? l_mod[moo[0]].desc_id : IDS_MULTIPLE_ITEMS_SELECTED));
+
+ // Enabled Box : First of Many
+ // ---------------------------
+
+ oneway = otherway = FALSE;
+ for(l=0; l<count; l++)
+ if(l_mod[moo[l]].enabled) oneway = TRUE; else otherway = TRUE;
+
+ EnableWindow(beiownd = GetDlgItem(hwndDlg, IDLDR_ENABLED), TRUE);
+ SendMessage(beiownd, BM_SETCHECK, (oneway != otherway) ? (oneway ? BST_CHECKED : BST_UNCHECKED) : BST_INDETERMINATE, 0);
+
+
+ // The PanningPos : Second in Command
+ // ----------------------------------
+ // Only set it if we have a single format selected, otherwise... erm..
+ // do something (to be determined!)
+
+ beiownd = GetDlgItem(hwndDlg, IDC_DEFPAN);
+ EnableWindow(beiownd, TRUE);
+ beiownd = GetDlgItem(hwndDlg, IDLDR_PANPOS);
+ EnableWindow(beiownd, TRUE);
+ if(count==1)
+ SendMessage(beiownd, TBM_SETPOS, TRUE, 16-((l_mod[moo[0]].pan+1)>>3));
+
+
+ // 8xx Panning Disable: Third of Four
+ // Zxx Resonance: All the Duckies are in a Row!
+ // --------------------------------------------
+
+ opt1 = cmod_and_the_moo(GetDlgItem(hwndDlg, IDLDR_EFFOPT1), moo, count, EFFECT_8XX);
+ opt2 = cmod_and_the_moo(GetDlgItem(hwndDlg, IDLDR_EFFOPT2), moo, count, EFFECT_ZXX);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ADV_TEXT_INFO), opt1 || opt2);
+ }
+ break;
+
+ case IDLDR_ENABLED:
+ case IDC_DEFPAN:
+ case IDLDR_EFFOPT1:
+ case IDLDR_EFFOPT2:
+
+ if(HIWORD(wParam) == BN_CLICKED)
+ { int moo[C_NUMLOADERS],count;
+ int res = SendMessage((HWND)lParam,BM_GETCHECK,0,0);
+
+ count = SendMessage(GetDlgItem(hwndDlg, IDLDR_LIST), LB_GETSELITEMS, C_NUMLOADERS, (LPARAM)moo);
+
+
+ switch(res)
+ {
+ case BST_CHECKED:
+ SendMessage((HWND)lParam,BM_SETCHECK,BST_UNCHECKED,0);
+ res = 0;
+ break;
+
+ case BST_INDETERMINATE:
+ case BST_UNCHECKED:
+ SendMessage((HWND)lParam,BM_SETCHECK,BST_CHECKED,0);
+ res = 1;
+ break;
+ }
+
+ if (LOWORD(wParam) == IDLDR_ENABLED)
+ { int l;
+ for(l=0; l<count; l++) l_mod[moo[l]].enabled = res;
+ }
+ else if (LOWORD(wParam) == IDC_DEFPAN)
+ {
+ int l;
+
+ for (l=0; l<count; l++)
+ l_mod[moo[l]].pan = l_mod[moo[l]].defpan;
+
+ if (count==1)
+ SendMessage(GetDlgItem(hwndDlg, IDLDR_PANPOS), TBM_SETPOS, TRUE, 16-((l_mod[moo[0]].pan+1)>>3));
+ }
+ else
+ {
+ uint flag = (LOWORD(wParam) == IDLDR_EFFOPT1) ? EFFECT_8XX : EFFECT_ZXX;
+ int l;
+
+ for(l=0; l<count; l++)
+ { if(l_mod[moo[l]].optavail & flag)
+ { if(res)
+ l_mod[moo[l]].optset |= flag;
+ else
+ l_mod[moo[l]].optset &= ~flag;
+ }
+ }
+ }
+ }
+ break;
+ }
+ break;
+
+ // =============================================================================
+ case WM_HSCROLL:
+ // =============================================================================
+ // Whitness Stupidness!
+ // Microsoft decides it would be this "brilliant move' to make trackbars send
+ // WM_HSCROLL and WM_VSCROLL messages only! Like, who the hell uses a trackbar
+ // as a scroller anyway? Whatever happened to the 'standard' system of command/
+ // notify messages? Grrr.
+
+ // Oh look, the LOWORD is the command this time, as opposed to notifies, where the
+ // HIWORD is the command. Jesus fucking Christ I'm in loonyland around here.
+
+ if(LOWORD(wParam) == TB_THUMBPOSITION)
+ {
+ int moo[C_NUMLOADERS],count,l;
+ count = SendMessage(GetDlgItem(hwndDlg, IDLDR_LIST), LB_GETSELITEMS, C_NUMLOADERS, (LPARAM)moo);
+
+ for(l=0; l<count; l++)
+ { l_mod[moo[l]].pan = (16 - HIWORD(wParam)) << 3;
+ l_mod[moo[l]].pan = _mm_boundscheck(l_mod[moo[l]].pan,0,128);
+ }
+ }
+ }
+
+ const int controls[] =
+ {
+ IDC_LOOPS,
+ IDC_PANSEP,
+ IDLDR_PANPOS,
+ };
+ if (FALSE != WASABI_API_APP->DirectMouseWheel_ProcessDialogMessage(hwndDlg, uMsg, wParam, lParam, controls, ARRAYSIZE(controls)))
+ {
+ return TRUE;
+ }
+
+ return 0;
+}
+
+
+// =====================================================================================
+ static void FadeoutSetText(HWND hwndDlg)
+// =====================================================================================
+{
+ CHAR work[32] = {0};
+ StringCchPrintf(work, 32, "%.02f",config_fadeout/1000.0f);
+ SetDlgItemText(hwndDlg, IDC_FADEOUT, work);
+}
+
+
+// =====================================================================================
+ static BOOL CALLBACK tabProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+// =====================================================================================
+{
+ switch (uMsg)
+ {
+ // =============================================================================
+ case WM_INITDIALOG:
+ // =============================================================================
+ // Windows dialog box startup message. This is messaged for each tab form created.
+ // Initialize all of the controls on each of those forms!
+ {
+ HWND hwndMisc;
+ CFG_DLGHDR *pHdr = (CFG_DLGHDR *)GetWindowLong(GetParent(hwndDlg), GWL_USERDATA);
+ SetWindowLong(hwndDlg,DWL_USER,lParam);
+
+ switch(lParam)
+ {
+ case IDD_PREFTAB_DECODER:
+ SendMessage(GetDlgItem(hwndDlg,IDC_FADEOUT), EM_SETLIMITTEXT, 10,0);
+ FadeoutSetText(hwndDlg);
+
+ hwndMisc = GetDlgItem(hwndDlg,IDC_PANSEP);
+ SendMessage(hwndMisc,TBM_SETRANGEMIN,0,0);
+ SendMessage(hwndMisc,TBM_SETRANGEMAX,0,32);
+
+ {
+ int erg = config_pansep;
+
+ if (erg <= 128)
+ erg *= 2;
+ else erg = 256 + ((erg - 128) * 256) / 384;
+
+ SendMessage(hwndMisc,TBM_SETPOS,1, (erg>>4)&31);
+ }
+
+ hwndMisc = GetDlgItem(hwndDlg, IDC_LOOPS);
+ SendMessage(hwndMisc, TBM_SETRANGEMIN, 0, 0);
+ SendMessage(hwndMisc, TBM_SETRANGEMAX, 0, 64);
+ SendMessage(hwndMisc, TBM_SETTICFREQ, 4, 0);
+ SendMessage(hwndMisc, TBM_SETPOS, 1, config_loopcount>=0 ? config_loopcount : 64);
+ SendMessage(hwndDlg, WM_HSCROLL, 0, (LPARAM)hwndMisc);
+
+ CheckDlgButton(hwndDlg,IDC_LOOPALL, (config_playflag & CPLAYFLG_LOOPALL) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_CONT_LOOP, (config_playflag & CPLAYFLG_CONT_LOOP) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_PLAYALL, (config_playflag & CPLAYFLG_PLAYALL) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_FADECHECK, (config_playflag & CPLAYFLG_FADEOUT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_STRIPSILENCE,(config_playflag & CPLAYFLG_STRIPSILENCE) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_SEEKBYORDERS,(config_playflag & CPLAYFLG_SEEKBYORDERS) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_RESONANCE,config_resonance ? BST_CHECKED : BST_UNCHECKED);
+
+ FadeOutSetup(hwndDlg, config_playflag & CPLAYFLG_FADEOUT);
+ return TRUE;
+
+ }
+ }
+ break;
+
+ // =============================================================================
+ case WM_COMMAND:
+ // =============================================================================
+ // Process commands and notification messages recieved from our child controls.
+
+ switch(LOWORD(wParam))
+ {
+ case IDOK:
+ {
+
+ switch(lParam)
+ {
+ case IDD_PREFTAB_DECODER:
+ {
+ CHAR stmp[32] = {0};
+ double ftmp;
+ config_loopcount = SendMessage(GetDlgItem(hwndDlg, IDC_LOOPS), TBM_GETPOS, 0, 0);
+ if (config_loopcount == 64) config_loopcount = -1;
+
+ GetDlgItemText(hwndDlg, IDC_FADEOUT, stmp, 12);
+ ftmp = atof(stmp);
+ config_fadeout = (int)(ftmp * 1000l);
+ config_fadeout = _mm_boundscheck(config_fadeout, 0, 1000l*1000l); // bound to 1000 seconds.
+
+ {
+ int erg = SendMessage(GetDlgItem(hwndDlg,IDC_PANSEP),TBM_GETPOS,0,0)<<4;
+
+ if (erg <= 256)
+ erg /= 2;
+ else erg = 128 + ((erg - 256) * 384) / 256;
+
+ config_pansep = erg;
+ }
+
+ config_playflag = IsDlgButtonChecked(hwndDlg,IDC_LOOPALL) ? CPLAYFLG_LOOPALL : 0;
+ config_playflag |= IsDlgButtonChecked(hwndDlg,IDC_CONT_LOOP) ? CPLAYFLG_CONT_LOOP : 0;
+ config_playflag |= IsDlgButtonChecked(hwndDlg,IDC_PLAYALL) ? CPLAYFLG_PLAYALL : 0;
+ config_playflag |= IsDlgButtonChecked(hwndDlg,IDC_FADECHECK) ? CPLAYFLG_FADEOUT : 0;
+ config_playflag |= IsDlgButtonChecked(hwndDlg,IDC_STRIPSILENCE) ? CPLAYFLG_STRIPSILENCE : 0;
+ config_playflag |= IsDlgButtonChecked(hwndDlg,IDC_SEEKBYORDERS) ? CPLAYFLG_SEEKBYORDERS : 0;
+ config_resonance = IsDlgButtonChecked(hwndDlg,IDC_RESONANCE) ? 1 : 0;
+ }
+ break;
+ }
+ }
+ break;
+
+ case IDC_FADECHECK: // hide/unhide fadeout controls
+ if(HIWORD(wParam) == BN_CLICKED)
+ { int res = SendMessage((HWND)lParam,BM_GETCHECK,0,0);
+ FadeOutSetup(hwndDlg, res);
+ }
+ break;
+ }
+ break;
+
+ // =============================================================================
+ case WM_HSCROLL:
+ // =============================================================================
+ switch (GetDlgCtrlID((HWND)lParam))
+ {
+ case IDC_LOOPS:
+ {
+ wchar_t foo[64] = {0};
+ int pos = SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
+ HWND hText = GetDlgItem(hwndDlg, IDC_LOOPTEXT);
+
+ if (!pos)
+ WASABI_API_LNGSTRINGW_BUF(IDS_DO_NOT_LOOP,foo,64);
+ else if (pos == 64)
+ WASABI_API_LNGSTRINGW_BUF(IDS_LOOP_FOREVER,foo,64);
+ else
+ StringCchPrintfW(foo, 64, WASABI_API_LNGSTRINGW(IDS_LOOP_X_TIMES), pos + 1);
+
+ SetWindowTextW(hText, foo);
+ }
+ break;
+ }
+ break;
+
+ // =============================================================================
+ case WM_NOTIFY:
+ // =============================================================================
+
+ switch(LOWORD(wParam))
+ {
+ case IDC_FADESPIN:
+ {
+ NMUPDOWN *mud = (NMUPDOWN *) lParam;
+
+ if(mud->hdr.code == UDN_DELTAPOS)
+ {
+ // bounds check things between 0-1000secs (added in 2.2.6)
+ if(mud->iDelta > 0)
+ {
+ if(config_fadeout > 0)
+ config_fadeout -= 250;
+ }
+ else
+ {
+ if(config_fadeout < 1000l*1000l)
+ config_fadeout += 250;
+ }
+ FadeoutSetText(hwndDlg);
+ }
+ }
+ return TRUE;
+ }
+ break;
+ }
+
+ const int controls[] =
+ {
+ IDC_LOOPS,
+ IDC_PANSEP,
+ IDLDR_PANPOS,
+ };
+ if (FALSE != WASABI_API_APP->DirectMouseWheel_ProcessDialogMessage(hwndDlg, uMsg, wParam, lParam, controls, ARRAYSIZE(controls)))
+ {
+ return TRUE;
+ }
+
+ return 0;
+}
+
+
+// =====================================================================================
+ static BOOL CALLBACK prefsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
+// =====================================================================================
+// This is the procedure which initializes the various forms that make up the tabs in
+// our preferences box! This also contains the message handler for the OK and Cancel
+// buttons. After that, all messaging is handled by the tab forms themselves in tabProc();
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ CFG_DLGHDR *pHdr = (CFG_DLGHDR*)calloc(1, sizeof(CFG_DLGHDR));
+ SetWindowLong(hwndDlg, GWL_USERDATA, (LONG) pHdr);
+ pHdr->hwndTab = GetDlgItem(hwndDlg,MM_PREFTAB);
+ pHdr->left = 8;
+ pHdr->top = 30;
+
+ prefsTabInit(hwndDlg, pHdr);
+
+ {
+ wchar_t title[128] = {0}, temp[128] = {0};
+ StringCchPrintfW(title, 128, WASABI_API_LNGSTRINGW(IDS_PREFERENCES_TITLE),WASABI_API_LNGSTRINGW_BUF(IDS_NULLSOFT_MODULE_DECODER_OLD,temp,128));
+ SetWindowTextW(hwndDlg,title);
+ }
+ }
+ return FALSE;
+
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ { case IDOK:
+ {
+ // Send an IDOK command to both tabcontrol children to let them know
+ // that the world is about to end!
+ CFG_DLGHDR *pHdr = (CFG_DLGHDR*)GetWindowLong(hwndDlg, GWL_USERDATA);
+
+ SendMessage(pHdr->apRes[0], WM_COMMAND, (WPARAM)IDOK, (LPARAM)IDD_PREFTAB_MIXER);
+ SendMessage(pHdr->apRes[1], WM_COMMAND, (WPARAM)IDOK, (LPARAM)IDD_PREFTAB_DECODER);
+ SendMessage(pHdr->apRes[2], WM_COMMAND, (WPARAM)IDOK, (LPARAM)IDD_PREFTAB_LOADER);
+
+ EndDialog(hwndDlg,0);
+ return 0;
+ }
+
+ case IDCANCEL:
+ EndDialog(hwndDlg,0);
+ return FALSE;
+
+ case OQ_QUALITY:
+ uMsg = 8;
+ break;
+ }
+ break;
+
+ case WM_NOTIFY:
+ { NMHDR *notice = (NMHDR *) lParam;
+
+ NMHDR *ack;
+ uint k;
+ ack = (NMHDR *)lParam;
+
+ if(ack->hwndFrom == GetDlgItem(hwndDlg,OQ_QUALITY))
+ {
+ switch(ack->code)
+ {
+ case CBEN_GETDISPINFO:
+ k = 1;
+ break;
+ }
+ }
+
+ switch(notice->code)
+ { case TCN_SELCHANGE:
+ OnSelChanged(hwndDlg,0);
+ return TRUE;
+ }
+ }
+ return FALSE;
+
+ case WM_DESTROY:
+ {
+ // free local data
+ free((CFG_DLGHDR*)GetWindowLong(hwndDlg, GWL_USERDATA));
+ }
+ break;
+ }
+ return FALSE;
+}
+
+
+static int DoAboutMessageBox(HWND parent, wchar_t* title, wchar_t* message)
+{
+ MSGBOXPARAMSW msgbx = {sizeof(MSGBOXPARAMSW),0};
+ msgbx.lpszText = message;
+ msgbx.lpszCaption = title;
+ msgbx.lpszIcon = MAKEINTRESOURCEW(102);
+ msgbx.hInstance = GetModuleHandle(0);
+ msgbx.dwStyle = MB_USERICON;
+ msgbx.hwndOwner = parent;
+ return MessageBoxIndirectW(&msgbx);
+}
+
+
+// =====================================================================================
+ void __cdecl about(HWND hwndParent)
+// =====================================================================================
+{
+ wchar_t message[1024] = {0}, text[1024] = {0};
+ WASABI_API_LNGSTRINGW_BUF(IDS_NULLSOFT_MODULE_DECODER_OLD,text,1024);
+ StringCchPrintfW(message, 1024, WASABI_API_LNGSTRINGW(IDS_ABOUT_TEXT),
+ mikmod.description, TEXT(__DATE__));
+ DoAboutMessageBox(hwndParent,text,message);
+}
+
+
+static const wchar_t *pExtCompress[] = { L"ITZ", L"MDZ", L"S3Z", L"STZ", L"XMZ" };
+static const wchar_t *pExtReplace[] = { L"IT", L"MOD", L"S3M", L"STM", L"XM" };
+
+BOOL GetTypeInfo(LPCWSTR pszType, LPWSTR pszDest, INT cchDest) // return TRUE if typ was found ok
+{
+ DWORD lcid;
+ LPCWSTR p(NULL);
+ wchar_t buf[128]={0};
+ int i;
+ BOOL bCompressed(FALSE);
+
+ lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
+ for (i = sizeof(pExtCompress)/sizeof(wchar_t*) - 1; i >= 0 && CSTR_EQUAL != CompareStringW(lcid, NORM_IGNORECASE, pszType, -1,pExtCompress[i], -1); i--);
+ if (-1 != i)
+ {
+ pszType = pExtReplace[i];
+ bCompressed = TRUE;
+ }
+
+ for (i = 0; i < C_NUMLOADERS && !p; i++)
+ {
+ if (CSTR_EQUAL == CompareStringW(lcid, NORM_IGNORECASE, pszType, -1, AutoWide(c_mod[i].loader->Type), -1))
+ {
+ p = WASABI_API_LNGSTRINGW_BUF(c_mod[i].loader->DescStrID, buf, 128);
+ }
+ }
+
+ if (!p)
+ {
+ if (CSTR_EQUAL == CompareStringW(lcid, NORM_IGNORECASE, pszType, -1, L"NST", -1))
+ {
+ p = WASABI_API_LNGSTRINGW_BUF(IDS_FAMILY_STRING_NOISETRACKER, buf, 128);
+ }
+ }
+
+ if (p) return (S_OK == StringCchPrintfW(pszDest, cchDest, WASABI_API_LNGSTRINGW((bCompressed?IDS_X_COMPRESSED_MODULE:IDS_X_MODULE)), p));
+ return FALSE;
+} \ No newline at end of file
diff --git a/Src/Plugins/Input/in_mod/mikamp/src/ExtendedRead.cpp b/Src/Plugins/Input/in_mod/mikamp/src/ExtendedRead.cpp
new file mode 100644
index 00000000..71db9ea4
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/src/ExtendedRead.cpp
@@ -0,0 +1,123 @@
+extern "C"
+{
+#include "main.h"
+}
+#include "drv_buffer.h"
+#include <bfc/platform/types.h>
+
+typedef struct
+{
+ const char *cmd;
+ const char *file;
+ const char *title;
+ int titleLength;
+ int start;
+ int startUnit;
+ int loops;
+ int flags;
+} PlayParams;
+extern "C" int GetSampleSizeFlag();
+extern "C" MMSTREAM *_mm_fopen_rf(const CHAR *fname); //rf_wrapper.c
+BOOL GetPlayParams(const char *fileName, BOOL open, PlayParams *params);
+BOOL InitPlayer(UNIMOD *mf, MPLAYER **ps, const PlayParams *params, BOOL quick);
+// TODO; is there a way to get floating point out of this stuff?
+extern "C"
+{
+ __declspec(dllexport) intptr_t winampGetExtendedRead_open(const char *fn, int *size, int *bps, int *nch, int *srate)
+ {
+ PlayParams params;
+ if (!GetPlayParams(fn, FALSE, &params))
+ return 0;
+
+ int requested_channels = *nch;
+ int requested_bits = *bps;
+ int requested_srate = *srate;
+
+ uint md_mode = 0;
+ if (config_interp & 1) md_mode |= DMODE_INTERP;
+ if (config_interp & 2) md_mode |= DMODE_NOCLICK;
+ if (config_interp & 4) md_mode |= DMODE_FIR;
+ switch(requested_bits)
+ {
+ case 0:
+ md_mode |= GetSampleSizeFlag();
+ break;
+ case 16:
+ md_mode |= DMODE_16BITS;
+ break;
+ case 24:
+ md_mode |= DMODE_24BITS;
+ break;
+ }
+
+
+ if (requested_channels != 1 && requested_channels != 2) md_mode |= DMODE_SURROUND;
+ if (config_panrev) md_mode |= DMODE_REVERSE;
+ if (config_resonance) md_mode |= DMODE_RESONANCE;
+
+ MDRIVER *md = Mikmod_Init(requested_srate?requested_srate:config_srate, 0, 0, MD_STEREO, config_cpu, md_mode, &drv_buffer);
+ MPLAYER *mp;
+
+ MMSTREAM *fp;
+ fp = _mm_fopen_rf(params.file);
+ if (!fp)
+ {
+ Mikmod_Exit(md);
+ //CleanupTemp();
+ return 0;
+ }
+ UNIMOD *mf=Unimod_Load_FP(md, params.file,fp);
+ _mm_fclose(fp);
+ if (mf==NULL)
+ {
+ Mikmod_Exit(md);
+ // CleanupTemp();
+ return 0;
+ }
+
+ if (!InitPlayer(mf, &mp, &params, FALSE))
+ {
+ //CleanupTemp();
+ Unimod_Free(mf);
+ Mikmod_Exit(md);
+ return 0;
+ }
+
+ Player_Start(mp);
+ DecodeInfo *hwdata = (DecodeInfo *)md->device.local;
+ *bps = hwdata->bits;
+ *srate = hwdata->mixspeed;
+ *nch = hwdata->channels;
+ if (mf->songlen)
+ *size = MulDiv(mf->songlen, hwdata->mixspeed * hwdata->channels *hwdata->bits, 8*1000);
+ else
+ *size = -1;
+ return (intptr_t)mp;
+ }
+
+ __declspec(dllexport) size_t winampGetExtendedRead_getData(intptr_t handle, char *dest, size_t len, int *killswitch)
+ {
+ MPLAYER *mp = (MPLAYER *)handle;
+ DecodeInfo *hwdata = (DecodeInfo *)mp->mf->md->device.local;
+
+ if (!Player_Active(mp)) // check if we're done
+ return 0;
+
+ hwdata->buffer = dest;
+ hwdata->buffersize = len;
+ hwdata->bytesWritten = 0;
+ Mikmod_Update(mp->mf->md);
+ return hwdata->bytesWritten;
+ }
+
+
+ __declspec(dllexport) void winampGetExtendedRead_close(intptr_t handle)
+ {
+ MPLAYER *mp = (MPLAYER *)handle;
+ MDRIVER *md = mp->mf->md;
+ UNIMOD *mf = (UNIMOD *)mp->mf;
+ Player_Free(mp);
+ Unimod_Free(mf);
+ Mikmod_Exit(md);
+ }
+} \ No newline at end of file
diff --git a/Src/Plugins/Input/in_mod/mikamp/src/Info.c b/Src/Plugins/Input/in_mod/mikamp/src/Info.c
new file mode 100644
index 00000000..75fdb40c
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/src/Info.c
@@ -0,0 +1,602 @@
+#include "api.h"
+#include "main.h"
+#include "resource.h"
+#include <commctrl.h>
+#include "../../winamp/wa_ipc.h"
+#include <strsafe.h>
+
+static BOOL CALLBACK infoProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
+static BOOL CALLBACK tabProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
+static void OnSelChanged(HWND hwndDlg);
+
+INFOBOX *infobox_list = NULL;
+
+int config_info_x = 0, config_info_y = 0;
+BOOL config_track = FALSE;
+
+// =====================================================================================
+void infobox_delete(HWND hwnd)
+// =====================================================================================
+// This function is called with the handle of the infobox to destroy. It unloads the
+// module if appropriate (care must be take not to unload a module which is in use!).
+{
+ INFOBOX *cruise, *old;
+
+ old = cruise = infobox_list;
+
+ while(cruise)
+ {
+ if(cruise->hwnd == hwnd)
+ {
+ if(cruise == infobox_list)
+ infobox_list = cruise->next;
+ else old->next = cruise->next;
+
+ // Destroy the info box window, then unload the module, *if*
+ // the module is not actively playing!
+
+ info_killseeker(hwnd);
+ DestroyWindow(hwnd);
+
+ if (cruise->dlg.module!=mf && cruise->dlg.ownModule)
+ Unimod_Free(cruise->dlg.module);
+
+ free(cruise->dlg.suse);
+ free(cruise);
+ return;
+ }
+ old = cruise;
+ cruise = cruise->next;
+ }
+}
+
+
+// =====================================================================================
+MPLAYER *get_player(UNIMOD *othermf)
+// =====================================================================================
+// Checks the current module against the one given. if they match the MP is returned,
+// else it returns NULL.
+{
+ if (mf == othermf)
+ return mp;
+ return NULL;
+}
+
+
+// =====================================================================================
+static void infoTabInit(HWND hwndDlg, UNIMOD *m, DLGHDR *pHdr)
+// =====================================================================================
+{
+ DWORD dwDlgBase = GetDialogBaseUnits();
+ int cxMargin = LOWORD(dwDlgBase) / 4,
+ cyMargin = HIWORD(dwDlgBase) / 8;
+ TC_ITEM tie;
+ int tabCounter;
+
+ // Add a tab for each of the three child dialog boxes.
+ // and lock the resources for the child frames that appear within.
+
+ tie.mask = TCIF_TEXT | TCIF_IMAGE;
+ tie.iImage = -1;
+ tabCounter = 0;
+
+ if(m->numsmp)
+ {
+ tie.pszText = WASABI_API_LNGSTRING(IDS_SAMPLES);
+ TabCtrl_InsertItem(pHdr->hwndTab, tabCounter, &tie);
+ pHdr->apRes[tabCounter] = WASABI_API_CREATEDIALOGPARAM(IDD_SAMPLES, hwndDlg, tabProc, IDD_SAMPLES);
+ SendMessage(mikmod.hMainWindow,WM_WA_IPC,(WPARAM)pHdr->apRes[tabCounter],IPC_USE_UXTHEME_FUNC);
+ SetWindowPos(pHdr->apRes[tabCounter], HWND_TOP, pHdr->left+1, pHdr->top+15, 0, 0, SWP_NOSIZE);
+ ShowWindow(pHdr->apRes[tabCounter++], SW_HIDE);
+ }
+
+ if(m->numins)
+ {
+ tie.pszText = WASABI_API_LNGSTRING(IDS_INSTRUMENTS);
+ TabCtrl_InsertItem(pHdr->hwndTab, tabCounter, &tie);
+ pHdr->apRes[tabCounter] = WASABI_API_CREATEDIALOGPARAM(IDD_INSTRUMENTS, hwndDlg, tabProc, IDD_INSTRUMENTS);
+ SendMessage(mikmod.hMainWindow,WM_WA_IPC,(WPARAM)pHdr->apRes[tabCounter],IPC_USE_UXTHEME_FUNC);
+ SetWindowPos(pHdr->apRes[tabCounter], HWND_TOP, pHdr->left+1, pHdr->top+15, 0, 0, SWP_NOSIZE);
+ ShowWindow(pHdr->apRes[tabCounter++], SW_HIDE);
+ }
+
+ if(m->comment && m->comment[0])
+ {
+ tie.pszText = WASABI_API_LNGSTRING(IDS_COMMENT);
+ TabCtrl_InsertItem(pHdr->hwndTab, tabCounter, &tie);
+ pHdr->apRes[tabCounter] = WASABI_API_CREATEDIALOGPARAM(IDD_COMMENT, hwndDlg, tabProc, CEMENT_BOX);
+ SendMessage(mikmod.hMainWindow,WM_WA_IPC,(WPARAM)pHdr->apRes[tabCounter],IPC_USE_UXTHEME_FUNC);
+ SetWindowPos(pHdr->apRes[tabCounter], HWND_TOP, pHdr->left+1, pHdr->top+15, 0, 0, SWP_NOSIZE);
+ ShowWindow(pHdr->apRes[tabCounter++], SW_HIDE);
+ }
+
+ // Simulate selection of the LAST item
+ TabCtrl_SetCurSel(pHdr->hwndTab, tabCounter-1);
+ OnSelChanged(hwndDlg);
+}
+
+
+// =====================================================================================
+static BOOL CALLBACK tabProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+// =====================================================================================
+// This is the callback procedure used by each of the three forms under the
+// tab control on the Module info dialog box (sample, instrument, comment
+// info forms).
+{
+ switch (uMsg)
+ { case WM_INITDIALOG:
+ {
+ HWND hwndLB;
+ DLGHDR *pHdr = (DLGHDR *)GetWindowLong(GetParent(hwndDlg), GWL_USERDATA);
+ UNIMOD *m = pHdr->module;
+ char sbuf[10280] = {0};
+
+ switch(lParam)
+ { case IDD_SAMPLES:
+ {
+ uint x;
+
+ hwndLB = GetDlgItem(hwndDlg, IDC_SAMPLIST);
+ for (x=0; x<m->numsmp; x++)
+ {
+ StringCbPrintfA(sbuf, sizeof(sbuf), "%02d: %s",x+1, m->samples[x].samplename ? m->samples[x].samplename : "");
+ SendMessage(hwndLB, LB_ADDSTRING, 0, (LPARAM) sbuf);
+ }
+ SendMessage(hwndLB, LB_SETCURSEL, 0, 0);
+ tabProc(hwndDlg, WM_COMMAND, (WPARAM)((LBN_SELCHANGE << 16) + IDC_SAMPLIST), (LPARAM)hwndLB);
+ }
+ return TRUE;
+
+ case IDD_INSTRUMENTS:
+ {
+ uint x;
+
+ hwndLB = GetDlgItem(hwndDlg, IDC_INSTLIST);
+ for (x=0; x<m->numins; x++)
+ {
+ StringCbPrintfA(sbuf, sizeof(sbuf), "%02d: %s",x+1, m->instruments[x].insname ? m->instruments[x].insname : "");
+ SendMessage(hwndLB, LB_ADDSTRING, 0, (LPARAM) sbuf);
+ }
+ SendMessage(hwndLB, LB_SETCURSEL, 0, 0);
+ tabProc(hwndDlg, WM_COMMAND, (WPARAM)((LBN_SELCHANGE << 16) + IDC_INSTLIST), (LPARAM)hwndLB);
+ }
+ return TRUE;
+
+ case CEMENT_BOX:
+ if(m->comment && m->comment[0])
+ {
+ uint x,i;
+
+ hwndLB = GetDlgItem(hwndDlg, CEMENT_BOX);
+ // convert all CRs to CR/LF pairs. That's the way the edit box likes them!
+
+ for(x=0, i=0; x<strlen(m->comment) && i < sizeof(sbuf)-1; x++)
+ {
+ sbuf[i++] = m->comment[x];
+ if(m->comment[x]==0x0d && m->comment[x+1]!=0x0a)
+ sbuf[i++] = 0x0a;
+ }
+ sbuf[i] = 0;
+
+ SetWindowText(hwndLB, sbuf);
+ }
+ return TRUE;
+ }
+ }
+ break;
+
+ case WM_COMMAND:
+ if(HIWORD(wParam) == LBN_SELCHANGE)
+ { // Processes the events for the sample and instrument list boxes, namely updating
+ // the samp/inst info upon a WM_COMMAND issuing a listbox selection change.
+
+ int moo = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);
+ char sbuf[1024] = {0}, st1[128] = {0}, st2[64] = {0}, st3[64] = {0};
+ char tmp1[32] = {0}, tmp2[32] = {0}, tmp3[32] = {0};
+ DLGHDR *pHdr = (DLGHDR *)GetWindowLong(GetParent(hwndDlg), GWL_USERDATA);
+ UNIMOD *m = pHdr->module;
+
+ switch (LOWORD(wParam))
+ { case IDC_INSTLIST:
+ { INSTRUMENT *inst = &m->instruments[moo];
+ uint x;
+ size_t cnt;
+ char *sbuf_p;
+
+ // --------------------
+ // Part 1: General instrument header info
+ // default volume, auto-vibrato, fadeout (in that order).
+
+ {
+ StringCbPrintfA(sbuf, sizeof(sbuf), "%d%%\n%s\n%s", (inst->globvol * 400) / 256,
+ WASABI_API_LNGSTRING_BUF((inst->vibdepth ? IDS_YES : IDS_NO),tmp1,sizeof(tmp1)/sizeof(*tmp1)),
+ WASABI_API_LNGSTRING_BUF((inst->volfade ? IDS_YES : IDS_NO),tmp2,sizeof(tmp2)/sizeof(*tmp2)));
+ SetWindowText(GetDlgItem(hwndDlg, IDC_INSTHEAD), sbuf);
+ }
+ //(inst->nnatype == NNA_CONTINUE) ? "Continue" : (inst->nnatype == NNA_OFF) ? "Off" : (inst->nnatype == NNA_FADE) ? "Fade" : "Cut");
+
+ // --------------------
+ // Part 2: The instrument envelope info (vol/pan/pitch)
+
+ // Wow this is ugly, but it works: Make a set of strings that have the
+ // '(loop / sustain)' string. Tricky, cuz the '/' is only added if it
+ // is needed of course.
+
+ if(inst->volflg & (EF_LOOP | EF_SUSTAIN))
+ {
+ StringCbPrintfA(st1, sizeof(st1), "(%s%s%s)",
+ (inst->volflg & EF_LOOP) ? WASABI_API_LNGSTRING(IDS_LOOP) : "",
+ ((inst->volflg & EF_LOOP) && (inst->volflg & EF_SUSTAIN)) ? " / " : "",
+ (inst->volflg & EF_SUSTAIN) ? WASABI_API_LNGSTRING_BUF(IDS_SUSTAIN,tmp1,sizeof(tmp1)/sizeof(*tmp1)) : "");
+ } else st1[0] = 0;
+
+ if(inst->panflg & (EF_LOOP | EF_SUSTAIN))
+ {
+
+ StringCbPrintfA(st2, sizeof(st2), "(%s%s%s)",
+ (inst->panflg & EF_LOOP) ? WASABI_API_LNGSTRING(IDS_LOOP) : "",
+ ((inst->panflg & EF_LOOP) && (inst->panflg & EF_SUSTAIN)) ? " / " : "",
+ (inst->panflg & EF_SUSTAIN) ? WASABI_API_LNGSTRING_BUF(IDS_SUSTAIN,tmp1,sizeof(tmp1)/sizeof(*tmp1)) : "");
+ } else st2[0] = 0;
+
+ if(inst->pitflg & (EF_LOOP | EF_SUSTAIN))
+ {
+ StringCchPrintfA(st3,sizeof(st3), "(%s%s%s)",
+ (inst->pitflg & EF_LOOP) ? WASABI_API_LNGSTRING(IDS_LOOP) : "",
+ ((inst->pitflg & EF_LOOP) && (inst->pitflg & EF_SUSTAIN)) ? " / " : "",
+ (inst->pitflg & EF_SUSTAIN) ? WASABI_API_LNGSTRING_BUF(IDS_SUSTAIN,tmp1,sizeof(tmp1)/sizeof(*tmp1)) : "");
+ } else st3[0] = 0;
+
+ {
+ StringCbPrintfA(sbuf, sizeof(sbuf), "%s %s\n%s %s\n%s %s",
+ WASABI_API_LNGSTRING_BUF(((inst->volflg & EF_ON) ? IDS_ON : IDS_OFF),tmp1,sizeof(tmp1)/sizeof(*tmp1)),
+ st1[0] ? st1 : "",
+ WASABI_API_LNGSTRING_BUF(((inst->panflg & EF_ON) ? IDS_ON : IDS_OFF),tmp2,sizeof(tmp2)/sizeof(*tmp2)),
+ st2[0] ? st2 : "",
+ WASABI_API_LNGSTRING_BUF(((inst->pitflg & EF_ON) ? IDS_ON : IDS_OFF),tmp3,sizeof(tmp3)/sizeof(*tmp3)),
+ st3[0] ? st3 : "");
+
+ }
+ SetWindowText(GetDlgItem(hwndDlg, IDC_INSTENV), sbuf);
+
+ // --------------------
+ // Part 3: List of samples used by this instrument!
+ // the trick here is that that we have to figure out what samples are used from the
+ // sample index table in inst->samplenumber.
+
+ memset(pHdr->suse,0,m->numsmp*sizeof(BOOL));
+ for(x=0; x<120; x++)
+ if(inst->samplenumber[x] != 65535)
+ pHdr->suse[inst->samplenumber[x]] = 1;
+
+ sbuf[0] = 0; cnt = sizeof(sbuf)/sizeof(*sbuf);
+ sbuf_p = sbuf;
+ for (x=0; x<m->numsmp; x++)
+ {
+ if(pHdr->suse[x])
+ {
+ StringCbPrintfExA(sbuf_p, cnt, &sbuf_p, &cnt, 0, "%02d: %s\r\n",x+1, m->samples[x].samplename);
+ }
+ }
+ if (cnt < sizeof(sbuf)/sizeof(*sbuf))
+ {
+ sbuf[sizeof(sbuf)/sizeof(*sbuf) - cnt - 2] = 0; // cut off the final CR/LF set
+ }
+ SetWindowText(GetDlgItem(hwndDlg, TB_SAMPLELIST), sbuf);
+
+ }
+ break;
+
+ case IDC_SAMPLIST:
+ { UNISAMPLE *samp = &m->samples[moo];
+ EXTSAMPLE *es = NULL;
+
+ if(m->extsamples) es = &m->extsamples[moo];
+
+ // Display sampe header info...
+ // Length, Format, Quality, Looping, Auto-vibrato, Volume, Panning (in that order).
+
+ {
+ char yn[64] = {0}, pp[64] = {0};
+ StringCbPrintfA(sbuf, sizeof(sbuf), "%d %s\n%d %s\n%s %s\n%s\n%s\n%d\n%d",
+ samp->length * (samp->format&SF_16BITS ? 2 : 1), WASABI_API_LNGSTRING_BUF(IDS_BYTES, tmp1, sizeof(tmp1)/sizeof(*tmp1)),
+ samp->speed, WASABI_API_LNGSTRING_BUF((m->flags&UF_XMPERIODS ? IDS_FINETUNE : (samp->format&SF_SIGNED ? IDS_HZ_SIGNED : IDS_HZ_UNSIGNED)),tmp2,sizeof(tmp2)/sizeof(*tmp2)),
+ samp->format & SF_16BITS ? "16" : "8", WASABI_API_LNGSTRING_BUF(IDS_BITS, tmp3, sizeof(tmp3)/sizeof(*tmp3)),
+ WASABI_API_LNGSTRING_BUF((samp->flags&SL_LOOP ? ( samp->flags&SL_BIDI ? IDS_PING_PONG : (samp->flags&SL_REVERSE ? IDS_REVERSE : IDS_FORWARD )) : samp->flags&SL_SUSTAIN_LOOP ? ( samp->flags&SL_SUSTAIN_BIDI ? IDS_SUSTAIN_PING_PONG : IDS_SUSTAIN ) : IDS_NONE),pp,sizeof(pp)/sizeof(*pp)),
+ WASABI_API_LNGSTRING_BUF(((es && es->vibdepth) ? IDS_YES : IDS_NO),yn,sizeof(yn)/sizeof(*yn)),
+ samp->volume, samp->panning);
+ }
+
+ SetWindowText(GetDlgItem(hwndDlg, IDC_SAMPINFO), sbuf);
+ }
+ break;
+ }
+ }
+ break;
+ }
+ return 0;
+}
+
+
+// =====================================================================================
+static void OnSelChanged(HWND hwndDlg)
+// =====================================================================================
+{
+ DLGHDR *pHdr = (DLGHDR *) GetWindowLong(hwndDlg, GWL_USERDATA);
+ int iSel = TabCtrl_GetCurSel(pHdr->hwndTab);
+
+ if(pHdr->hwndDisplay) ShowWindow(pHdr->hwndDisplay,SW_HIDE);
+ ShowWindow(pHdr->apRes[iSel],SW_SHOW);
+ pHdr->hwndDisplay = pHdr->apRes[iSel];
+
+ // Note to self: Despite their inhernet use in interfaces, coding tab controls
+ // apparently REALLY sucks, and it should never ever be done again by myself
+ // or anyone else whom I respect as a sane individual and I would like to have
+ // remain that way. As for me, it is too late. Bruhahahaha!K!J!lkjgkljASBfkJBdglkn.
+
+}
+
+// =====================================================================================
+static void CALLBACK UpdateInfoRight(HWND hwnd, UINT uMsg, UINT ident, DWORD systime)
+// =====================================================================================
+{
+ char str[256] = {0};
+ DLGHDR *pHdr = (DLGHDR *)GetWindowLong(hwnd, GWL_USERDATA);
+ MPLAYER *mp;
+
+ // Player info update .. BPM, sngspeed, position, row, voices.
+ // Only update if our mf struct is the same as the one currently loaded into the player.
+
+ if ((mp = get_player(pHdr->module)) == NULL)
+ {
+ // clean up
+ if (pHdr->inUse)
+ {
+ UNIMOD *m = pHdr->module;
+ pHdr->inUse = FALSE;
+
+ StringCbPrintfA(str, sizeof(str), WASABI_API_LNGSTRING(IDS_X_X_X_OF_X_NOT_PLAYING),
+ m->inittempo, m->initspeed, m->numpos);
+ SetDlgItemText(hwnd, IDC_INFORIGHT, str);
+
+ if (pHdr->seeker)
+ {
+ if (pHdr->seeker != mp)
+ Player_Free(pHdr->seeker);
+ pHdr->seeker = NULL;
+ }
+ }
+
+ // "track song" mode
+ if (mf && IsDlgButtonChecked(hwnd, IDC_TRACK)==BST_CHECKED)
+ {
+ SendMessage(hwnd, WM_USER+10, 0, 0);
+ infoDlg(GetParent(hwnd), mf, GetActiveWindow()==hwnd, FALSE);
+ PostMessage(hwnd, WM_CLOSE, 0, 0);
+ }
+ }
+ else
+ {
+ MPLAYER *seeker;
+ long acv;
+
+ if (!pHdr->inUse)
+ {
+ assert(pHdr->seeker == NULL);
+ pHdr->inUse = TRUE;
+
+ // create our new player instance specifically for seeking
+ if (!(config_playflag & CPLAYFLG_SEEKBYORDERS))
+ {
+ if ((pHdr->seeker = Player_Dup(mp)) == NULL)
+ return;
+
+ // steal statelist from the original player
+ // (this will not require special handling,
+ // because of a smart allocation system)
+
+ pHdr->seeker->statelist = mp->statelist;
+ pHdr->seeker->statecount = mp->statecount;
+ }
+ else pHdr->seeker = NULL;
+ }
+
+ // Seek to our new song time, using a bastardized version of Player_SetPosTime code:
+ if (pHdr->seeker)
+ {
+ long curtime = mikmod.GetOutputTime() * 64;
+ seeker = pHdr->seeker;
+
+ if (seeker->statelist)
+ {
+ int t = 0;
+
+ while (t<seeker->statecount &&
+ seeker->statelist[t].curtime &&
+ curtime>=seeker->statelist[t].curtime)
+ t++;
+
+ if (t)
+ Player_Restore(seeker, t - 1);
+ else Player_Cleaner(seeker);
+ }
+ else Player_Cleaner(seeker);
+
+ while(!seeker->ended && seeker->state.curtime<curtime)
+ Player_PreProcessRow(seeker, NULL);
+ }
+ else seeker = mp;
+
+ // Display all the goodie info we have collected:
+ // ---------------------------------------------
+
+ acv = Mikmod_GetActiveVoices(mp->vs->md);
+ if (acv > pHdr->maxv) pHdr->maxv = acv;
+
+ StringCbPrintfA(str, sizeof(str), WASABI_API_LNGSTRING(IDS_X_X_X_OF_X_X_OF_X_X_OF_X),
+ seeker->state.bpm, seeker->state.sngspd, seeker->state.sngpos,
+ seeker->mf->numpos, seeker->mf->positions[seeker->state.sngpos],
+ seeker->state.patpos, seeker->state.numrow, acv, pHdr->maxv);
+ SetWindowText(GetDlgItem(hwnd,IDC_INFORIGHT), str);
+ }
+}
+
+// =====================================================================================
+void infoDlg(HWND hwnd, UNIMOD *m, BOOL activate, BOOL primiary)
+// =====================================================================================
+{
+ INFOBOX *box;
+ HWND dialog, hwndPrev;
+ char str[256] = {0};
+
+ if (!m) return;
+
+ //
+ // create local dataplace
+ //
+
+ box = (INFOBOX*)calloc(1, sizeof(INFOBOX));
+ if (!box) return;
+
+ box->dlg.left = 7;
+ box->dlg.top = 168;
+ box->dlg.module = m;
+ box->dlg.ownModule = primiary;
+
+ box->next = infobox_list;
+ infobox_list = box;
+
+ //
+ // create dialog
+ //
+
+ hwndPrev = GetActiveWindow();
+ box->hwnd = dialog = WASABI_API_CREATEDIALOG(IDD_ID3EDIT, hwnd, infoProc);
+ box->dlg.hwndTab = GetDlgItem(dialog, IDC_TAB);
+
+ SetWindowLong(dialog, GWL_USERDATA, (LONG)&box->dlg);
+ SetDlgItemText(dialog, IDC_ID3_FN, m->filename);
+
+ // IDC_INFOLEFT contains static module information:
+ // File Size, Length (in mins), channels, samples, instruments.
+
+ StringCbPrintfA(str, sizeof(str), WASABI_API_LNGSTRING(IDS_X_BTYES_X_OF_X_MINUTES),
+ m->filesize, m->songlen/60000,(m->songlen%60000)/1000, m->numchn, m->numsmp, m->numins);
+ SetDlgItemText(dialog, IDC_INFOLEFT, str);
+ SetDlgItemText(dialog, IDC_TITLE, m->songname);
+ SetDlgItemText(dialog, IDC_TYPE, m->modtype);
+
+ // IDC_INFORIGHT - contains player information
+
+ StringCbPrintfA(str, sizeof(str), WASABI_API_LNGSTRING(IDS_X_X_X_OF_X_NOT_PLAYING),
+ m->inittempo, m->initspeed, m->numpos);
+ SetDlgItemText(dialog, IDC_INFORIGHT, str);
+
+ // pHdr->suse is a samples-used block, allocated if this module uses
+ // instruments, and used to display the sampels that each inst uses
+
+ if (m->numins)
+ box->dlg.suse = (BOOL*)calloc(m->numsmp, sizeof(BOOL));
+
+ CheckDlgButton(dialog, IDC_TRACK, config_track ? BST_CHECKED : BST_UNCHECKED);
+ infoTabInit(dialog, m, &box->dlg);
+ SetTimer(dialog, 1, 50, UpdateInfoRight);
+
+ ShowWindow(dialog, SW_SHOW);
+ if (!activate) SetActiveWindow(hwndPrev); // do not steal focus
+}
+
+// =====================================================================================
+void info_killseeker(HWND hwnd)
+// =====================================================================================
+{
+ DLGHDR *pHdr = (DLGHDR *)GetWindowLong(hwnd, GWL_USERDATA);
+
+ if (pHdr->seeker)
+ {
+ assert(pHdr->inUse);
+
+ if (pHdr->seeker != mp)
+ Player_Free(pHdr->seeker);
+ pHdr->seeker = NULL;
+ }
+
+ pHdr->inUse = FALSE;
+}
+
+
+// =====================================================================================
+static BOOL CALLBACK infoProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+// =====================================================================================
+{
+ UNIMOD *m = NULL;
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ RECT rect, wrect;
+
+ if (GetWindowRect(mikmod.hMainWindow, &wrect) && GetWindowRect(hwndDlg, &rect))
+ {
+ wrect.left += config_info_x;
+ wrect.top += config_info_y;
+
+ if (wrect.left>=0 && wrect.top>=0 &&
+ wrect.left<GetSystemMetrics(SM_CXFULLSCREEN)-16 &&
+ wrect.top<GetSystemMetrics(SM_CYFULLSCREEN)-16)
+ MoveWindow(hwndDlg, wrect.left, wrect.top, rect.right-rect.left, rect.bottom-rect.top, FALSE);
+ }
+ }
+ return TRUE;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ case IDCANCEL:
+ SendMessage(hwndDlg, WM_CLOSE, 0, 0);
+ break;
+ case IDC_TRACK:
+ config_track = IsDlgButtonChecked(hwndDlg, IDC_TRACK) == BST_CHECKED;
+ break;
+ }
+ break;
+
+ case WM_USER + 10:
+ case WM_CLOSE:
+ // save offset
+ {
+ RECT rect, wrect;
+
+ if (GetWindowRect(mikmod.hMainWindow, &wrect) && GetWindowRect(hwndDlg, &rect))
+ {
+ config_info_x = rect.left - wrect.left;
+ config_info_y = rect.top - wrect.top;
+ }
+ }
+ config_track = IsDlgButtonChecked(hwndDlg, IDC_TRACK) == BST_CHECKED;
+
+ // clean up
+ if (uMsg != WM_CLOSE)
+ break;
+
+ KillTimer(hwndDlg, 1);
+ infobox_delete(hwndDlg);
+ config_write();
+ break;
+
+ case WM_NOTIFY:
+ {
+ NMHDR *notice = (NMHDR*)lParam;
+ switch(notice->code)
+ {
+ case TCN_SELCHANGE:
+ OnSelChanged(hwndDlg);
+ break;
+ }
+ }
+ return TRUE;
+ }
+ return 0;
+}
diff --git a/Src/Plugins/Input/in_mod/mikamp/src/Main.c b/Src/Plugins/Input/in_mod/mikamp/src/Main.c
new file mode 100644
index 00000000..b10f4bb0
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/src/Main.c
@@ -0,0 +1,1067 @@
+#include "api.h"
+extern "C" {
+#include "main.h"
+}
+#include "log.h"
+#include "../../winamp/wa_ipc.h"
+#include "../nu/AutoWide.h"
+#include "../nu/AutoCharFn.h"
+#include <shlwapi.h>
+#include <commdlg.h>
+
+extern "C" MMSTREAM *_mm_fopen_rf(const CHAR *fname); //rf_wrapper.c
+
+//
+// data types and stuff
+//
+
+#define SU_POSITION 1
+#define SU_TIME 2
+
+#define PPF_CONT_LOOP 1
+#define PPF_LOOPALL 2
+#define PPF_ADD_TITLE 4
+
+typedef struct
+{
+ const char *cmd;
+ const char *file;
+ const char *title;
+ int titleLength;
+ int start;
+ int startUnit;
+ int loops;
+ int flags;
+} PlayParams;
+
+
+// Public Globals!
+// ---------------
+extern "C"
+{
+ UNIMOD *mf;
+ MPLAYER *mp;
+ int paused;
+ int decode_pos; // in 1/64th of millisecond
+ extern char cfg_format[];
+}
+
+
+void infobox_setmodule(HWND hwnd);
+
+
+// Static Globals!
+// ---------------
+
+#define SILENCE_THRESHOLD 10800
+
+extern "C" int GetSampleSizeFlag();
+static char ERROR_TITLE[64];
+
+static int is_tempfile = 0;
+static char cmdName[2048], saveName[MAX_PATH];
+static char songTitle[400]; // as in Winamp
+static PlayParams currParams;
+
+static HANDLE thread_handle = INVALID_HANDLE_VALUE;
+static volatile int killDecodeThread;
+static volatile int seek_needed;
+
+// wasabi based services for localisation support
+api_application *WASABI_API_APP = 0;
+api_language *WASABI_API_LNG = 0;
+HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0;
+
+extern "C" DWORD WINAPI decodeThread(void *b);
+void __cdecl setoutputtime(int time_in_ms);
+
+// =====================================================================================
+// error handling shiz
+// =====================================================================================
+
+static int lastError = 0;
+
+__inline void mm_clearerror() { lastError = 0; }
+
+static void mmerr(int crap, const CHAR *crud)
+{
+ char tmp[128] = {0};
+ if (lastError==crap || crap==MMERR_OPENING_FILE)
+ return;
+ else
+ {
+ if(!lstrcmpi(crud,"Corrupt file or unsupported module type."))
+ {
+ WASABI_API_LNGSTRING_BUF(IDS_CORRUPT_UNSUPPORTED_TYPE,tmp,128);
+ }
+ else
+ tmp[0] = 0;
+ }
+
+ MessageBox(mikmod.hMainWindow, (tmp[0]?tmp:crud), ERROR_TITLE, MB_ICONERROR);
+ lastError = crap;
+}
+
+
+// =====================================================================================
+static int __cdecl init(void)
+// =====================================================================================
+{
+ if (!IsWindow(mikmod.hMainWindow))
+ return IN_INIT_FAILURE;
+
+ waServiceFactory *sf = mikmod.service->service_getServiceByGuid(languageApiGUID);
+ if (sf) WASABI_API_LNG = reinterpret_cast<api_language*>(sf->getInterface());
+
+ sf = mikmod.service->service_getServiceByGuid(applicationApiServiceGuid);
+ if (sf) WASABI_API_APP = reinterpret_cast<api_application*>(sf->getInterface());
+
+ // need to have this initialised before we try to do anything with localisation features
+ WASABI_API_START_LANG(mikmod.hDllInstance,InModLangGUID);
+
+ static wchar_t szDescription[256];
+ swprintf(szDescription,256,WASABI_API_LNGSTRINGW(IDS_NULLSOFT_MODULE_DECODER),PLUGIN_VER);
+ mikmod.description = (char*)szDescription;
+
+ WASABI_API_LNGSTRING_BUF(IDS_MOD_PLUGIN_ERROR,ERROR_TITLE,64);
+
+ _mmerr_sethandler(&mmerr);
+
+ config_read();
+
+ Mikmod_RegisterAllLoaders();
+ Mikmod_RegisterDriver(drv_amp);
+ //Mikmod_RegisterDriver(drv_buffer);
+ return IN_INIT_SUCCESS;
+}
+
+// =====================================================================================
+static void __cdecl quit()
+// =====================================================================================
+{
+//LOG log_exit();
+ SL_Cleanup();
+}
+
+static MDRIVER *md;
+
+// =====================================================================================
+// file open shiz
+// =====================================================================================
+
+#define IPC_GETHTTPGETTER 240
+
+__inline char *GetFileName(const char *fullname)
+{
+ const char *c = fullname + strlen(fullname) - 1;
+
+ while (c > fullname)
+ {
+ if (*c=='\\' || *c=='/')
+ {
+ c++;
+ break;
+ }
+ c--;
+ }
+
+ return (char*)c;
+}
+
+char* BuildFilterString(void)
+{
+ static char filterStr[128] = {0};
+ if(!filterStr[0])
+ {
+ char* temp = filterStr;
+ WASABI_API_LNGSTRING_BUF(IDS_ALL_FILES,filterStr,128);
+ temp += lstrlen(filterStr)+1;
+ lstrcpy(temp, "*.*");
+ *(temp = temp + lstrlen(temp) + 1) = 0;
+ }
+ return filterStr;
+}
+
+BOOL GetPlayParams(const char *fileName, BOOL open, PlayParams *params)
+{
+ mm_clearerror();
+
+ // fill params
+ params->cmd = fileName;
+ params->start = 0;
+ params->loops = config_loopcount;
+ params->titleLength = 0;
+ params->flags = 0;
+
+ if (config_playflag & CPLAYFLG_CONT_LOOP)
+ params->flags |= PPF_CONT_LOOP;
+
+ if (config_playflag & CPLAYFLG_LOOPALL)
+ params->flags |= PPF_LOOPALL;
+
+ if (params->loops == -1)
+ params->flags &= ~PPF_CONT_LOOP;
+
+ // check for mod:// prefix
+ if (!strncmp(fileName, "mod://", 6))
+ {
+ const char *c = fileName += 6;
+
+ while (c && *c && *c!=':')
+ {
+ // jump to
+ if (!strncmp(c, "jmp=", 4))
+ {
+ // jump units
+ switch (*(c + 4))
+ {
+ // position
+ case 'p':
+ params->startUnit = SU_POSITION;
+ params->flags &= ~PPF_CONT_LOOP;
+ break;
+ // time
+ case 't':
+ params->startUnit = SU_TIME;
+ break;
+ // invalid
+ default:
+ return FALSE;
+ }
+ params->start = atoi(c + 5);
+ }
+ // loops
+ else if (!strncmp(c, "lop=", 4))
+ {
+ if (*(c+4) == 'u')
+ {
+ params->flags |= PPF_LOOPALL;
+ c++;
+ }
+ params->loops = atoi(c + 4);
+ params->loops = _mm_boundscheck(params->loops, -1, 64);
+ if (params->loops == -1)
+ params->flags &= ~PPF_CONT_LOOP;
+ }
+ // continue after loop
+ else if (!strncmp(c, "con=", 4))
+ {
+ if (atoi(c + 4))
+ params->flags |= PPF_CONT_LOOP;
+ else params->flags &= ~PPF_CONT_LOOP;
+ }
+ // title
+ else if (!strncmp(c, "tit=", 4))
+ {
+ // find string
+ const char *p = c + 4;
+
+ if (*p == '+')
+ {
+ params->flags |= PPF_ADD_TITLE;
+ c++;
+ p++;
+ }
+
+ if (*p++ != '"') return FALSE;
+
+ while (p && *p && *p!='"')
+ p++;
+
+ if (*p != '"') return FALSE;
+ // set
+ params->title = c + 5;
+ params->titleLength = p - c - 5;
+ c = p - 3;
+ }
+ // invalid
+ else return FALSE;
+
+ // skip
+ c += 4;
+ while (c && *c && *c!=',' && *c!=':')
+ c++;
+ if (*c == ',') c++;
+ }
+
+ if (!*c) return FALSE;
+ fileName = c + 1;
+ }
+
+ params->file = fileName;
+
+ // check for URLs
+ if (open)
+ {
+ saveName[0] = 0;
+ is_tempfile = 0;
+
+ if (!_strnicmp(fileName, "http://", 7) || !_strnicmp(fileName, "https://", 8) ||
+ !_strnicmp(fileName, "ftp://", 6)) // FTP is now currently supported, but still...
+ {
+ typedef int (__cdecl *HttpRetrieveFile)(HWND hwnd, const char *url, const char *file, const char *dlgtitle);
+
+ HttpRetrieveFile fileGetter;
+ int t = SendMessage(mikmod.hMainWindow,WM_USER,0,IPC_GETHTTPGETTER);
+ // try to get httpGetter
+ if (!t || t==1)
+ {
+ MessageBox(mikmod.hMainWindow,
+ WASABI_API_LNGSTRING(IDS_URLS_ONLY_SUPPORTED_IN_2_10_PLUS),
+ ERROR_TITLE, MB_ICONERROR);
+ return FALSE;
+ }
+
+ fileGetter = (HttpRetrieveFile)t;
+ // save stream if required
+ if (config_savestr)
+ {
+ OPENFILENAME l = {0};
+ lstrcpyn(saveName, GetFileName(fileName), MAX_PATH);
+ l.lStructSize = sizeof(l);
+ l.hwndOwner = mikmod.hMainWindow;
+ l.hInstance = NULL;
+ l.lpstrFilter = BuildFilterString();
+ l.lpstrCustomFilter = NULL;
+ l.nMaxCustFilter = 0;
+ l.nFilterIndex = 0;
+ l.lpstrFile = saveName;
+ l.nMaxFile = sizeof(saveName);
+ l.lpstrFileTitle = 0;;
+ l.nMaxFileTitle = 0;
+ l.lpstrInitialDir = NULL;
+ l.lpstrTitle = WASABI_API_LNGSTRING(IDS_SAVE_MODULE);
+ l.lpstrDefExt = "mod";
+ l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_OVERWRITEPROMPT;
+
+ if (!GetSaveFileName(&l))
+ saveName[0] = 0;
+ }
+ // generate temp name, if not saving
+ if (!saveName[0])
+ {
+ char p[MAX_PATH] = {0};
+
+ GetTempPath(sizeof(p), p);
+ GetTempFileName(p, "mod", 0, saveName);
+ is_tempfile = 1;
+ }
+ // get file
+ if (fileGetter(mikmod.hMainWindow, fileName, saveName, WASABI_API_LNGSTRING(IDS_RETRIEVING_MODULE)))
+ {
+ is_tempfile = 0;
+ saveName[0] = 0;
+ return FALSE;
+ }
+ params->file = saveName;
+ }
+ }
+ else
+ {
+ if (saveName[0] && !_stricmp(fileName, cmdName))
+ params->file = saveName;
+ }
+
+ return TRUE;
+}
+
+static void CleanupTemp()
+{
+ if (is_tempfile && saveName[0])
+ {
+ DeleteFile(saveName);
+ is_tempfile = 0;
+ }
+
+ saveName[0] = 0;
+}
+
+BOOL InitPlayer(UNIMOD *mf, MPLAYER **ps, const PlayParams *params, BOOL quick)
+{
+ int flags;
+
+ // strip silence
+ if (config_playflag & CPLAYFLG_STRIPSILENCE)
+ Unimod_StripSilence(mf, SILENCE_THRESHOLD);
+
+ // set flags
+ flags = PF_TIMESEEK;
+ if (params->flags & PPF_CONT_LOOP) flags |= PF_CONT_LOOP;
+
+ // init player
+ if (quick)
+ *ps = Player_Create(mf, flags);
+ else *ps = Player_InitSong(mf, NULL, flags, config_voices);
+
+ if (!*ps) return FALSE;
+
+ // position seek
+ if (params->start && params->startUnit==SU_POSITION)
+ Player_SetStartPosition(*ps, params->start);
+
+ // looping
+ Player_SetLoopStatus(*ps, params->flags & PPF_LOOPALL, params->loops);
+
+ if (quick || config_playflag&CPLAYFLG_SEEKBYORDERS)
+ Player_PredictSongLength(*ps);
+ else
+ {
+ // time calculation & seeking-lookups creation
+ Player_BuildQuickLookups(*ps);
+
+ // fade (needs results of Player_BuildQuickLookups)
+ if (config_playflag & CPLAYFLG_FADEOUT)
+ Player_VolumeFadeEx(*ps, MP_VOLUME_CUR, 0, config_fadeout, MP_SEEK_END, config_fadeout);
+ }
+
+ // remember song length
+ mf->songlen = (*ps)->songlen;
+
+ return TRUE;
+}
+
+static UNIMOD *GetModuleInfo(const PlayParams *params)
+{
+ UNIMOD *m = mf;
+
+ // check against the current one
+ if (!m || _stricmp(cmdName, params->cmd)) // check the whole string, not just file name
+ {
+ MPLAYER *ps;
+ MMSTREAM * fp;
+
+ // load module
+ mm_clearerror();
+ fp = _mm_fopen_rf(params->file);
+ if (!fp) return NULL;
+ m = Unimod_LoadInfo_FP(params->file,fp);
+ _mm_fclose(fp);
+ if (!m) return NULL;
+
+ // get info and clean up
+ if (!InitPlayer(m, &ps, params, TRUE))
+ {
+ Unimod_Free(m);
+ return NULL;
+ }
+ Player_Free(ps);
+ }
+
+ return m;
+}
+
+static int __cdecl isourfile(const char *fn)
+{
+ return !_strnicmp(fn, "mod://", 6);
+}
+
+// =====================================================================================
+// helpers
+// =====================================================================================
+
+static UNIMOD *FindInfoBox(const char *fileName, HWND *hwnd)
+{
+ INFOBOX *cruise;
+
+ for (cruise=infobox_list; cruise; cruise=cruise->next)
+ if (!_stricmp(cruise->dlg.module->filename, fileName))
+ {
+ if (hwnd) *hwnd = cruise->hwnd;
+ return cruise->dlg.module;
+ }
+
+ return NULL;
+}
+
+static BOOL FindInfoBoxPtr(const UNIMOD *mf)
+{
+ INFOBOX *cruise;
+
+ for (cruise=infobox_list; cruise; cruise=cruise->next)
+ if (cruise->dlg.module == mf)
+ return TRUE;
+
+ return FALSE;
+}
+
+// =====================================================================================
+static int __cdecl play(const char *fileName)
+// =====================================================================================
+{
+ PlayParams params;
+ uint md_mode = 0;
+
+ // parse parameters
+ if (!GetPlayParams(fileName, TRUE, &params))
+ return 1;
+
+ // save strings locally
+ lstrcpyn(cmdName, params.cmd, 2048);
+ if (params.titleLength)
+ lstrcpyn(songTitle, params.title, min(params.titleLength+1, sizeof(songTitle)));
+ else songTitle[0] = 0;
+
+ // save current values
+ currParams = params;
+ currParams.cmd = params.cmd;
+ currParams.title = songTitle;
+
+ // Initialize MDRVER
+ // -----------------
+
+ if (config_interp & 1) md_mode |= DMODE_INTERP;
+ if (config_interp & 2) md_mode |= DMODE_NOCLICK;
+ if (config_interp & 4) md_mode |= DMODE_FIR;
+ md_mode |= GetSampleSizeFlag();
+ if (AllowSurround()) md_mode |= DMODE_SURROUND;
+ if (config_panrev) md_mode |= DMODE_REVERSE;
+ if (config_resonance) md_mode |= DMODE_RESONANCE;
+
+ md = Mikmod_Init(config_srate, 1000, NULL, GetNumChannels()==1 ? MD_MONO : MD_STEREO, config_cpu, md_mode, &drv_amp);
+ if (!md)
+ {
+ CleanupTemp();
+ return 1;
+ }
+
+ md->pansep = config_pansep;
+
+ // Register non-interpolation mixers
+ // ---------------------------------
+ // if the user has disabled interpolation...
+
+ if(!(config_interp & 1))
+ {
+ VC_RegisterMixer(md->device.vc, &RF_M8_MONO);
+ VC_RegisterMixer(md->device.vc, &RF_M16_MONO);
+ VC_RegisterMixer(md->device.vc, &RF_M8_STEREO);
+ VC_RegisterMixer(md->device.vc, &RF_M16_STEREO);
+
+ VC_RegisterMixer(md->device.vc, &M8_MONO);
+ VC_RegisterMixer(md->device.vc, &M16_MONO);
+ VC_RegisterMixer(md->device.vc, &M8_STEREO);
+ VC_RegisterMixer(md->device.vc, &M16_STEREO);
+ }
+ else if (config_interp&4)
+ {
+/*
+ VC_RegisterMixerHack(md->device.vc, &M16_MONO_CUBIC);
+ VC_RegisterMixerHack(md->device.vc, &M16_STEREO_CUBIC);
+ VC_RegisterMixerHack(md->device.vc, &M8_MONO_CUBIC);
+ VC_RegisterMixerHack(md->device.vc, &M8_STEREO_CUBIC);
+*/
+ VC_RegisterMixerHack(md->device.vc, &M16_MONO_FIR);
+ VC_RegisterMixerHack(md->device.vc, &M16_STEREO_FIR);
+ VC_RegisterMixerHack(md->device.vc, &M8_MONO_FIR);
+ VC_RegisterMixerHack(md->device.vc, &M8_STEREO_FIR);
+ }
+
+ // LOADING THE SONG
+ // ----------------
+ // Check through the list of active info boxes for a matching filename. If found,
+ // then we use the already-loaded module information instead!
+
+ {
+ HWND hwnd;
+
+ if ((mf=FindInfoBox(params.file, &hwnd)) != NULL)
+ {
+ MMSTREAM *smpfp;
+
+ // prepare for reloading
+ info_killseeker(hwnd);
+
+ // reload samples
+ smpfp = _mm_fopen_rf(params.file);
+ Unimod_LoadSamples(mf, md, smpfp);
+ _mm_fclose(smpfp);
+ }
+ // not already loaded
+ else
+ {
+ MMSTREAM *fp;
+ fp = _mm_fopen_rf(params.file);
+ if (!fp)
+ {
+ Mikmod_Exit(md);
+ CleanupTemp();
+ return -1;
+ }
+//MMEXPORT UNIMOD *Unimod_LoadFP(MDRIVER *md, MMSTREAM *modfp, MMSTREAM *smpfp, int mode);
+//MMEXPORT UNIMOD *Unimod_Load(MDRIVER *md, const CHAR *filename);
+
+ mf=Unimod_Load_FP(md, params.file,fp);
+ _mm_fclose(fp);
+ if (mf==NULL)
+ {
+ Mikmod_Exit(md);
+ CleanupTemp();
+ return -1;
+ }
+ }
+ }
+
+ // file name is stored in module now
+ if (!saveName[0])
+ params.file = mf->filename;
+
+ // init player
+ if (!InitPlayer(mf, &mp, &params, FALSE))
+ {
+ CleanupTemp();
+ return -1;
+ }
+
+ Player_Start(mp);
+
+ // set start time
+ seek_needed = -1;
+ decode_pos = 0;
+ if (params.start && params.startUnit==SU_TIME)
+ setoutputtime(params.start*1000);
+
+ // init output & info
+ mikmod.outMod->SetVolume(-666);
+ mikmod.SetInfo(MulDiv(mf->filesize, 8, mf->songlen), config_srate/1000, GetNumChannels(), 1);
+
+ // init decoding thread
+ {
+ DWORD threadid;
+
+ killDecodeThread = 0;
+ paused = 0;
+ thread_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)decodeThread, NULL, 0, &threadid);
+ set_priority();
+ }
+
+ return 0;
+}
+
+// =====================================================================================
+static void __cdecl stop(void)
+// =====================================================================================
+{
+ if (thread_handle != INVALID_HANDLE_VALUE)
+ {
+ killDecodeThread = 1;
+ if (WaitForSingleObject(thread_handle, 2000) == WAIT_TIMEOUT)
+ {
+ MessageBox(mikmod.hMainWindow,
+ WASABI_API_LNGSTRING(IDS_ERROR_KILLING_DECODING_THREAD),
+ ERROR_TITLE, MB_ICONWARNING);
+ TerminateThread(thread_handle, 0);
+ }
+
+ CloseHandle(thread_handle);
+ thread_handle = INVALID_HANDLE_VALUE;
+ CleanupTemp();
+ }
+
+ Player_Free(mp);
+ mp = NULL;
+
+ // We need to see if mf is in use. If so, then we can't unload it.
+ // Bute we *do* have to unload its samples, because those are not needed.
+
+ if (FindInfoBoxPtr(mf))
+ Unimod_UnloadSamples(mf);
+ else Unimod_Free(mf);
+
+ mf = NULL;
+
+ Mikmod_Exit(md); md = NULL;
+ mikmod.SAVSADeInit();
+}
+
+// =====================================================================================
+// pausing stuff
+// =====================================================================================
+
+static void __cdecl pause(void) { paused=1; mikmod.outMod->Pause(1); }
+static void __cdecl unpause(void) { paused=0; mikmod.outMod->Pause(0); }
+static int __cdecl ispaused(void) { return paused; }
+
+// =====================================================================================
+// seeking/timing related stuff
+// =====================================================================================
+
+static int __cdecl getlength(void)
+{
+ if (mp)
+ {
+ if (!(config_playflag & CPLAYFLG_SEEKBYORDERS))
+ return mp->songlen;
+ else return mf->numpos * 1000;
+ }
+ else return 0;
+}
+
+static int __cdecl getoutputtime(void)
+{
+ if (!(config_playflag & CPLAYFLG_SEEKBYORDERS))
+ return decode_pos/64 + (mikmod.outMod->GetOutputTime() - mikmod.outMod->GetWrittenTime());
+ else return mp ? mp->state.sngpos * 1000 : 0;
+}
+
+static void __cdecl setoutputtime(int time_in_ms)
+{
+ seek_needed = time_in_ms;
+}
+
+// =====================================================================================
+static int __cdecl infobox(const char *fileName, HWND hwnd)
+// =====================================================================================
+{
+ PlayParams params;
+
+ // parse params
+ if (!GetPlayParams(fileName, FALSE, &params))
+ return 1;
+
+ // First we check our array of loaded dialog boxes. If there are any filename matches,
+ // then we just bring that window to the foreground!
+
+ if (FindInfoBox(params.file, &hwnd) != NULL)
+ {
+ SetForegroundWindow(hwnd);
+ return 0;
+ }
+
+ infoDlg(hwnd, GetModuleInfo(&params), TRUE, TRUE);
+
+ return 0;
+}
+
+/*extern "C" __declspec(dllexport) int winampGetExtendedFileInfo(const char *fn, const char *data, char *dest, int destlen)
+{
+ UNIMOD *m=0;
+ PlayParams params;
+ const char *ret=0;
+
+
+ if (!_stricmp(data,"TYPE"))
+ {
+ dest[0] = '0';
+ dest[1] = 0x00;
+ return 1;
+ }
+ if (!_stricmp(data,"FAMILY"))
+ {
+ LPCTSTR e;
+ e = PathFindExtension(fn);
+ if (L'.' != *e) return 0;
+ e++;
+ return GetTypeInfo(e, dest, destlen);
+ }
+
+ if (!GetPlayParams(fn, FALSE, &params))
+ return 0;
+
+ m=GetModuleInfo(&params);
+ if (!m)
+ return 0;
+
+ if (!_stricmp(data,"TITLE"))
+ {
+ if (!params.titleLength || params.flags&PPF_ADD_TITLE)
+ ret = m->songname;
+ else
+ ret=params.title;
+ }
+ else if (!_stricmp(data,"PART"))
+ {
+ if (params.titleLength && params.flags&PPF_ADD_TITLE)
+ ret=params.title;
+ }
+ else if (!_stricmp(data,"ARTIST") )
+ ret=m->composer;
+ else if (!_stricmp(data,"COMPOSER"))
+ ret=m->composer;
+ else if (!_stricmp(data,"COMMENT"))
+ ret=m->comment;
+ else if (!_stricmp(data,"FORMAT") || !_stricmp(data,"MODTYPE"))
+ ret=m->modtype;
+ else if (!_stricmp(data,"LENGTH"))
+ {
+ _itoa(m->songlen, dest, 10);
+ if (m!=mf) // make sure it's not the currently playing file
+ Unimod_Free(m); // in theory this is a race condition
+ return 1;
+ }
+ else
+ {
+ if (m!=mf) // make sure it's not the currently playing file
+ Unimod_Free(m); // in theory this is a race condition
+ return 0;
+ }
+
+ if (ret)
+ lstrcpyn(dest, ret, destlen);
+ else
+ dest[0]=0;
+
+ if (m!=mf) // make sure it's not the currently playing file
+ Unimod_Free(m); // in theory this is a race condition
+ return 1;
+}*/
+
+extern "C" __declspec(dllexport) int winampGetExtendedFileInfoW(const wchar_t *fn, const char *data, wchar_t *dest, int destlen)
+{
+ UNIMOD *m=0;
+ PlayParams params;
+ const char *ret=0;
+
+ if (!_stricmp(data,"TYPE"))
+ {
+ dest[0] = L'0';
+ dest[1] = 0x00;
+ return 1;
+ }
+ if (!_stricmp(data,"FAMILY"))
+ {
+ LPCWSTR e;
+ e = PathFindExtensionW(fn);
+ if (L'.' != *e) return 0;
+ e++;
+ return GetTypeInfo(e, dest, destlen);
+ }
+
+ if (!GetPlayParams(AutoCharFn(fn), FALSE, &params))
+ return 0;
+
+ m=GetModuleInfo(&params);
+ if (!m)
+ return 0;
+
+ if (!_stricmp(data,"TITLE"))
+ {
+ if (!params.titleLength || params.flags&PPF_ADD_TITLE)
+ ret = m->songname;
+ else
+ ret=params.title;
+ }
+ else if (!_stricmp(data,"PART"))
+ {
+ if (params.titleLength && params.flags&PPF_ADD_TITLE)
+ ret=params.title;
+ }
+ else if (!_stricmp(data,"ARTIST") )
+ ret=m->composer;
+ else if (!_stricmp(data,"COMPOSER"))
+ ret=m->composer;
+ else if (!_stricmp(data,"COMMENT"))
+ ret=m->comment;
+ else if (!_stricmp(data,"FORMAT") || !_stricmp(data,"MODTYPE"))
+ ret=m->modtype;
+ else if (!_stricmp(data,"LENGTH"))
+ {
+ _itow(m->songlen, dest, 10);
+ if (m!=mf) // make sure it's not the currently playing file
+ Unimod_Free(m); // in theory this is a race condition
+ return 1;
+ }
+ else
+ {
+ if (m!=mf) // make sure it's not the currently playing file
+ Unimod_Free(m); // in theory this is a race condition
+ return 0;
+ }
+
+ if (ret)
+ lstrcpynW(dest, AutoWide(ret), destlen);
+ else
+ dest[0]=0;
+
+ if (m!=mf) // make sure it's not the currently playing file
+ Unimod_Free(m); // in theory this is a race condition
+ return 1;
+}
+
+// =====================================================================================
+static void __cdecl getfileinfo(const char *fileName, char *title, int *length_in_ms)
+// =====================================================================================
+{
+ PlayParams params;
+ UNIMOD *m;
+ BOOL unload = FALSE;
+
+ // empty string stands for the current file
+ if (fileName!=NULL && *fileName)
+ {
+ if (!GetPlayParams(fileName, FALSE, &params))
+ {
+ lstrcpyn(title, fileName, GETFILEINFO_TITLE_LENGTH);
+ if (length_in_ms)
+ *length_in_ms = -1;
+ return;
+ }
+ }
+ else
+ params = currParams;
+
+ // module loaded
+ if ((m=FindInfoBox(params.file, NULL))!=NULL || (unload=1, m=GetModuleInfo(&params))!=NULL)
+ {
+ if (title)
+ {
+ if (!params.titleLength || params.flags&PPF_ADD_TITLE)
+ lstrcpyn(title, m->songname, GETFILEINFO_TITLE_LENGTH);
+ else
+ lstrcpyn(title, params.title, GETFILEINFO_TITLE_LENGTH);
+ }
+ // set playing time
+ if (length_in_ms)
+ *length_in_ms = m->songlen;
+
+ // clean up
+ if (unload && m!=mf)
+ Unimod_Free(m);
+ }
+ // invalid module or smth else
+ else
+ {
+ lstrcpyn(title, GetFileName(params.file), GETFILEINFO_TITLE_LENGTH);
+ if (length_in_ms)
+ *length_in_ms = -1;
+ }
+}
+
+// =====================================================================================
+// misc stuff
+// =====================================================================================
+
+static void __cdecl setvolume(int volume) { mikmod.outMod->SetVolume(volume); }
+static void __cdecl setpan(int pan) { mikmod.outMod->SetPan(pan); }
+static void __cdecl eq_set(int on, char data[10], int preamp) {}
+
+static CHAR capnstupid[4096];
+
+// =====================================================================================
+In_Module mikmod =
+// =====================================================================================
+{
+ IN_VER_RET,
+ "nullsoft(in_mod.dll)", // need to set this to some form of valid buffer otherwise in_bass crashes (why it's looking at this i don't know!!)
+ 0, // hMainWindow
+ 0, // hDllInstance
+ capnstupid,
+ 1, // is_seekable
+ 1, // uses_output_plug
+ config,
+ about,
+ init,
+ quit,
+ getfileinfo,
+ infobox,
+ isourfile,
+ play,
+ pause,
+ unpause,
+ ispaused,
+ stop,
+
+ getlength,
+ getoutputtime,
+ setoutputtime,
+
+ setvolume,
+ setpan,
+
+ 0,0,0,0,0,0,0,0,0, // vis stuff
+
+ 0,0, // dsp shit
+
+ eq_set,
+
+ NULL, // setinfo
+ NULL // outmod
+};
+
+// =====================================================================================
+extern "C" __declspec(dllexport) In_Module *__cdecl winampGetInModule2()
+// input module getter. the only thing exported from here.
+// =====================================================================================
+{
+ return &mikmod;
+}
+
+
+// =====================================================================================
+static DWORD WINAPI decodeThread(void *unused)
+// =====================================================================================
+{
+ int has_flushed = 0;
+
+ while (!killDecodeThread)
+ {
+ if (seek_needed >= 0)
+ {
+ int ms = seek_needed;
+ seek_needed = -1;
+
+ if (!(config_playflag & CPLAYFLG_SEEKBYORDERS))
+ {
+ Player_SetPosTime(mp, ms);
+ decode_pos = ms * 64;
+ }
+ else Player_SetPosition(mp, ms/1000, TRUE);
+
+ mikmod.outMod->Flush(ms);
+ if (paused) mikmod.outMod->Pause(1);
+ }
+
+ if (!Player_Active(mp))
+ {
+ // check for infinite looping
+ // infinite looping is done manually (only here). we check if
+ // it was requested and if the loop is required (song ended
+ // with loop or unconditional looping is on)
+ if (mp->loopcount!=-1 || !(mp->flags&PF_LOOP || mp->state.looping<0))
+ {
+ if (!has_flushed)
+ {
+ has_flushed = 1;
+ mikmod.outMod->Write(NULL, 0); // write all samples into buffer queue
+ }
+ if (!mikmod.outMod->IsPlaying())
+ {
+ PostMessage(mikmod.hMainWindow, WM_WA_MPEG_EOF, 0, 0);
+ return 0;
+ }
+ else mikmod.outMod->CanWrite(); // make sure plug-in can do any extra processing needed
+ Sleep(20);
+ }
+ else
+ {
+ Player_Restart(mp, TRUE);
+ decode_pos = mp->state.curtime;
+ }
+ }
+ else
+ {
+ Mikmod_Update(md);
+ Sleep(8);
+ }
+ }
+
+ return 0;
+}
+
+
+// =====================================================================================
+void set_priority(void) // also used in config.c
+// =====================================================================================
+{
+ if (thread_handle != INVALID_HANDLE_VALUE)
+ SetThreadPriority(thread_handle, GetThreadPriorityConfig());
+}
+
+
+BOOL WINAPI DllMain(HANDLE h, DWORD r, void *z)
+{
+ if (r == DLL_PROCESS_ATTACH)
+ {
+ DisableThreadLibraryCalls((HMODULE)h);
+ }
+ return 1;
+} \ No newline at end of file
diff --git a/Src/Plugins/Input/in_mod/mikamp/src/api.h b/Src/Plugins/Input/in_mod/mikamp/src/api.h
new file mode 100644
index 00000000..b514a409
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/src/api.h
@@ -0,0 +1,11 @@
+#ifndef NULLSOFT_API_H
+#define NULLSOFT_API_H
+
+#include <api/service/waServiceFactory.h>
+
+#include "../Agave/Language/api_language.h"
+
+#include <api/application/api_application.h>
+#define WASABI_API_APP applicationApi
+
+#endif \ No newline at end of file
diff --git a/Src/Plugins/Input/in_mod/mikamp/src/drv_amp.c b/Src/Plugins/Input/in_mod/mikamp/src/drv_amp.c
new file mode 100644
index 00000000..b84c818b
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/src/drv_amp.c
@@ -0,0 +1,254 @@
+#include <windows.h>
+#include <malloc.h>
+#include "mikmod.h"
+#include "virtch.h"
+#include "main.h"
+#include <io.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#define BUFSIZE 28
+
+typedef struct AMP_LOCALINFO
+{
+ uint mode;
+ uint mixspeed;
+ uint channels;
+
+ SBYTE RAW_DMABUF[(BUFSIZE*1024*2) + 64]; // added 64 for mmx mixer (it's not exact :)
+
+ int block_len, bits,ismono, bytes_per_sec;
+
+} AMP_LOCALINFO;
+
+extern int decode_pos; // from main.c
+
+// =====================================================================================
+ static BOOL RAW_IsThere(void)
+// =====================================================================================
+{
+ return 1;
+}
+
+
+// =====================================================================================
+ static BOOL RAW_Init(MDRIVER *md, uint latency, void *optstr)
+// =====================================================================================
+{
+ AMP_LOCALINFO *hwdata;
+
+ hwdata = (AMP_LOCALINFO *)MikMod_calloc(md->allochandle, 1, sizeof(AMP_LOCALINFO));
+
+ md->device.vc = VC_Init();
+ if(!md->device.vc)
+ { mikmod.outMod->Close();
+ return 1;
+ }
+
+ hwdata->mode = DMODE_16BITS | DMODE_INTERP | DMODE_NOCLICK;
+ hwdata->mixspeed = 48000;
+ hwdata->channels = 2;
+
+ md->device.local = hwdata;
+
+ return 0;
+}
+
+
+// =====================================================================================
+ static void RAW_Exit(MDRIVER *md)
+// =====================================================================================
+{
+ VC_Exit(md->device.vc);
+ mikmod.outMod->Close();
+}
+
+
+// =====================================================================================
+ static void RAW_Update(MDRIVER *md)
+// =====================================================================================
+{
+ AMP_LOCALINFO *hwdata = md->device.local;
+ int l;
+ char * vis;
+ int visbits;
+
+ if ((l=mikmod.outMod->CanWrite()) > hwdata->block_len*16) l = hwdata->block_len*16;
+ if (mikmod.dsp_isactive()) l>>=1;
+
+ if (l > hwdata->block_len)
+ { int o=0;
+
+ l -= l % hwdata->block_len;
+ VC_WriteBytes(md, hwdata->RAW_DMABUF, l);
+
+ while (o < l)
+ {
+ int a = min(hwdata->block_len,l-o);
+
+ if (mikmod.dsp_isactive())
+ { int t;
+ int k = (hwdata->bits>>3)*(hwdata->ismono?1:2);
+
+ t = mikmod.dsp_dosamples((short *)(hwdata->RAW_DMABUF+o),a / k,hwdata->bits,(hwdata->ismono?1:2),hwdata->mixspeed) * k;
+ mikmod.outMod->Write(hwdata->RAW_DMABUF+o,t);
+ } else
+ mikmod.outMod->Write(hwdata->RAW_DMABUF+o,a);
+
+ vis=hwdata->RAW_DMABUF+o;
+ visbits=hwdata->bits;
+
+ if (visbits > 16)
+ {
+ uint n = 576 * 2>>hwdata->ismono;
+ const uint d = visbits >> 3;
+ WORD *const visbuf = (WORD*)alloca(n * sizeof(WORD));
+ char *ptr = vis + d - 2;
+ WORD *vp = visbuf;
+
+ for (;n;n--)
+ {
+ *vp++ = *(WORD*)ptr;
+ ptr += d;
+ }
+ vis=(char*)visbuf;
+ visbits=16;
+ }
+
+ mikmod.SAAddPCMData(vis,hwdata->ismono ? 1 : 2, visbits, decode_pos/64);
+ mikmod.VSAAddPCMData(vis,hwdata->ismono ? 1 : 2, visbits, decode_pos/64);
+
+ decode_pos += (a*1000*64) / hwdata->bytes_per_sec;
+ o+=a;
+ }
+ } else Sleep(6);
+}
+
+
+// =====================================================================================
+ static BOOL RAW_SetMode(MDRIVER *md, uint mixspeed, uint mode, uint channels, uint cpumode)
+// =====================================================================================
+{
+ AMP_LOCALINFO *hwdata = md->device.local;
+
+ // Check capabilities...
+ // [...]
+
+ // Set the new mode of play
+
+ if (mixspeed) hwdata->mixspeed = mixspeed;
+
+ if(!(mode & DMODE_DEFAULT)) hwdata->mode = mode;
+
+ switch(channels)
+ { case MD_MONO:
+ hwdata->channels = 1;
+ break;
+
+ default:
+ hwdata->channels = 2;
+ channels = MD_STEREO;
+ break;
+ }
+
+ VC_SetMode(md->device.vc, hwdata->mixspeed, hwdata->mode, channels, cpumode);
+
+ {
+ int bits = (hwdata->mode & DMODE_16BITS) ? 16: ((hwdata->mode & DMODE_24BITS) ? 24 : 8);
+ int z;
+ int a = 576*2*(bits>>3);
+
+ hwdata->bits = bits;
+ hwdata->ismono = (hwdata->channels == 1) ? 1 : 0;
+
+ if (hwdata->ismono) a/=2;
+
+ hwdata->block_len = a;
+
+ hwdata->bytes_per_sec = hwdata->mixspeed * (hwdata->bits>>3) * (hwdata->ismono ? 1 : 2);
+
+ z = mikmod.outMod->Open(hwdata->mixspeed,hwdata->channels,bits,-1,-1);
+ if (z < 0) return 1;
+
+ mikmod.SAVSAInit(z,hwdata->mixspeed);
+ mikmod.VSASetInfo(hwdata->mixspeed,hwdata->channels);
+
+ mikmod.outMod->SetVolume(-666);
+ }
+
+ return 0;
+}
+
+
+// =====================================================================================
+ static BOOL AMP_SetSoftVoices(MDRIVER *md, uint voices)
+// =====================================================================================
+{
+ return VC_SetSoftVoices(md->device.vc, voices);
+}
+
+
+// =====================================================================================
+ static void AMP_GetMode(MDRIVER *md, uint *mixspeed, uint *mode, uint *channels, uint *cpumode)
+// =====================================================================================
+{
+ VC_GetMode(md->device.vc, mixspeed, mode, channels, cpumode);
+}
+
+
+// =====================================================================================
+ MD_DEVICE drv_amp =
+// =====================================================================================
+{
+ "win32au",
+ BLAH("Nullsoft win32 output driver v0.700"),
+ 0, VC_MAXVOICES,
+
+ NULL,
+ NULL,
+ NULL,
+
+ // Sample Loading
+ VC_SampleAlloc,
+ VC_SampleGetPtr,
+ VC_SampleLoad,
+ VC_SampleUnload,
+ VC_SampleSpace,
+ VC_SampleLength,
+
+ // Detection and Initialization
+ RAW_IsThere,
+ RAW_Init,
+ RAW_Exit,
+ RAW_Update,
+ VC_Preempt,
+
+ NULL,
+ AMP_SetSoftVoices,
+
+ RAW_SetMode,
+ AMP_GetMode,
+
+ VC_SetVolume,
+ VC_GetVolume,
+
+ // Voice control and Voie information
+ VC_GetActiveVoices,
+
+ VC_VoiceSetVolume,
+ VC_VoiceGetVolume,
+ VC_VoiceSetFrequency,
+ VC_VoiceGetFrequency,
+ VC_VoiceSetPosition,
+ VC_VoiceGetPosition,
+ VC_VoiceSetSurround,
+ VC_VoiceSetResonance,
+
+ VC_VoicePlay,
+ VC_VoiceResume,
+ VC_VoiceStop,
+ VC_VoiceStopped,
+ VC_VoiceReleaseSustain,
+ VC_VoiceRealVolume,
+
+}; \ No newline at end of file
diff --git a/Src/Plugins/Input/in_mod/mikamp/src/drv_buffer.cpp b/Src/Plugins/Input/in_mod/mikamp/src/drv_buffer.cpp
new file mode 100644
index 00000000..ed75d798
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/src/drv_buffer.cpp
@@ -0,0 +1,176 @@
+#include <windows.h>
+#include <malloc.h>
+#include "mikmod.h"
+#include "virtch.h"
+#include "main.h"
+#include <io.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "drv_buffer.h"
+
+#define BUFSIZE 28
+
+
+// =====================================================================================
+static BOOL Decode_IsThere(void)
+// =====================================================================================
+{
+ return 1;
+}
+
+
+// =====================================================================================
+static BOOL Decode_Init(MDRIVER *md, uint latency, void *optstr)
+// =====================================================================================
+{
+ DecodeInfo *hwdata;
+
+ hwdata = (DecodeInfo *)MikMod_calloc(md->allochandle, 1, sizeof(DecodeInfo));
+
+ md->device.vc = VC_Init();
+ if(!md->device.vc)
+ {
+ hwdata->error = 1;
+ return 1;
+ }
+
+ hwdata->mode = DMODE_16BITS | DMODE_INTERP | DMODE_NOCLICK;
+ hwdata->mixspeed = 48000;
+ hwdata->channels = 2;
+
+ md->device.local = hwdata;
+
+ return 0;
+}
+
+
+// =====================================================================================
+static void Decode_Exit(MDRIVER *md)
+// =====================================================================================
+{
+ DecodeInfo *hwdata = (DecodeInfo *)md->device.local;
+ VC_Exit(md->device.vc);
+}
+
+
+// =====================================================================================
+static void Decode_Update(MDRIVER *md)
+// =====================================================================================
+{
+ DecodeInfo *hwdata = (DecodeInfo *)md->device.local;
+
+ hwdata->bytesWritten = VC_WriteBytes(md, (SBYTE *)hwdata->buffer, hwdata->buffersize);
+}
+
+
+// =====================================================================================
+static BOOL Decode_SetMode(MDRIVER *md, uint mixspeed, uint mode, uint channels, uint cpumode)
+// =====================================================================================
+{
+ DecodeInfo *hwdata = (DecodeInfo *)md->device.local;
+
+ // Check capabilities...
+ // [...]
+
+ // Set the new mode of play
+
+ if (mixspeed) hwdata->mixspeed = mixspeed;
+
+ if(!(mode & DMODE_DEFAULT)) hwdata->mode = mode;
+
+ switch(channels)
+ {
+ case MD_MONO:
+ hwdata->channels = 1;
+ break;
+
+ default:
+ hwdata->channels = 2;
+ channels = MD_STEREO;
+ break;
+ }
+
+ VC_SetMode(md->device.vc, hwdata->mixspeed, hwdata->mode, channels, cpumode);
+
+ int bits = (hwdata->mode & DMODE_16BITS) ? 16: ((hwdata->mode & DMODE_24BITS) ? 24 : 8);
+
+ hwdata->bits = bits;
+ hwdata->frame_size = MulDiv(hwdata->channels, bits, 8);
+
+
+ return 0;
+}
+
+
+// =====================================================================================
+static BOOL Decode_SetSoftVoices(MDRIVER *md, uint voices)
+// =====================================================================================
+{
+ return VC_SetSoftVoices(md->device.vc, voices);
+}
+
+
+// =====================================================================================
+static void Decode_GetMode(MDRIVER *md, uint *mixspeed, uint *mode, uint *channels, uint *cpumode)
+// =====================================================================================
+{
+ VC_GetMode(md->device.vc, mixspeed, mode, channels, cpumode);
+}
+
+
+// =====================================================================================
+extern "C" MD_DEVICE drv_buffer =
+// =====================================================================================
+{
+ "ExtendedRead",
+ BLAH("Nullsoft Extended Read decode driver v0.1"),
+ 0, VC_MAXVOICES,
+
+ NULL,
+ NULL,
+ NULL,
+
+ // Sample Loading
+ VC_SampleAlloc,
+ VC_SampleGetPtr,
+ VC_SampleLoad,
+ VC_SampleUnload,
+ VC_SampleSpace,
+ VC_SampleLength,
+
+ // Detection and Initialization
+ Decode_IsThere,
+ Decode_Init,
+ Decode_Exit,
+ Decode_Update,
+ VC_Preempt,
+
+ NULL,
+ Decode_SetSoftVoices,
+
+ Decode_SetMode,
+ Decode_GetMode,
+
+ VC_SetVolume,
+ VC_GetVolume,
+
+ // Voice control and Voie information
+ VC_GetActiveVoices,
+
+ VC_VoiceSetVolume,
+ VC_VoiceGetVolume,
+ VC_VoiceSetFrequency,
+ VC_VoiceGetFrequency,
+ VC_VoiceSetPosition,
+ VC_VoiceGetPosition,
+ VC_VoiceSetSurround,
+ VC_VoiceSetResonance,
+
+ VC_VoicePlay,
+ VC_VoiceResume,
+ VC_VoiceStop,
+ VC_VoiceStopped,
+ VC_VoiceReleaseSustain,
+ VC_VoiceRealVolume,
+
+}; \ No newline at end of file
diff --git a/Src/Plugins/Input/in_mod/mikamp/src/drv_buffer.h b/Src/Plugins/Input/in_mod/mikamp/src/drv_buffer.h
new file mode 100644
index 00000000..e96006c9
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/src/drv_buffer.h
@@ -0,0 +1,18 @@
+#pragma once
+#include "mikmod.h"
+struct DecodeInfo
+{
+ uint mode;
+ uint mixspeed;
+ uint channels;
+
+ void *buffer;
+ size_t buffersize;
+
+ int bits;
+ int frame_size; // cached channels*bits/8
+ int error;
+ size_t bytesWritten;
+};
+
+//extern MD_DEVICE drv_buffer;
diff --git a/Src/Plugins/Input/in_mod/mikamp/src/rf_wrapper.c b/Src/Plugins/Input/in_mod/mikamp/src/rf_wrapper.c
new file mode 100644
index 00000000..3431affd
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/src/rf_wrapper.c
@@ -0,0 +1,241 @@
+#include <windows.h>
+#include <mmio.h>
+#include <shlwapi.h>
+#include "../../winamp/wa_ipc.h"
+#include "../../winamp/in2.h"
+extern In_Module mikmod;
+//big mess here
+
+typedef struct // quick _thiscall hack
+{
+ char *(_fastcall *GetDescription)(void*,int);
+ int (_fastcall *Open)(void*,int,char *url, int *killswitch);
+ int (_fastcall *Read)(void*,int,void *buffer, int length, int *killswitch);
+ int (_fastcall *GetLength)(void*);
+ int (_fastcall *CanSeek)(void*);
+ int (_fastcall *Seek)(void*,int,int position, int *killswitch);
+ char *(_fastcall *GetHeader)(void*,int,char *name);
+ void (_fastcall *Release)(void*,int,int); // rough ~WReader() hack
+} RF_vtbl;
+
+#define RF_Open(x,a,b) (*x)->Open(x,0,a,b)
+#define RF_Read(x,a,b,c) (*x)->Read(x,0,a,b,c)
+#define RF_GetLength(x) (*x)->GetLength(x)
+#define RF_Seek(x,a,b) (*x)->Seek(x,0,a,b)
+#define RF_Release(x) (*x)->Release(x,0,0)
+
+#define READ_VER 0x100
+
+typedef struct
+{
+ int version;
+ char *description;
+
+ RF_vtbl ** (_cdecl *create)();
+
+ int (_cdecl *ismine)(char *url);
+
+} reader_source;
+
+typedef int (_cdecl *RF_entry)(HINSTANCE hIns,reader_source** s);
+
+static int initialized,got_dll;
+static HINSTANCE hRF;
+
+typedef struct
+{
+ RF_vtbl ** r;
+ UINT size,pos;
+} RFstruct;
+
+static RF_vtbl** (_cdecl *rf_create)();
+
+static int rf_init()
+{
+ wchar_t fn[MAX_PATH] = {0};
+ RF_entry rf_entry;
+ reader_source * source;
+
+ if (initialized) return got_dll;
+ initialized=1;
+
+ PathCombineW(fn, (wchar_t*)SendMessage(mikmod.hMainWindow, WM_WA_IPC, 0, IPC_GETSHAREDDLLDIRECTORYW), L"read_file.dll");
+
+ hRF=LoadLibraryW(fn);
+ if (!hRF) return 0;
+
+ rf_entry = (RF_entry)GetProcAddress(hRF,"readerSource");
+ if (!rf_entry)
+ {
+ FreeLibrary(hRF);
+ return 0;
+ }
+
+ rf_entry(hRF,&source);
+
+ if (source->version!=READ_VER)
+ {
+ FreeLibrary(hRF);
+ return 0;
+ }
+
+ rf_create=source->create;
+
+ got_dll=1;
+ return 1;
+}
+
+static void rf_quit()
+{
+ if (got_dll)
+ {
+ FreeLibrary(hRF);
+ got_dll=0;
+ }
+ initialized=0;
+}
+
+static void * _cdecl rfopen(const char * fn)
+{
+ int ks;
+ RF_vtbl ** r;
+ RFstruct * rs;
+
+
+ if (!got_dll) return 0;
+
+ r=rf_create();
+ if (!r) return 0;
+
+ ks=0;
+
+ if (RF_Open(r,(char*)fn,&ks))
+ {
+ RF_Release(r);
+ return 0;
+ }
+
+ rs=malloc(sizeof(RFstruct));
+ if (!rs)
+ {
+ RF_Release(r);
+ return 0;
+ }
+ rs->r=r;
+ rs->pos=0;
+ rs->size=RF_GetLength(r);
+
+ return rs;
+}
+
+static size_t _cdecl rfread( void *buffer, size_t size, size_t count, void *stream )
+{
+ RFstruct * rs;
+ int ks,rv;
+ UINT siz;
+ rs=stream;
+ ks=0;
+ siz=size*count;
+ if (siz>rs->size-rs->pos) siz=rs->size-rs->pos;//just to be sure
+ rv=RF_Read(rs->r,buffer,siz,&ks);
+ if (rv>0) rs->pos+=rv;
+ return rv;
+
+}
+
+static size_t _cdecl rfwrite( const void *buffer, size_t size, size_t count, void *stream ) {return -1;}
+
+static int _cdecl rfgetc( void *stream )
+{
+ RFstruct * rs;
+ int rv,ks;
+ rv=0;
+ ks=0;
+ rs=stream;
+
+ if (RF_Read(rs->r,&rv,1,&ks)>0) rs->pos++;
+ else rv=EOF;
+ return rv;
+}
+
+static int _cdecl rfputc( int c, void *stream )
+{
+ // not implemented
+ return -1;
+}
+
+static int _cdecl rfseek( void *stream, long offset, int origin )
+{
+ RFstruct * rs;
+ int ks;
+ UINT new_pos;
+
+ ks=0;
+ rs=stream;
+
+ switch(origin)
+ {
+ case SEEK_CUR:
+ new_pos=rs->pos+offset;
+ break;
+ case SEEK_END:
+ new_pos=rs->size+offset;
+ break;
+ case SEEK_SET:
+ new_pos=offset;
+ break;
+ default:
+ return -1;
+ }
+ if (new_pos>rs->size) new_pos=rs->size;
+ if (RF_Seek(rs->r,new_pos,&ks))
+ {
+ return -1;
+ }
+ rs->pos=new_pos;
+ return 0;
+}
+
+static long _cdecl rftell(void * stream)
+{
+ RFstruct * rs=stream;
+ return rs->pos;
+}
+
+static int _cdecl rfeof(void * stream)
+{
+ RFstruct * rs=stream;
+ return rs->pos==rs->size;
+}
+
+static int _cdecl rfclose(void * stream)
+{
+ RFstruct * rs=stream;
+ RF_Release(rs->r);
+ free(rs);
+ return 0;
+}
+
+static const MMSTREAM_CALLBACK callback_rf =
+{
+ rfread,
+ rfwrite,
+ rfgetc,
+ rfputc,
+ rfseek,
+ rftell,
+ rfeof,
+ rfclose
+};
+
+
+MMSTREAM *_mm_fopen_rf(const CHAR *fname)
+{
+ void * handle;
+ if (!rf_init()) return 0;
+ handle = rfopen(fname);
+ if (!handle) return _mm_fopen(fname,"rb");
+ return _mmstream_createfp_callback(handle,0,&callback_rf);
+}
+
+
diff --git a/Src/Plugins/Input/in_mod/mikamp/version.rc2 b/Src/Plugins/Input/in_mod/mikamp/version.rc2
new file mode 100644
index 00000000..62a67dcc
--- /dev/null
+++ b/Src/Plugins/Input/in_mod/mikamp/version.rc2
@@ -0,0 +1,39 @@
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+#include "../../../../Winamp/buildType.h"
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 2,94,0,0
+ PRODUCTVERSION WINAMP_PRODUCTVER
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "CompanyName", "Winamp SA"
+ VALUE "FileDescription", "Winamp Input Plug-in"
+ VALUE "FileVersion", "2,94,0,0"
+ VALUE "InternalName", "Nullsoft Module Decoder"
+ VALUE "LegalCopyright", "Copyright © 1998-2014 Winamp SA"
+ VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA"
+ VALUE "OriginalFilename", "in_mod.dll"
+ VALUE "ProductName", "Winamp"
+ VALUE "ProductVersion", STR_WINAMP_PRODUCTVER
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END