]> git.mxchange.org Git - simgear.git/blob - simgear/scene/util/StateAttributeFactory.cxx
Add noise texture and noise normal map to StateAttributeFactory
[simgear.git] / simgear / scene / util / StateAttributeFactory.cxx
1 /* -*-c++-*-
2  *
3  * Copyright (C) 2007 Tim Moore
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of the
8  * License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18  * MA 02110-1301, USA.
19  *
20  */
21 #include "StateAttributeFactory.hxx"
22
23 #include <osg/AlphaFunc>
24 #include <osg/Array>
25 #include <osg/BlendFunc>
26 #include <osg/CullFace>
27 #include <osg/Depth>
28 #include <osg/ShadeModel>
29 #include <osg/Texture2D>
30 #include <osg/Texture3D>
31 #include <osg/TexEnv>
32
33 #include <osg/Image>
34
35 #include <simgear/scene/material/Noise.hxx>
36
37 using namespace osg;
38
39 namespace simgear
40 {
41 StateAttributeFactory::StateAttributeFactory()
42 {
43     _standardAlphaFunc = new AlphaFunc;
44     _standardAlphaFunc->setFunction(osg::AlphaFunc::GREATER);
45     _standardAlphaFunc->setReferenceValue(0.01f);
46     _standardAlphaFunc->setDataVariance(Object::STATIC);
47     _smooth = new ShadeModel;
48     _smooth->setMode(ShadeModel::SMOOTH);
49     _smooth->setDataVariance(Object::STATIC);
50     _flat = new ShadeModel(ShadeModel::FLAT);
51     _flat->setDataVariance(Object::STATIC);
52     _standardBlendFunc = new BlendFunc;
53     _standardBlendFunc->setSource(BlendFunc::SRC_ALPHA);
54     _standardBlendFunc->setDestination(BlendFunc::ONE_MINUS_SRC_ALPHA);
55     _standardBlendFunc->setDataVariance(Object::STATIC);
56     _standardTexEnv = new TexEnv;
57     _standardTexEnv->setMode(TexEnv::MODULATE);
58     _standardTexEnv->setDataVariance(Object::STATIC);
59     osg::Image *dummyImage = new osg::Image;
60     dummyImage->allocateImage(1, 1, 1, GL_LUMINANCE_ALPHA,
61                               GL_UNSIGNED_BYTE);
62     unsigned char* imageBytes = dummyImage->data(0, 0);
63     imageBytes[0] = 255;
64     imageBytes[1] = 255;
65     _whiteTexture = new osg::Texture2D;
66     _whiteTexture->setImage(dummyImage);
67     _whiteTexture->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
68     _whiteTexture->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
69     _whiteTexture->setDataVariance(osg::Object::STATIC);
70     // And now the transparent texture
71     dummyImage = new osg::Image;
72     dummyImage->allocateImage(1, 1, 1, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
73     imageBytes = dummyImage->data(0, 0);
74     imageBytes[0] = 255;
75     imageBytes[1] = 0;
76     _transparentTexture = new osg::Texture2D;
77     _transparentTexture->setImage(dummyImage);
78     _transparentTexture->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
79     _transparentTexture->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
80     _transparentTexture->setDataVariance(osg::Object::STATIC);
81     _white = new Vec4Array(1);
82     (*_white)[0].set(1.0f, 1.0f, 1.0f, 1.0f);
83     _white->setDataVariance(Object::STATIC);
84     _cullFaceFront = new CullFace(CullFace::FRONT);
85     _cullFaceFront->setDataVariance(Object::STATIC);
86     _cullFaceBack = new CullFace(CullFace::BACK);
87     _cullFaceBack->setDataVariance(Object::STATIC);
88     _depthWritesDisabled = new Depth(Depth::LESS, 0.0, 1.0, false);
89     _depthWritesDisabled->setDataVariance(Object::STATIC);
90 }
91
92 osg::Image* make3DNoiseImage(int texSize)
93 {
94     osg::Image* image = new osg::Image;
95     image->setImage(texSize, texSize, texSize,
96                     4, GL_RGBA, GL_UNSIGNED_BYTE,
97                     new unsigned char[4 * texSize * texSize * texSize],
98                     osg::Image::USE_NEW_DELETE);
99
100     const int startFrequency = 4;
101     const int numOctaves = 4;
102
103     int f, i, j, k, inc;
104     double ni[3];
105     double inci, incj, inck;
106     int frequency = startFrequency;
107     GLubyte *ptr;
108     double amp = 0.5;
109
110     osg::notify(osg::WARN) << "creating 3D noise texture... ";
111
112     for (f = 0, inc = 0; f < numOctaves; ++f, frequency *= 2, ++inc, amp *= 0.5)
113     {
114         SetNoiseFrequency(frequency);
115         ptr = image->data();
116         ni[0] = ni[1] = ni[2] = 0;
117
118         inci = 1.0 / (texSize / frequency);
119         for (i = 0; i < texSize; ++i, ni[0] += inci)
120         {
121             incj = 1.0 / (texSize / frequency);
122             for (j = 0; j < texSize; ++j, ni[1] += incj)
123             {
124                 inck = 1.0 / (texSize / frequency);
125                 for (k = 0; k < texSize; ++k, ni[2] += inck, ptr += 4)
126                 {
127                     *(ptr+inc) = (GLubyte) (((noise3(ni) + 1.0) * amp) * 128.0);
128                 }
129             }
130         }
131     }
132
133     osg::notify(osg::WARN) << "DONE" << std::endl;
134     return image;
135 }
136
137 osg::Texture3D* StateAttributeFactory::getNoiseTexture(int size)
138 {
139     NoiseMap::iterator itr = _noises.find(size);
140     if (itr != _noises.end())
141         return itr->second.get();
142     Texture3D* noiseTexture = new osg::Texture3D;
143     noiseTexture->setFilter(osg::Texture3D::MIN_FILTER, osg::Texture3D::LINEAR);
144     noiseTexture->setFilter(osg::Texture3D::MAG_FILTER, osg::Texture3D::LINEAR);
145     noiseTexture->setWrap(osg::Texture3D::WRAP_S, osg::Texture3D::REPEAT);
146     noiseTexture->setWrap(osg::Texture3D::WRAP_T, osg::Texture3D::REPEAT);
147     noiseTexture->setWrap(osg::Texture3D::WRAP_R, osg::Texture3D::REPEAT);
148     noiseTexture->setImage( make3DNoiseImage(size) );
149     _noises.insert(std::make_pair(size, noiseTexture));
150     return noiseTexture;
151 }
152
153 static osg::Image* make2DNoiseNormal();
154 osg::Texture2D* StateAttributeFactory::getNoiseNormalMap()
155 {
156     if (_noiseNormalTexture.valid())
157         return _noiseNormalTexture.get();
158
159     _noiseNormalTexture = new osg::Texture2D;
160     _noiseNormalTexture->setFilter(osg::Texture3D::MIN_FILTER, osg::Texture3D::LINEAR);
161     _noiseNormalTexture->setFilter(osg::Texture3D::MAG_FILTER, osg::Texture3D::LINEAR);
162     _noiseNormalTexture->setWrap(osg::Texture3D::WRAP_S, osg::Texture3D::REPEAT);
163     _noiseNormalTexture->setWrap(osg::Texture3D::WRAP_T, osg::Texture3D::REPEAT);
164     _noiseNormalTexture->setImage( make2DNoiseNormal() );
165     return _noiseNormalTexture;
166 }
167
168 // anchor the destructor into this file, to avoid ref_ptr warnings
169 StateAttributeFactory::~StateAttributeFactory()
170 {
171   
172 }
173   
174 /*  GIMP header image file format (RGB):  */
175
176 static unsigned int noiseNormalWidth = 64;
177 static unsigned int noiseNormalHeight = 64;
178
179 /*  Call this macro repeatedly.  After each use, the pixel data can be extracted  */
180
181 #define NOISE_NORMAL_PIXEL(data,pixel) {\
182 pixel[0] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4)); \
183 pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2)); \
184 pixel[2] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); \
185 data += 4; \
186 }
187 static char *noiseNormalData =
188         "@Y4`CI$`BXX`>XP`>HH_AH<`B8H`?X\\`AHT`B8\\`B8\\`@H`^>I$\\>Y(^@(T_AHD`"
189         "?)$]B),`DI0`BI0`?90`>),^@HX^C8@^AHP`A8<`B(<`BHD`AHD\\@HD]A(L_A(D`"
190         "DXD`@8L`=HX\\?9(_CI(`D8X`AY,`?9H`?9,\\@9(_A(X_A(H^@H@\\@8L\\?X`]?)$]"
191         "@I<`AY,`@I,`>9<]?Y8_CY$`D(T`@HX^@HH[B(``BY,`A90]@9<^A9P`AYT`AI<`"
192         ">XPZAHD^A8H`?(P_?(X`AXT`B(X`@)(`A9$`B),`BY,`AY4`@)<`@9@`A)4`AY$`"
193         ">H\\\\A(X_B8P_@HP]>8`\\>I(^A(``D(T`@(T`@(H]A8L]AXT_@XT^@H`_AY,`B9,`"
194         "BXH`@(H]>XT[@9(`BI(`BX\\`@X\\^?I,`@9(_A)(`A8\\`A(L_@XH^@XT^@Y$`@9(_"
195         "BI8`B)(`A9,`@I@`AY@`BY,`A8T^>8HX@(X]A9$`B),`A),^@),]@),_@8\\]?XDZ"
196         ">XDX@H@Z@XL\\?X`^@9,`B),`AY(_?Y4^AI@^B98`B90`A9$`@)(`?Y0`@90`@9(]"
197         "?9(_A(X_AXH]@(H[>8`\\?)0`AY,`D(``?Y0`@9(_AY,`B)<`@I,`@),_A)4`AI0`"
198         "@(P^?XL]@(P\\AI$`B),`A(``@HX^@X\\`AY$`AY,`AI(`A(``@HX`@X\\`A(``A8\\`"
199         "CY(`@X\\_?XT[AX\\_C)(`AI0`?I,`?9(`@Y0`AI0`B)0`AY,`@Y$_?XT\\?H@[?X0["
200         "A(`_A8`_A8`_A)4`AI<`A98`A)8^?Y4\\AYD^AY0^@XT^?X@`?8@_?HL_?H\\]@)$\\"
201         "@)(`AI(`B9$`A(``?I,`?I4`A)(`BXX`@IH`A9@`C)L`BYT`A)<`?Y(\\@)$^@HX]"
202         ">Y,`@H`_BHT`BY$`A9,`?Y$_@HX`B(L`AHP`@XT`@HX`?X\\`?X\\`@X\\`A8\\`B(X`"
203         "BXX`>HPZ>8LYB8L]CHX`@I,`?I4`A94`AY4`B),`BI(`B9,`A9(`@(T_@(L`A8P`"
204         "C9@`AY4`AI4`B98`B9@`A)<_@)8]@Y8^AY(]@XX]@8@^?X4_@84`@XH`@X\\`A)(`"
205         "?X`^A9$`B)(`A9$`?Y(^?9(^@Y$_AX\\_A9D^A9<_BY@`BYH`@Y0_@)$\\A9(^B(`^"
206         ">9@`@Y0`CH``C9$`A)(`?H`^@8T_AXH_@(4\\?8<Z?8H\\?8X\\?X`^@H`_A8\\`B8\\`"
207         "@XT`>9$]?90_D)0`DX``@HX]>XT[@XT`BI(`AXT^B(L^AHT`@8X`?(X`?8\\`@Y,`"
208         "CI8`A)4`@90^B90`B90`?Y4^?Y0`B)0`B(X`@HP_@(L`@HL`AHL`AXP`AHT`@X\\_"
209         "?H\\]A(``AI(`@Y$_@)$\\@90^A9<_B)<`BID`B),`B),`AY(`@(X\\@(X\\AY(_C),`"
210         "=),_?H``AXT_BHX_A8`_@9(`A)(`B(\\`A(X`@HX`@8\\^@9(_@I,`@Y$_A(`_A8`_"
211         "@Y0`@)<`@YH`BY@`BY(`@HT\\@(P[A8\\`BI(`AXT^AXH]@XH^?HL]>(T\\>X`_@9,`"
212         "B9$`?9(^?9(^BY,`BI(`?)$^>X`_B(\\`B(X`@HX`?)$^?Y0`AI0`AI$`A(\\^@8\\]"
213         "@Y$_A9,`AI,_A),^@Y4]AI@`B)H`B9L`B94`A8`_AHX_@HX`?(T[?H\\]AI(`BI(`"
214         "=8\\_>H\\^@8T]AXT_B(X_AY(`A9,`@Y0`B)4`AI,`A9,`AY8`AY8`A90_A),^A),^"
215         "AY4`B98`A98`?Y<]?Y(ZA(\\\\AY0`A9H`@90`@Y$_A(X_@XT`@(T_?X\\`@)$_A)(`"
216         "B(X`>X`\\?I,_C)(`BH``>8X]>8H_AXD`B(X`?X`^>)0[>YD]@YD^B)<^B98^AI@`"
217         "A90_AI4`AI4`AI4^B)<^B)H`AIH^@Y<[@HX^?XD\\@8L^@8X`?H``@)(`AI0`B90`"
218         "?9,`?Y,`@X``AX\\`BX\\`B(X_@8\\]>H\\[?H``?8\\]@8\\]A90]AY8_AY8_@Y8^A)<`"
219         "B(`^CH``B)4_?)H^>YD]AI4^AY8`?9L`=Y0]?),_@9(`A(``A(``A9$`AY(`BI$_"
220         "A(L_B8P`BHL`B(L`@XT`@9$`@)$`?X\\`AXP`A(H^AHP^A(`_@),[@9D]AIT`B)L]"
221         "@)P`?YH`?Y8`A(``C8T`DHT`BHT`?XH_?XDZ@(X]@H`_@HX^AHX_B(X`AHX_@(P\\"
222         "@(TYAI<`AYP`@Y@`@Y$`A(``@X\\_?XL[@9(_@Y$_A9$`AI(`AY,`A9,`@90`?Y(^"
223         "A9$`A(X_@XL\\A(H\\AHP^AX\\`@HX^?HP[>X<`@XD`D(P`B)(`>Y@`B9@`CY8`>9H["
224         "?H`^A(``AHX_A(L_@8L^@(T_@8X`@(T`A9$`A8`_BI(`B94`A98`A98`AY,`AX\\_"
225         "?X`]?I,_@),_@HX^B(H]AX@^?H@[=H@ZA8\\`A)(`@9(`@H`_A(X_AX\\`A(X_@8T]"
226         "@8P[@H`^@),_?H`^@(X]A8\\`A9$`@X``B)8`B)0`AY,`AY(`A9$`A9$`@I,`@Y0`"
227         "@8\\^@8T]@(H[@XL\\A8T^@XT^@8T]?HP[>(T\\@8X`C8X`A8\\`>(`\\@XT^C(P`>X`\\"
228         "?Y@`@)<`@Y0`@H`^@8T]@HX^@8\\^@8\\^A)8\\A9(\\B90`BI4`A9$`A8\\`B(H`AH0`"
229         "@(@X@HX]A)(`AH``B8\\`B(X`@9$`>I4`BI8`AY4`@9(`?X`^@X\\_A8\\`A(``@(X]"
230         "BI(`@X\\_?8X\\?8X\\@HX`A(X`@X\\`@8X`A8\\`A8\\`B(``AX\\`A8\\`AH``AY,`B94`"
231         "?H`^?X`^@HX^A8\\`AY$`AH``A(``@H`_?),\\@)4`C)(`AX\\`>(T\\@HD]CHD`@HT`"
232         "@ID`@9@`@)8_@I,^A)(`A9,`@90`?I,_A90_A(\\^AHX^A8T^?XD^?X@`AH@`AX4`"
233         "@H@Y@(P[@)$_A(``B8\\`BH``AI,`@9<`BI0`A9,`?H`^?H\\]@H`_A(``A(``?X`^"
234         "C9,`A8\\`@8X`@X``AY$`A8\\`@8T_?HX_@8DZ@XL\\AHX_AX\\`AHX_AHX_AX\\`AY$`"
235         ">X`]?H`^@9(`AI0`AY,`AI(`A9$`A)(`@),_?I4`BI(`BXX`?8\\]A(X_D(\\`B)(`"
236         "AY,`@9(_?I$]@9(_B)4`B)<`?Y8_=I8\\AHT`A(D`A(H^@8@\\?(@Z?HL]A8\\`B8\\`"
237         "B94`@Y0`?I,`@)$_AX\\`BHT`AXX`@X``B(``@8\\^?(X\\?H`^A)(`AI(`A(``@H`_"
238         "B(X`@8L^?XP^A(``AY$`A8\\`@X\\`@9$`A8T^AX\\`B(``AX\\`A8T^A(P]A(P]A8T^"
239         ">X`]>X`]?Y$_@Y0`A)(`@(X]?XT\\@(X]@8L`>8T_A8P`BXL_?X`]@Y0_C)0`AI4^"
240         "BXX`@HP]?8X\\@Y$`C)0`BI4`@)4`=I8^@XP`@XH`AXP`A8\\`@(X]@9(_AY8`B90_"
241         "C9L`@I<`?),_?Y$_B(``C(X`B8P_@XT^AHP^@8T]?H\\]@)(`AI0`AY,`A9$`@Y$`"
242         "@XT`@(P^?HL]@8T_@HP]@HP]@H`_@I0`B9,`B)(`AI(`A9$`@X\\_A(X_B(``BI(`"
243         "@Y8`@I4`@I4`A98`@Y0`@8\\]@(X\\@8\\]@XH`=XT^@(P^BXL_@)$^?Y<]AY0^@Y(Y"
244         "B(L`@8L`?(P]A(X`C(T`C(X`@X\\_?),_?Y$_@)$_AY4`B)8`@Y0_@Y0_B)4`BI$_"
245         "AX\\`?8X\\=HTY?(X\\A(X_AXT_A(P]@(P\\B8P_@XT^@)$_@Y0`AI0`AH``A(X_@X\\_"
246         "A)$`@)$_?H\\]?XT\\@HP]@XX]@Y$_@90`B)0`AI0`A9,`@I,`A)(`AY,`B90`BY8`"
247         "AY@`@Y0`@Y0`AI<`A98`@I,`A)(`AI0`A9,`=I<`@I4`CX\\`A)(`?I4`AI(`AX\\_"
248         "@H<`?(D_>XL^@(H_B84_BX,\\A88\\@(T_>YD[?I@[A)H`AID`@90^@Y$_B(``BHP^"
249         "BHP_@HP]?8\\]@9,`B)0`B9$`@X\\_?X`^BXT`AHX_@Y$`@Y0`A)(`@XT^@8L\\@8T]"
250         "@Y0`@9,`@)(`@Y$`AY(`BI4`AY4`@I4_AY4`A)4`@Y0`@I4`@Y0`A9,`A9$`A8`_"
251         "@H`^?XT[?HPZ@)$^@I,`@9(_@9(_A)4`@YL_=)\\_@IL`D9,`A9$`?I,`B8``C8P`"
252         ">Y$`@8X`AHX_BHX_B(X_@X\\^@8\\^?XT\\=X\\]@(P^BHD`B8H`@8T]?8\\]@8\\^AHP]"
253         "@)(`@HP]@HP]@9,`B)8`C)(`A9$`=Y4[AY(_B9$_AY(_A90_@)<`?)@_?98^?90]"
254         "@HX`@(X]?X`]A90_C)D`C9@`AY8`?Y(^BXT_B8\\`AI$`@H`^@)$^@9(_@Y$_@H`_"
255         "A(\\`@HT`@8X`@H\\`@8T_?XDZA8L]BH``>Y$`?)$`@)$^A9(^B),^AY0^A),\\@)$\\"
256         "@I<`@I0`@Y$_AI$^BY,`BI4`A98`@)4`=X\\]@(P^B(D_AXH_@8T]?Y$_A9$`C)(`"
257         "A98`B(``@8T]>8X[?8X[B(X_BI(`@9@`AI0`AY,`AY$`A9$`@I,`@I0`AI<`BY<`"
258         "AY,`A9,`@I,`A9,`AY(_AY(`@Y$_?I$]AHP`@XH^@8T_@X\\`A(``A(X`B(X`C8``"
259         "?HL]@(T_@HX`@HX`@8T]@XT^A8\\`AH``@9$`A)$`AI(`B90`B98`B)<`@Y8`@)4`"
260         "@Y0`?),^>I,[@90\\C98`D)D`B)D`?9D`?)0`@I(`BH``BH``A9$`@I,`AI(`BY$`"
261         "A(``BH``A9$`>I,]>X`\\AXT^BX\\`@I,`@I(`A9$`AHT`@XH^?H@[?H@[A(L_BHT`"
262         "@HX`@H\\`@Y$`@X\\^A8T]A(P\\@HX^@)$_B9(`A8X`@XX`AY$`AHT`@X8[A80[C8H`"
263         "?H\\]A)(`AI(`A8\\`A8\\`AY,`A9,`?X`]@XT`A(X`B(``B9$`AY(`A)(`@9,`?Y0`"
264         "@XT`>X`]>),]@90`C),`CY$`@X\\^=X`Z>I(^@9,`B9,`BI0`AY,`A)(`A(X_AHP^"
265         "@HH[BXX`AI0`>I4_?90_BH``BXT_@8P[?X\\`@X\\`AHT`A(L_@(H]?8D[?H@Y@8DZ"
266         "?HD^?XP^@8\\^@X\\_AHX_AHP^@HX`?X\\`@8H`@(H_@8P`@X\\`A(X_A(P]B8T^CI(`"
267         "?9(^@I,`AI(`B(``B9$`B)0`A)4`@),_@(P^@8T_@XT^A8T^@XL\\@8L^@8P`@8X`"
268         "AHL`@X``@)4`A9,`B8\\`B(H]@(<[>(@Y=XXY?8`\\A)(`AI0`A9,`A(``A(X_A8T^"
269         "B8\\`C(``@H`^=8`Z>I$\\BY$`CH``A(X_@HX^A(X_B8\\`BI(`AY4`A9@`A)<`A)4`"
270         "@9$`@9$`A)(`AH``BH``B8\\`@X\\`?8\\`?X8Z@8L\\@HX^@(X\\@8`[@Y0_AI@`A9<_"
271         "?I$]?8X[@8T\\A8`_AI$`A9$`A)(`@I4`?Y$`@)(`@H\\`@XT^@XL\\A(H^AXH`B8P`"
272         "?X@`@XT`AH``A8\\`@HP]@XH^A(L_AXT`@90`@I4`@I4`@I,`@Y$_@X\\_A(``A9$`"
273         "BY$`BX\\`@8T\\=8`Z?),^BY,`BY$`@8\\^@8T]A(P]AXH]AHX^A9,`A9@`@YD`@YD`"
274         "A)8`@I0`@)$^@X\\^B(``B(``@X``?H``B(``BI4`B98`A),^@I,^AID`A)H`@)8]"
275         "A)4`@)$^@8\\]A9$`A(``@HP]@HP]AH``?Y,`?Y0`@9$`@X\\_A8T^AHP^BHL`BXP`"
276         ">(HZ@HP]BX\\`B(``?Y(\\?9(^AY(`D9$`AY@`AID`@Y@`@Y8`@Y$_@H`_@Y$`@I,`"
277         "B9$`BHX_A(\\^?I4`@I<`B9,`A8\\`>(\\[?XP`@8L`AHD^AHD^@XL\\@8T]@HX]@X\\^"
278         "?Y8`?I,_?I$]@H\\[AX\\_B(``@Y$`?)$`A9$`AI(`AI(`A9$`B)0`BYD`BYD`B)8`"
279         "AI0`AI0`@Y0`@I,`@H\\`@HP_A8L_BHL`@8X`@8X`@8X`@X\\_A(`_A8`_AX\\`AHX_"
280         ">),]AI,_DY0`CI<`?IH]>9H]A90]DHX^A),^@I4_@98`@98`@I,`@Y$`@9(`@9,`"
281         "BI4`B8\\`A(\\^?I4`@I<`AY$`@H`_=I,]?(T`@HT`BHP`BXP`B8H`AXH_B(L`BXP`"
282         "?I4`?I4^@)8_A90_B9$_A8`_?H\\]>(X]B)D`AI0`@X\\_A8\\`AX\\`AXT`A(H^A(<\\"
283         "@(H[@Y$`@9,`?H``?HX_A(X`C(T`CXH`@HD`@HD_@HP_@X\\_A9,`@Y0`@9(_?X`]"
284         ">)4^@Y8`C)<`CI8`AY0`@)(`?H``@8\\^A8L]A(L_@(L`?HL`?XP`@8T]AX\\]BI$["
285         "AY4`A9$`A8`_AX\\`A(P]@8@\\@8L^AI(`@)<`@I4_AI4\\AI@]@IH^@)8_A8\\`C(H`"
286         "AH<`AXD`AX\\`AY8`A9@`@90`@8X`A(H`C(X`AHX_@8X`@X\\`AXH_A(4]?X8\\>X@\\"
287         "A(X`A(L`A8L_@8L^?(T[?Y0`A9@`@I,^@X`\\A)<`@IH`@)8`A)$`B),`B)4_A9<]"
288         "?Y8`AI4`BY0_AY(_?X\\`>X\\`@(``AY(`B9$`AH``@XX`@8X`@H\\`A9$`BI(`C90`"
289         "@I,`@8\\^@8T]@X\\_@X\\_?XT\\?XP^@9$`@Y8`B)<`BY@`BIP`A)H`?Y0`@X\\`B8P`"
290         "?(<\\?XDZA(\\^A90]@I4]?I0]@I,`AY,`AHX^@8\\]?Y(^@Y0`BI0`C9,`BI0`AY@`"
291         "@X\\`@(H]A(L_A8\\`@9(`@I4`A)4`A)(`BY8`A98`?90_>H\\\\?XLZAHX\\AY(]AI4^"
292         "@H\\`AI$`B8`^@HT\\>8L[=XP[@8\\^BY$`AY,`A9$`@8X`?HX`@H\\`A9$`AY(`B9$_"
293         "@I(`@8X`@8X`A)$`@Y0`@)$_?H`^?)$^@H\\[A8`]AY(`A9,`?I$]>XXZ?HHY@XLY"
294         "?)0Z@I4]B)<`AY8`@I,^?9,\\@I4_B)D`B)D`A9@`@I@`A9@`B9@`B94`AI0`@Y8`"
295         "@Y0`@8T]A(X_B94`AI0`@9(`@H`_A(X_A8T^@(P[?8XY@)$\\B90_C)0`BI4`B94`"
296         "@HD_AXT_BX\\`A(`_>H\\^>8X]@HX^C8\\_@X``@8X`?8T^?8T^@8\\^@X\\_A(\\^A8T]"
297         "@HT`@8T_@HX`A)$`A9,`@I,`@9,`@I4`BI,^B9$`A8\\`@HX`?X\\`@)$^AI4^BI<_"
298         "?IL\\@YD^B98`AY$`@8T]?(TZ@)$\\AI4^@I4`@I4`@I4`@Y0`A)(`@X\\^@H`^@H`^"
299         "@)(`@H`_AY,`B)0`@Y$`@8\\^A(``AHT`AHT`@HP_A8`_BY8`C9@`AY(`@8L^?XD^"
300         "@HD_BHT`C9$`B),`@)(`?Y$`AH``CH``@H\\`@8X`@8\\^@H`_A)(`AI(`A(``@XT^"
301         "@(<[@HD]@HP_@X\\_@X\\_@Y$_A9,`B)8`CI4`B),`@X\\_@8X`@X``B)8`C)L`BYT`"
302         "@9L^A9@`B)(`B(T`A8P`A(X`AY$`B90`?X\\`@X``A9$`@X\\`@(P^?XL]@8L\\@HP]"
303         "?(X\\A)(`BI4`A9$`?HPZ?X`^AI$`AXX`A(T`A(L`A8P`AX\\`A(X_?XL]?8@_?XH`"
304         "@HT`B(X`BX\\`AX\\`@8X`?HX`A8\\`C8\\`@HT`@HX`A(``AI(`AY,`AY,`A(``@HX`"
305         "B(X_B(``AY(`AI$`@X\\^@HX]@X\\^AY(_AY(_@Y$_?H\\]?H\\]A(``B),`B)4_@Y4["
306         "?Y0`@Y$`@XT`@XH`@8H`A(X`AXX`AXT_@HT`B(\\`BX``AXX`@HX`@(T_@XT`AHP`"
307         "@H\\`B9,`C94`A(\\\\>HLX?8\\]@9$`?HD`?8@]@HD_A8L_A8P`@(T_?8T`@(``AI,`"
308         "@9,`A8`_B(P[AHD\\?HD^?HL`@8P`AXT`@XH`A8P`A8`_AI$^A9(^A(`_@8X`?XP`"
309         "BY8`BY@`BI<`AY8`A90_@Y(]A)$]A8`]A9,`@Y8`?Y8`@I4`B),`BY,`B),`@9(]"
310         ">HP\\?8H\\?HH\\>X@Z>HH[?8H\\?XD\\@H4Z?HH\\A(L_B(L`AHX_A9,`A9<`B9<`BI4`"
311         "A8\\`B(\\`BY$`A8`]?H\\Z?I,`?Y$`>(@[@9,[B90`CI0`BY,`@I,`?),_?9(^@)$^"
312         "@ID`AY,`BHX]B(H]@XH`?XP`@8P`A8P`A(D`AHP`AX\\_AX\\]A(\\\\@8T\\?XP^?HL`"
313         "A),Z@Y4[@I4]@Y8^A)<_AI<`AY8`AY0`@I,`@)<`?Y@`@)8]AI$\\BI$_AY(`@9(`"
314         "?8\\`@9$`@Y0`@)4`@)<`@Y@`B94`BY$`A9,`B9$`BHX_AHX^@90^@)<`@),]@(TW"
315         "@H<^@80YA8DZAI$^A98`A)L`@9<`>X\\`@I<VBI@^CI4`AY(`@90`@)D`A)P`AIH^"
316         "A)<_?9@`>)0`>X``AH\\`B(\\`@90^?9X_A9@`A)4`@9(`@8\\^@HX`@XT`@XT`@HP_"
317         "C(`_B(H\\B(@\\B8P`AXX`@HX`@XT`B(``BI(`?X`^>8\\^?8T`AXH`D(T`C8``@8T]"
318         "?(``?I0`?Y8`@90`A90]BI4`B98^@Y4[@9H`@I4`@XX]AHD\\B(H]AXT`@8X`>HX`"
319         "?8X\\@XL\\BXL^C(X`A(\\^?(X\\?)$`A)8`D)0`B98`@90`?H\\]@HH[AXH]AX\\`A)(`"
320         "A9(^?9(_>(X]?8H^B8H`C(D^B(P[AI,]AI,_AY0`AY8`A9,`@9(_?Y(^@)(`@9,`"
321         "B9$`B(P]AX@^B(L`A8P`@(P^@8L^AXT_BXT`?XD\\>(T\\>H``?8T^@8@\\A(<Z@X4X"
322         "@X8YA(P]@X\\^@Y$_@Y0_AYH`@YP`?IP`A)L`A9@`AI0`AY$`B(``A(``?HX_>8T_"
323         "@9(`B(``CH``D9,`AY(`?8\\]>H\\^@)(`BY(`A9$`?X`^@(X]A8P`B8P_AHX_A(`_"
324         "A9$`?I,`>9(\\>X`\\B(``C(P_B(H\\AHP]A8PXB)$\\B90_AY8`@90^?),\\?98^?IH`"
325         "AY,`A8\\`AHP`AXT`@HP`@(H]@HD]B8P`D8X`AXH_@X``@IH`>Y<`>H\\\\A(H[D(<]"
326         "A(`_@Y0`@I4`@I,`A9$`BI(`AY(`@8\\]?9(^@),_@I4`@Y4`A)4`@I(`@(``?8\\_"
327         "A)4`B)(`CI(`CY,`AY(`?H\\]>XT]?H``AHP^@(H[?HL]@H\\`B8``BH``BH``BI(`"
328         "@)(`?94`>)@^?)T`AI``AYH`@I,`@9,`A8L\\AX\\_AY(`AI(`@Y$_?Y(^@)4`A)D`"
329         "@Y4`A9(`AH``A8\\`@HX`@8L^A(L_BHT`A8P`A8@]B8P`AI,`>90`=Y(]A)$]DHX`"
330         "AYD`A)H`@I<`@9(`AX\\`BHT`BHL`AHD\\?HHY?HPZ?H`^?Y0`?I,`?Y$`@8X`@X\\`"
331         "AI0`A9$`B(``AX\\_A(\\^@(X]?X`^@9,`A(L_?XD\\?XP^@X``AY$`AX\\`B(X_BY(`"
332         "@HP`@)$_?90]?IH]@Y\\`A)T`@)D`@9D`AY$`AY$`A8\\`A(X`@XT`A(X`AH``B)(`"
333         "?I,`@9$`A9$`A9$`@Y$`@H`_AH``C)(`>X`_@8L^B8@_AHD^?8LZ?)$]AI<`CI<`"
334         "D(X]BHX]@XT^@8T_@X\\`AI(`AI,`@I0`B8\\`A8\\`@Y$`@9,`?H`^?8X\\@8L^AHT`"
335         "AI(`A9$`A(`_A8`]A8`_A(`_@9,`@98`A8\\`@X\\`A(``A)$`@8X`?HHZ@XDZBHP\\"
336         "BXH`BHP_A8L\\@HTZ@Y([?X`[?H\\\\@9(`AY0`A8``@8P`@(H_@HD_A(H^AXH_AXH_"
337         ">H\\^?H\\]@X\\^A)(`@Y0`A)4`B)8`BY8`?9@`@I,`B(X`B8H`A(H\\AI(`C)L`B9H`"
338         "C(``A(X_?XP^?HL_@(L`AHT`AX\\`A8`_C)(`B(``A(``@9(`?X`^?HP[@8L\\AX\\`"
339         "BI(`B),`AY8`B98`BI4`B)0`@Y4`?94`A)(`AI0`B94`A)4`?H`^?H\\\\AX\\_D)$`"
340         "A8\\`B8\\`B8P_AXH]A(P]@(LZ?HHY@XX]A)$`@H\\`@(T_@8T_@HX^@XT^@XT^@HP]"
341         "?H\\]@8\\]A)$]A90]A)<_@YD`A9@`A98`A)<`?9(^?8\\]@8\\^A8L]B8P_B(``@X`\\"
342         "A)0`?I(`>8\\`?(T`@HP`B8H`C(D]C(@XA8\\`@HX^@8\\^@9(`@9(`?H\\]@8\\^A)(`"
343         "CY$`BY,`AY8`B)<`B98`B)0`?Y0`=Y0^@),[AI<`BI@`@Y8`?90_@98`BY8`E)4`"
344         "<Y,\\?),_@I(`AI$`AY0`@I,`@9(_B)<`@8\\^@H`_A)(`A)4`A98`A)<`@Y8`@Y8`"
345         "@I,`AI(`AY0`AY8_A)H_@YL`@IH`@I4_C94`>X`\\=)0]?9@`AY,`BHP_B8D\\A8DZ"
346         "B(D`@HD`?8D`?HT`A)$`B9,`B90`B)4]@9(`?X`^@)$_A)4`@Y4`?Y$_?H`^?Y0`"
347         "D(``BI(`A),^@Y(]A9(^@Y$_>Y(^<Y,\\?Y4ZB)H`BID`@90^>Y0^?Y8`B90`CH\\_"
348         "@X`\\@Y0_@I<`@I<`A9@`A)H`?YL`>9P\\>I$\\AHX^B8`^@9<`@)4`AHX^@XT^?)0`"
349         "?XT\\A8T^BXX`B8\\`A(``@X\\_AXT_C(P`?Y4^?)0Z?I@[@I\\`AI``@YD^@Y(]@XX]"
350         "AXH]@HP]@)(`@I@`AIH_B98^B),`B)(`?8X`@8@^B(<^BH``A)<`>I@^?98\\@Y<\\"
351         "BY(`B(L`AX8]BX@_BXP`AXX`@9,`?Y<`AI@^BID`AY,`@(P\\?HP[A(``B8\\`B8D\\"
352         "BY,`B9,`A9$`@HX`A(X`AY$`A)4`@9<`>Y8`AI0`AY(`?9(^?Y(^B8\\`B8\\`?H``"
353         "A9,`B9$`C(\\`B(X`@HX]@(X\\A(P\\B(P]B)(`A(``@I,`A9@`A9@`@),]?(X\\?8T^"
354         "C(``A9$`@9,`@)4`@Y0_A8`]A8T^A8P`>XT]?8D[@8@\\A(L_@8T_?XP^@8X`AY$`"
355         "A(X_A(P]AXH]B(H]AXH_@HD]?HL]?(X^?Y(\\@9(]@(X\\?(HY>XL\\@H`_A8\\`B8T^"
356         "B(L`@X@_?X8^@((\\A80_B8@`B8P`AHT`>I<`A)8`A9,`?8`\\?X`]BH``BXX`?XL]"
357         "@Y$_AI$`B8\\`B(``A9$`A)(`A9$`B9$`AH@`A8<`A(H^AHX_@X\\_?H\\]>H`_?)0`"
358         "C90`AI(`@)(`@)(`@Y$`A8T^A(P]A8P`@Y$_?X`^?H\\]@8T_A8@_A80_B(@`BX``"
359         "@(X\\@Y$_A9$`A(X_A(P]A(P]AHT`AHT`?Y$_?X`^?XP^?8T^?H``@)(`A9,`B),`"
360         "?XD^?(<\\?(8[@88]AX@`C(@`B(D_A(<\\>X`_@(``@Y$`@H`^@Y$`AH``@HX`?8H\\"
361         "@8XZ@XX[AI$^B90`B94`B)8`AY4`AI0`?H<`@8@`AHD`B(L`AHX_@8\\^?I4`?YH`"
362         "B94]@Y$_?8\\`?XX`A(\\`AXX`B(``B8``BY,`@I0`?94`@)(`B(L`BH<^BHL`B)(`"
363         "@),[A)<`@Y8`@)$^@8T]AX\\`CH\\`CXX`@I(`@HT`@XT`A(``@Y0`@9,`A9,`B90`"
364         "@9,`?I,`@)(`AI0`C)0`C8``AXT_@(H[@XH^@(P^@X\\_AY(`AI(`?Y$_>Y(^?I,`"
365         "AI,_AI,_AI(`B),`B90`AI(`@)$_?8\\]?(``@9$`AY$`BH``B(``@X\\^@90`@9@`"
366         "AI,[@8\\]?(T`?HT`@XX`AXX`AH``A9$`BXX`@9(`>Y,_?I4`AI,_BI$]AY,[@Y<\\"
367         "@I@_@YD`@)8_?8`\\?XT\\A8T^B8H`AX8]@8P`@8@^@H<^AXT`AH``@H`^A(`_BI(`"
368         "?Y8`?94`?I4`@Y8`B98`B90`A9$`@)$^BHL`@HP]@HX]BY$`AY0`>Y0^>I<`@YL`"
369         "BI8`AI0`@Y$_@HX^A8T^A8P`?XP^>(T\\>Y(^@)(`A9,`AY(`AX\\_A(\\\\@I$\\@I,^"
370         "AY0`@)$_?8\\`?X\\`A(``@X\\^@(X\\?(X\\A(H^@(P\\?)$]?I4^A9D^B9D^B)L]AILZ"
371         "@98`@)4`?Y0`@)(`A)(`AY$`AHT`@XD]?8<\\?X0[@X8[B(L^B(``A8`_A8`_BH``"
372         "?HX_>XT[?(\\[@)$^AI$^AI$`A(`_@I,`C(X`@H`^@9(_BI$_BI,^?98^>YD_A9@`"
373         "B)0`@Y$_?H\\]@8L\\AXH_B(L`@HP`>XT_@(P\\@HP]A(X_AX\\`AHX_A(X_@X\\^A(`_"
374         "@H`_?HX_?8\\_@I,`AY8_AI4^?9,\\>9$]@X\\^A8`_A9$`@Y0_@9<`A9@`BY8`D94`"
375         "?Y0`?)$^?X`^A)(`AY0`AY0`A9(`@X``?XP^@8L^AXT_B8\\`B),`AY0`AY(`B(``"
376         "@XT`@8P`@8X`AH``BH``B(X`A(X`@X``AHX_?I,_?Y4^BI$]C),_@9D_?I<]@H\\["
377         "AI(`@)$_?H\\]@XT`BXP`BXP`A8P`>XP`BXL_C(P`BXX`B(X`AXX`A8\\`A8\\`A(``"
378         "?8H^>XL^?8\\_A98`C)P`BIP`@ID`?)@`@Y8^B90`C),`A9$`?9(_?Y$_BXX`EHL`"
379         "?I,`>XT]?(D[@(P^@HX`?XP^?(X^?)$`@)4`AY4`BI4`BI4`B)4`AI4`A(`_@HP]"
380         "@(P\\@(P\\@HT\\@X\\^AI(`@Y0`@)(`?)$^A9$`?X`]?H\\\\B8\\`DH\\`C8\\`?Y0`=9T`"
381         "@YD^@)@^?Y8_@Y8`AI0`A9(^@)$\\?I0[@9(]B)4`BI4`B9$`B9$`B9,`A9$`>XPZ"
382         "?HX`@HX`AHT`AXT_AXT_A(X`@9$`?Y,`@I,^A9,`A(``A8P`AHL`AXP`A8H`@H@\\"
383         "?X@`>XT_?Y$`AY$`A9(`?)0`?I,_BH``@I4_A),^AY0^C)4`BY,`A(`_?8X\\>XT]"
384         "@)8`@Y@`AY@`B)8`AI$^A8T]A(P\\A8T^B)(`A)(`@H`_AHX_C(D^BHH^@H`_>I4`"
385         "A)<`@90`@)(`@X``AH``B(``A9$`A)4`?X`[@Y(]A(\\^A(P\\A8T]AH``@Y$`?H\\]"
386         "?X`^@X\\_B(``B8\\`B(X_A(X_@8\\^?H``@)$^@Y$`A8\\`AHT`AXT`B8\\`B9$`B(``"
387         "A(L`>XT]>XT]@HP_@HX^?)$^?Y(^BX\\`@9(_@Y$_A9$`AY(`B(``AHX_AHT`AH``"
388         "?Y$`@I(`AI0`AI(`AI$^A8`]A8`_AI(`AHX^A)(`@Y0`A9$`BXP`C8H`B8P`@HT`"
389         "@H\\`?8T`>XL`?XH`A(L`AHP`B(``B)(`@I,`A)(`A(`_A8`_AI$`AI(`A9,`@I,`"
390         "?X`]@Y(]AI$^BI$_B8`^AX\\_@X\\_@8X`@H`_A(``A8\\`A8T^A8T^AX\\_B(`^AY(]"
391         "AH``>X`]>8X[@HP]A(X_@)(`@)$_B8P_AI(`AI(`AY,`AI(`A(X_@XH^A(D`B8L`"
392         "A88^A(4[A(<ZA8T]AY8`A9L`@9H`?9@`A9(^A98`@9<`@),_A(X_C(X`BXP`B(D_"
393         "?(P`>HL`>8H_?8H^@XH^AHP`AX\\`AI$`@)$^@8\\]@X\\_A9$`A9$`@HX^?XT\\?(T["
394         "@Y0`A9,`AY(`B(``B(X_AHX_@XT`@8P`A(``@X\\`@XT^A(\\^A8`]AY(]AY,[AY,["
395         "AY,`?98`>I4_AI0`B90`@Y4`@)(`A(X_BH``BI(`B)0`A98`@)(`?8X\\?XL]@8L^"
396         "C(L`BHL`B8P_B9$`B98`AID`?I<`>90^C)L`A9L`?98\\=X`V?(\\YA8`_BX\\`B(H]"
397         "?8T`>X`_?)(`@9,`A9,`B),`AY(_A9(^@H`_@H`_A(``AY,`AI(`@X\\_@8\\^@H`_"
398         "A94`A9(`A(``@XT^A(L_@8L`@(L`@(L`@X\\`@HX^@HX]A9$`BI<`C9@`C)<`BI4`"
399         "AY4`?)D`>IH`A)<`B)0`@)4`?)0`@)(`C8`]B8`\\A9(^@Y8`@)<`?98`?90_?Y0`"
400         "@Y0`AI<`C)@`BY8`AI$`A(P\\@HP]@XT^AY8]@Y<\\?Y4\\?I8\\@9@`AY@`AY(_AHP]"
401         "@8\\^@)(`?Y8`@I@`AI<`B98`AY0`@Y(]A9$`AI(`AI(`AI(`AY,`B)0`BI8`BY<`"
402         "?HX`?HX`?XP^@(P\\@HX^@X\\`@X``A)$`AI(`@X\\^@H`^A90_BI<`BI<`B),`B(``"
403         "AY$`>I4`=I8_?Y$_A(X_?Y$_?)0`?Y8`D)4_BI$]A8`]@9(_?Y0`?Y8`?Y@`@)D`"
404         "?I,_@Y8`B9@`B),`A8T]@XD[A8L_B(X`@HT\\@HT\\@X\\^AI<`AIL`AI@`A)(`@HP]"
405         "A8T^@Y$`@90`@9(]A),^AY(`A9$`@8\\^@8L^A(X`A(X`@8L^@8L\\A(X_AH``A8\\`"
406         ">XL\\?(P]@(X]@Y$_AY8`AI<`A9@`A)<`AY8`A90_A90_A90_A),^@XT^@XH^A(D`"
407         "BHL`>H\\^=(\\\\@(P^B8P_A(``?Y0`?Y8`BY@`B90`AH``A(X`@HP`@(L`?HX_@9$`"
408         "AX\\]AX\\]AX\\]AX\\]A(\\^A(``A)$`A)0`BH\\`B(L`@X@_@HP`?HX_>HP\\>XL\\@(P^"
409         "B(L`AX\\`@X\\_@(X\\@XX]AX\\`A8\\`@HT`@XH^B(\\`B8``@XT`@8L\\A8T^A(P]@(@X"
410         "@)$_@I,`A98`B)H`BIP`AYL_@9@[?9,XAY8_A9<_A9<_A)4`@Y$_@8L^A(D`B8L`"
411         "CH8`?(D]=HH\\A8L_D8X`C9,`A)4`@I4`?Y0`@I(`A8\\`B(H`AH8`@H(^@H0^@X@`"
412         "BY@`BY(^CH``B9,`?Y8`?I8`A)(`B(H]@HD`>XP`@(L`C8@`C8@`?HX`?)(`AI(`"
413         "A),^?8`Z>X`\\@9(`B9$`B9$`B)<`AIT`AYH`A)H`@9<^@9(]AI,_B94`A98`?I4`"
414         "BI$]BY,`B90`A(``@(P^?8D[?XL]@8T_@I$\\A)8^A)<_?Y@^>I@\\?I<_A9,`B8\\`"
415         "@(X\\?9(^?98^?Y@`A9@`B)0`A8T^@(<[C(T`B8P_A8L]@XX]A9$`A)4`@Y8^@)8]"
416         "A)<_A)$]B(X_@X\\_>X`]?)$^A8\\`BHH^@XH`?(P_?HL]B(<^AX@^?8T^?9(_B)(`"
417         "BID`AYH`@ID`@)4`A(`_AI$^A),^?Y4\\@YH`@9H`?Y8_@),]AI,_BI4`BI8`A)4`"
418         "@)8_@Y8`A)<`@I,`@HX`A(L_B(L^BXT`BH``C)(`BY,`A9,`@)4`@)<`@I0`A(``"
419         "B9,`AY4`@Y8`@90`@Y0`A9,`@X``?8T^?8T^?8X\\?8\\]?I,`@9@`@IL`@)P`?YL`"
420         "?Y<]@)$\\A(`_@H`_>8X[?(X\\@XT^B8D]AXT_@H`_@)$_AX\\`A(\\^?Y(^@I,`BY,`"
421         "AY0^AYH`@YH`?I4^@)$\\A9(^AI$\\@X`Z?90_?)4_>I,]?)$]A)$]AY(_AI$^@H\\["
422         "@90`@90`@9,`@9$`@H\\`@X\\_AHX_B(X_B(<`BH8`BH<^AXH]A(``@)4`?Y0`?9(`"
423         "BY$`B)(`AY,`AI(`AY$`AY,`@)(`>9$`A(X_@HP]@(H[@(H[@8T]@X\\_A9$`A9$`"
424         "@Y0_A)(`B)0`AY4`?I,`?)$^@H`_A(P]AHX\\A9(^A98`AI<`A98`A)4`A90_B9$_"
425         "@8P[@8\\]?Y$_?)$^?X`^AH``BX\\`BHP^@(X]?H`^?9(_@90`A9,`AI,_@8`[?(TX"
426         "B8L]AXH]@XT^@H\\`?I,`?I4`?I<`?I<_@X@_AH<]B88]B(@\\A8T^@9(`?I,`?)(`"
427         "@8L`@8T_@8L^@XL\\A8L]AHT`@9$`>Y$`B9$`B(``AHX_A8L]AXH_B8H`B(D_B(D_"
428         "B9$`B(``BY,`B)4`@9,`?9,`?Y0`?I,`A(\\\\AY(_AY8`@YD`@9<`A90_AI$^AI$^"
429         "A(L`@(H_?HD^@(T_@H\\`A(L`AH<_BH4_C(T`B(\\`A9,`A98`AI<`A98`@I4`?I,_"
430         "BHP^AHP^@XT^@(``@)4`@9@`@)D`?IH`@98`AY,`CI(`CH``B(`^@H`^?Y(^?I,`"
431         "?8T`?(P]>X@Z?84V@80WA8@]A(X`@H\\`?90`?Y0`@I<`AI@`AY<`AY0`A9$`@XT`"
432         "C(``AXT_AX\\`@X\\`?HX_?Y$`@)<`?I<`A90_BY,`B90`?Y0`?I,_AX\\_BH``AI(`"
433         "A(T`@HD`@HD_A(X`A(\\`@8L`A8<`BH8`DHH`BHL`@XT^@H`_@Y$`@Y$`@I,`@Y4`"
434         "A9@`A)<`@9,`@)(`@(``@8\\^@XT^A(P\\?Y@`@Y8`B90`C),`AI$^@(X\\?H\\]?X`^"
435         "?H``@)(`@9,`A(``AXT_B8P_AHP^@8L^?X`^?X`^@8\\^@HX^@HX^@XT^A8T^AHX_"
436         "B9$`@XT^@8T_@8T_@(P^@X\\`A9,`@90`@Y8`C)(`BY$`?Y$_?H\\]B8P_BXX`@I(`"
437         ">X\\`@8X`AXX`AH``@Y$`?X\\`@X\\`B8X`CXH`B(H]@8L\\?XT\\@8T_@XH^@XH^A8P`"
438         "@YH`@9@`?Y0`?H`^?XP^@(H]@XD[AHD\\?Y(^@HX]AHX^B(``A8\\`?XP^?8H^?HL`"
439         "@HP_A9(`AI@`B)D`BI8`B90`A8`_@(P\\AXT`A8L]@XD[@8<Y@X<XA8DZB(P[BHX]"
440         "AY4`@9(`@9$`@X``A8P`B(X`B(``@XX]>Y(^B8\\`BHT`@(X]?HL]B(<^B(D_?(X`"
441         "=I$\\@Y8`C)<`AI,_?I$[?),^?Y0`A9,`CX\\`B(``A)(`A9(`AH``AXH_AX8_BH8`"
442         "A(\\ZA(\\\\@HX]@(X]?X\\`@9$`AI,`B)4`BI(`B8\\`BHT`BH``AI$`?X\\`>XH`>X<`"
443         "BXH`AX\\`@9(`?I$]?I$[@9(]@Y0`@Y0`?HX_@9(`A98`B)D`B9H`B)D`AID`A9@`"
444         "";
445
446 static osg::Image* make2DNoiseNormal() {
447     osg::Image* image = new osg::Image;
448     image->setImage(noiseNormalWidth, noiseNormalHeight, 1,
449                     GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE,
450                     new unsigned char[3 * noiseNormalWidth * noiseNormalHeight],
451                     osg::Image::USE_NEW_DELETE);
452
453     char* data = noiseNormalData;
454     for (unsigned int i=0; i<noiseNormalHeight; ++i) {
455         for (unsigned int j=0; j<noiseNormalWidth; ++j) {
456             GLubyte *ptr = image->data(i,j);
457             NOISE_NORMAL_PIXEL(data,ptr);
458         }
459     }
460
461     return image;
462 }
463 }